限制DDL操作(一)

出于安全性或避免影响性能的考虑,在产品数据库中有时候会禁止或者在一定时间段内限制DDL语句的发生。Oracle也提高了很多方法来实现这个功能,这个简单介绍一下。

这篇介绍利用触发器来限制DDL语句。

 

 

利用触发器来限制DDL,可能是最容易想到的功能。利用OracleDDL触发器,在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 sessionalter 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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值