出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制DDL语句的发生。Oracle也提高了很多方法来实现这个功能,这个简单介绍一下。
这篇介绍利用触发器来限制DDL语句。
利用触发器来限制DDL,可能是最容易想到的功能。利用Oracle的DDL触发器,在DDL语句执行之前RAISE_APPLICATION_ERROR,可以有效的限制DDL语句。
下面这个例子就可以禁止数据库中的CREATE语句:
create or replace trigger tri_restrict_create
before create on database
begin
raise_application_error(-20001, 'Restrict CREATE statement!');
end;
/
触发器已创建
SQL> create synonym my_dual for dual;
create synonym my_dual for dual
*
RT xL_14156第1行出现错误:ITPUB个人空间,x-iy@2T"o
ORA-00604:递归SQL级别1出现错误ITPUB个人空间/K/n CJ Y-YHZJ
ORA-20001: Restrict CREATE statement!
/$yP0EY VX^y(w14156ORA-06512:在line 2
ITPUB个人空间@jI}ZJ/
SQL> create table test (id number);ITPUB个人空间a p!e @'s/S2I5T
create table test (id number)ITPUB个人空间6x$zs(Qs-r%Y
*
,| ][ U UN14156第1行出现错误:ITPUB个人空间D+^!z(y_6N,k:U
ORA-00604:递归SQL级别1出现错误ITPUB个人空间-i;}.Ry ?'|(h(|
ORA-20001: Restrict CREATE statement!
9j@;@O&D;t14156ORA-06512:在line 2
ITPUB个人空间![ h1y Y W!L7RrH
SQL> drop trigger tri_restrict_create;
触发器已删除。
而下面的例子,则禁止了TEST用户的任何DDL操作:
SQL> conn test/test
5H%a^*OW%l kY14156已连接。
create or replace trigger tri_restrict_test_ddl
before ddl on begin
raise_application_error(-20001, 'Restric DDL!');M6N(k2nl @,g7d
end;
触发器已创建
SQL> create table test (id number);
;X?@1u#i14156create table test (id number)
:L.S.Z@E.m)UQfc2J14156*
!^ yw${ E I1Xv14156第1行出现错误:ITPUB个人空间 B[!hR w1n
ORA-00604:递归SQL级别1出现错误ITPUB个人空间 Iw9/2` Z$j
ORA-20001: Restric DDL!
(M7L8s /t7^14156ORA-06512:在line 2
4o/}LQ:m$W6d7R Uss14156SQL> alter table t add fid number;
d(w-|K*L+m+S/`j `14156alter table t add fid numberITPUB个人空间9v-t A%{2U.N2H'|$[
*ITPUB个人空间 P$?A({/
第1行出现错误:
Z!rsr L4@14156ORA-00604:递归SQL级别1出现错误ITPUB个人空间p { ?.Mz#Uv
ORA-20001: Restric DDL!ITPUB个人空间,^ v$S$x U)b L
ORA-06512:在line 2
ITPUB个人空间'F.Pi/@4xa
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,使用触发器的方式也比较困难。
来自:http://space.itpub.net/4227/viewspace-557966