ORA-01031 尽管不是触发器

Posted

技术标签:

【中文标题】ORA-01031 尽管不是触发器【英文标题】:ORA-01031 despite insteadof trigger 【发布时间】:2014-12-01 13:56:43 【问题描述】:

我使用的是 Oracle 11.2.0.2.0:

作为用户 u1:

create table t(a int);
grant select on t to u2;

作为用户 u2:

create view v as select * from u1.t;
create trigger tr instead of update on v for each row begin null; end;
update v set a = null;

作为u2执行更新语句的结果:

Expected: 0 rows updated.
Actual:   ORA-01031: insufficient privileges

为什么 u2 会得到 ORA-01031?它不是试图更新 t 中的数据。 我的解决方法是什么?我不希望 u2 在 t 上有更新权限。

谢谢,艾尔

【问题讨论】:

Insufficient Privileges Error while creating a Instead of Trigger的可能重复 在语句解析时进行权限检查。因此,在您的情况下,触发器不会触发。只需将基表上的update 权限授予u2 用户。只有当更新语句通过安全检查时,instead of 触发器才会触发 instead of update 语句。 谢谢,但如前所述,u2 没有业务更新 u1.t 。还有其他解决方法吗? 解决什么问题?如果如您所说,并且我引用u2 has no business updating u1.t,那么您为什么要尝试更新t 表(通过视图-您仍然更新基表,即t)以用户u2 连接? View 本身只不过是一个存储的select 语句。针对该视图执行的任何DML 语句都会影响基表。 我正在尝试更新视图 v,而不是表 t。 而不是触发器的存在表明一个不一定与另一个相连。 【参考方案1】:

http://psoug.org/definition/authid.htm

请注意,对于在 VIEW 或 TRIGGER 中引用的调用者权限例程,这些对象的所有者始终被视为调用者,而不是触发它的用户。

意思是如果你使用一个触发器,那么这个过程会被 current_user authid 调用。更新触发器本身需要一个更新权限,因为它检查 user1 中表的更新。

对我来说这是一个错误,最终导致 user2 架构中视图的而不是触发器与 user1 的更新权限无关。

【讨论】:

以上是关于ORA-01031 尽管不是触发器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle RAC 其中一个节点的实例无法启动 提示ORA-01031: insufficient privileges

ORA-01031权限不足怎么解决?

ORA-01031 创建视图时

ORA-01031 新建用户创建视图提示权限不足

ORA-01031: 权限不足

ORA-01031: 权限不足