【发布时间】:2023-03-16 04:30:02
【问题描述】:
我使用的是 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 上有更新权限。
谢谢,艾尔
【问题讨论】:
-
在语句解析时进行权限检查。因此,在您的情况下,触发器不会触发。只需将基表上的
update权限授予u2用户。只有当更新语句通过安全检查时,instead of 触发器才会触发 instead ofupdate语句。 -
谢谢,但如前所述,u2 没有业务更新 u1.t 。还有其他解决方法吗?
-
解决什么问题?如果如您所说,并且我引用
u2 has no business updating u1.t,那么您为什么要尝试更新t表(通过视图-您仍然更新基表,即t)以用户u2连接? View 本身只不过是一个存储的select语句。针对该视图执行的任何DML语句都会影响基表。 -
我正在尝试更新视图 v,而不是表 t。 而不是触发器的存在表明一个不一定与另一个相连。
标签: oracle view triggers privileges