出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制DDL语句的发生。Oracle也提高了很多方法来实现这个功能,这个简单介绍一下。
这篇介绍利用触发器来限制DDL语句。
利用触发器来限制DDL,可能是最容易想到的功能。利用Oracle的DDL触发器,在DDL语句执行之前RAISE_APPLICATION_ERROR,可以有效的限制DDL语句。
下面这个例子就可以禁止数据库中的CREATE语句:
SQL> create or replace trigger tri_restrict_create
2 before create on database
3 begin
4 raise_application_error(-20001, 'Restrict CREATE statement!');
5 end;
6 /
触发器已创建
SQL> create synonym my_dual for dual;
create synonym my_dual for dual
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20001: Restrict CREATE statement!
ORA-06512: 在 line 2
SQL> create table test (id number);
create table test (id number)
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20001: Restrict CREATE statement!
ORA-06512: 在 line 2
SQL> drop trigger tri_restrict_create;
触发器已删除。
而下面的例子,则禁止了TEST用户的任何DDL操作:
SQL> conn test/test
已连接。
SQL> create or replace trigger tri_restrict_test_ddl
2 before ddl on schema
3 begin
4 raise_application_error(-20001, 'Restric DDL!');
5 end;
6 /
触发器已创建
SQL> create table test (id number);
create table test (id number)
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20001: Restric DDL!
ORA-06512: 在 line 2
SQL> alter table t add fid number;
alter table t add fid number
*
第 1 行出现错误:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-20001: Restric DDL!
ORA-06512: 在 line 2
SQL> alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
会话已更改。
SQL> drop trigger tri_restrict_test_ddl;
触发器已删除。
使用BEFORE DDL会对所有的DDL语句都生效,像上面的这个触发器,就禁止了TEST用户的一切DDL语句。
注意alter session和alter system不属于DDL语句,因此不会受这个触发器影响。
需要注意,虽然这个触发器可以禁止任何DDL语句,但是并不禁止删除当前的触发器,这是Oracle为了避免用户创建了这个触发器后,无法自己删除触发器,从而导致用户不可用。
使用DDL触发器来限制DDL语句的好处是思路简单,编写PL/SQL代码也不算很复杂,而且相对比较灵活,可以在触发器内对时间、登陆IP、用户等一系列安全条件进行判断,而后确定用户是否可以执行。
不过触发器也有一定的缺点,比如需要用户自己编写、维护以及验证触发器的代码,而且对于DDL的粒度控制也存在问题,比如数据库中只希望禁止ALTER TABLE,而其他对象的ALTER并不禁止,使用触发器就很难实现。而且如果希望禁止具体某个对象的DDL,使用触发器的方式也比较困难。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-557966/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-557966/