〖现象(Symptom) 〗
创建触发器时,报告权限不足,具体过程如下。
Step01:system的身份登陆数据库
SQL> connect system@wm
Enter password:
Connected.
Step02:创建触发器trigger_autoadd
SQL> CREATE OR REPLACE TRIGGER trigger_autoadd
2 before insert
3 on test.autoadd
4 for each row
5 begin
6 select test.SEQ_id.nextval into :new.id from dual;
7 end;
8 /
Warning: Trigger created with compilation errors
SQL> show error
Errors for TRIGGER SYSTEM.TRIGGER_AUTOADD:
LINE/COL ERROR
-------- ------------------------------------------
2/16 PL/SQL: ORA-01031: insufficient privileges
2/4 PL/SQL: SQL Statement ignored
在表autoadd上创建触发器trigger_autoadd。
用户system有角色(role)DBA权限,而DBA已经就有CREATE ANY TRIGGER
的权限,因此,system就有create any trigger的权限。
Step03:system用户也能往表autoadd中也能插入数据库。
SQL> insert into test.autoadd
2 values(4,'sdfds','sdfsdf');
1 row inserted
Step04:序列也可以正常访问。
SQL> select test.SEQ_id.nextval from dual;
NEXTVAL
----------
205
这就非常奇怪,用户system有CREATE ANY TRIGGER的权限,system有访问触发器中所引用的对象(表)上的权限,为什么还报告“权限不足”呢?
〖原理(Cause) 〗
要想创建触发器,必须要有CREATE TRIGGER,CREATE ANY TRIGGER的权限。如:
要想使用户tt有创建触发器的权限,则执行命令:
Grant CREATE TRIGGER to tt;
要想使用户tt有在其他模式(any schema)创建触发器的权限,则执行命令:
Grant CREATE ANY TRIGGER to tt;
本例中,用户system已经有了CREATE ANY TRIGGER和访问任何对象的权限。那么,用户System自然也有访问序列(sequence)seq_id的权限,但是这个权限是从角色(role)DBA继承而来的权限。创建触发器(trigger)时,ORACLE有一个限制,触发器(trigger)的拥有者必须被显示(explicitly)授予访问触发器(trigger)中涉及到的对象的权限(也就是说这些权限不能由角色继承而来)。
〖方法(Action) 〗
Step01:显示(explicitly)授予触发器的拥有者(system)访问序列(sequence)seq_id的权限。
SQL> grant select on test.seq_id to system;
Grant succeeded.
Step02:再次执行创建触发器trigger_autoadd3的脚本。
SQL> CREATE OR REPLACE TRIGGER trigger_autoadd3
2 before insert
3 on test.autoadd
4 for each row
5 begin
6 select test.SEQ_id.nextval into :new.id from dual;
7 end;
8 /
Trigger created
触发器创建成功。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/13804621/viewspace-351814/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/13804621/viewspace-351814/