限制DDL操作(一)

 出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值