免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1601 | 回复: 0
打印 上一主题 下一主题

[原创]如何使用触发器实现数据库级守护,防止DDL操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-11-17 11:55 |只看该作者 |倒序浏览
如何使用触发器实现数据库级守护,防止DDL操作

--对于重要对象,实施DDL拒绝,防止create,drop,truncate,alter等重要操作

Last Updated: Sunday, 2004-10-31 12:06 Eygle
   
原文出处:
http://www.eygle.com/faq/Use.Trigger.To.implement.ddl.deny.htm
  

不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被drop掉的情况,这可能会给我们带来巨大的损失.

通过触发器,我们可以实现对于表等对象的数据库级守护,禁止用户drop操作.

以下是一个简单的范例,供参考:


  1. REM this script can be used to monitor a object
  2. REM deny any drop operation on it.
  3. CREATE OR REPLACE TRIGGER trg_dropdeny
  4.    BEFORE DROP ON DATABASE
  5. BEGIN
  6.    IF LOWER (ora_dict_obj_name ()) = 'test'
  7.    THEN
  8.       raise_application_error (num      =>; -20000,
  9.                                msg      =>;    '你疯了,想删除表 '
  10.                                            || ora_dict_obj_name ()
  11.                                            || ' ?!!!!!'
  12.                                            || '你完了,警察已在途中.....'
  13.                               );
  14.    END IF;
  15. END;
  16. /                                          
  17.                      
复制代码



测试效果:



  1. SQL>; connect scott/tiger
  2. Connected.
  3. SQL>; create table test as select * from dba_users;

  4. Table created.

  5. SQL>; connect / as sysdba
  6. Connected.
  7. SQL>; create or replace trigger trg_dropdeny
  8.   2     before drop on database   
  9.   3  begin
  10.   4        if lower(ora_dict_obj_name()) = 'test'        
  11.   5        then
  12.   6        raise_application_error(
  13.   7           num =>; -20000,
  14.   8           msg =>; '你疯了,想删除表 ' || ora_dict_obj_name() || ' ?!!!!!' ||'你完了,警察已在途中.....');
  15.   9        end if;
  16. 10     end;
  17. 11  /

  18. Trigger created.

  19. SQL>; connect scott/tiger
  20. Connected.
  21. SQL>; drop table test;
  22. drop table test
  23. *
  24. ERROR at line 1:
  25. ORA-00604: error occurred at recursive SQL level 1
  26. ORA-20000: 你疯了,想删除表 TEST ?!!!!!你完了,警察已在途中.....
  27. ORA-06512: at line 4
  28.                                           

复制代码



Oracle从Oracle8i开始,允许实施DDL事件trigger,可是实现对于DDL的监视及控制,以下是一个进一步的例子:


  1. create or replace trigger ddl_deny
  2. before create or alter or drop or truncate on database
  3. declare
  4.   l_errmsg varchar2(100):= 'You have no permission to this operation';
  5. begin
  6.   if ora_sysevent = 'CREATE' then
  7.      raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  8.   elsif ora_sysevent = 'ALTER' then
  9.     raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  10.   elsif ora_sysevent = 'DROP' then
  11.     raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  12.   elsif ora_sysevent = 'TRUNCATE' then
  13.     raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  14.   end if;

  15. exception
  16.   when no_data_found then
  17.     null;
  18. end;
  19. /

  20.                      
复制代码





我们看一下效果:


  1. [oracle@jumper tools]$ sqlplus "/ as sysdba"
  2. SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 31 11:38:25 2004

  3. Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


  4. Connected to:
  5. Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
  6. With the Partitioning option
  7. JServer Release 9.2.0.4.0 - Production

  8. SQL>; set echo on
  9. SQL>; @ddlt
  10. SQL>; create or replace trigger ddl_deny
  11. 2 before create or alter or drop or truncate on database
  12. 3 declare
  13. 4 l_errmsg varchar2(100):= 'You have no permission to this operation';
  14. 5 begin
  15. 6 if ora_sysevent = 'CREATE' then
  16. 7 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  17. 8 elsif ora_sysevent = 'ALTER' then
  18. 9 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  19. 10 elsif ora_sysevent = 'DROP' then
  20. 11 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  21. 12 elsif ora_sysevent = 'TRUNCATE' then
  22. 13 raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  23. 14 end if;
  24. 15
  25. 16 exception
  26. 17 when no_data_found then
  27. 18 null;
  28. 19 end;
  29. 20 /

  30. Trigger created.

  31. SQL>;
  32. SQL>;
  33. SQL>; connect scott/tiger
  34. Connected.
  35. SQL>; create table t as select * from test;
  36. create table t as select * from test
  37. *
  38. ERROR at line 1:
  39. ORA-00604: error occurred at recursive SQL level 1
  40. ORA-20001: SCOTT.T You have no permission to this operation
  41. ORA-06512: at line 5


  42. SQL>; alter table test add (id number);
  43. alter table test add (id number)
  44. *
  45. ERROR at line 1:
  46. ORA-00604: error occurred at recursive SQL level 1
  47. ORA-20001: SCOTT.TEST You have no permission to this operation
  48. ORA-06512: at line 7


  49. SQL>; drop table test;
  50. drop table test
  51. *
  52. ERROR at line 1:
  53. ORA-00604: error occurred at recursive SQL level 1
  54. ORA-20001: SCOTT.TEST You have no permission to this operation
  55. ORA-06512: at line 9


  56. SQL>; truncate table test;
  57. truncate table test
  58. *
  59. ERROR at line 1:
  60. ORA-00604: error occurred at recursive SQL level 1
  61. ORA-20001: SCOTT.TEST You have no permission to this operation
  62. ORA-06512: at line 11



复制代码
                       


我们可以看到,ddl语句都被禁止了,如果你不是禁止,可以选择把执行这些操作的用户及时间记录到另外的临时表中.以备查询.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP