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