`
wsql
  • 浏览: 11713672 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

如何使用触发器实现数据库级守护,防止DDL操作

阅读更多
<!--DWLayoutTable-->
<!--DWLayoutTable--><!--DWLayoutTable--><!--DWLayoutTable--> <!--DWLayoutTable-->
<!--DWLayoutEmptyCell-->


如何使用触发器实现数据库级守护,防止DDL操作

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

Last Updated: <!-- #BeginDate format:wfcIS1m -->Sunday, 2004-10-31 12:06<!-- #EndDate --> Eygle

<!--DWLayoutEmptyCell-->

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

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

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

REM this script can be used to monitor a object
REM deny any drop operation on it.
CREATE OR REPLACE TRIGGER trg_dropdeny
   BEFORE DROP ON DATABASE
BEGIN
   IF LOWER (ora_dict_obj_name ()) = 'test'
   THEN
      raise_application_error (num      => -20000,
                               msg      =>    '你疯了,想删除表 '
                                           || ora_dict_obj_name ()
                                           || ' ?!!!!!'
                                           || '你完了,警察已在途中.....'
                              );
   END IF;
END;
/					  
                      

测试效果:

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

Table created.

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

Trigger created.

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

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

create or replace trigger ddl_deny
before create or alter or drop or truncate on database
declare
  l_errmsg varchar2(100):= 'You have no permission to this operation';
begin
  if ora_sysevent = 'CREATE' then
     raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'ALTER' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'DROP' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  elsif ora_sysevent = 'TRUNCATE' then
    raise_application_error(-20001, ora_dict_obj_owner || '.' || ora_dict_obj_name || ' ' || l_errmsg);
  end if;

exception
  when no_data_found then
    null;
end;
/

                      

我们看一下效果:


[oracle@jumper tools]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 31 11:38:25 2004

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

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning option
JServer Release 9.2.0.4.0 - Production

SQL> set echo on
SQL> @ddlt
SQL> 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
16 exception
17 when no_data_found then
18 null;
19 end;
20 /

Trigger created.

SQL>
SQL>
SQL> connect scott/tiger
Connected.
SQL> create table t as select * from test;
create table t as select * from test
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: SCOTT.T You have no permission to this operation
ORA-06512: at line 5

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

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

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

                        

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

本文作者:
eygle,Oracle技术关注者,来自中国最大的Oracle技术论坛itpub.
www.eygle.com是作者的个人站点.你可通过Guoqiang.Gai@gmail.com来联系作者.欢迎技术探讨交流以及链接交换.


原文出处:

http://www.eygle.com/faq/Use.Trigger.To.implement.ddl.deny.htm


如欲转载,请注明作者与出处.并请保留本文的连接.

回首页

分享到:
评论

相关推荐

    Oracle中通过触发器来追踪用户的活动

    这些系统级别的触发器包括数据库启动触发器,DDL触发器和最终用户登陆/注销触发器。当Oracle提供了这些新的触发器的功能后,却还不清楚该如何使用这些触发器来追 踪系统的使用情况。这篇文章描述了我是如何使用创建...

    Oracle中通过触发器监视系统使用情况

    从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,...刚开始实行的追踪终端用户系统级触发器是非常新的, 就因为它非常的新,所以它在功能上还是不够完善。

    数据库文档生成器,根据数据库表DDL生成markdown和word文档.zip

    数据库文档生成器,根据数据库表DDL生成markdown和word文档.zip

    第9章 触发器.ppt

    重点之中点 9.1 触发器的种类和触发事件 9.2 DML触发器 9.3 数据库事件触发器 9.4 DDL事件触发器 9.5 替代触发器 9.6 查看触发器

    oracle安全审计之登录登出、ddl操作记录触发器

    oracle的登录、登出触发器(时间、来访ip、用户信息、sid等等),ddl操作记录触发器(含create、drop、alter、truncate等),都属于事后触发,不影响业务操作

    软件测试Mysql数据库(二)DDL操作

    MySQL数据库全套视频,带你了解MySQL数据库

    sqlserver 触发器学习(实现自动编号)

    DML触发器:在用户对数据库执行数据操作时发生,触发器中的代码会被自动调用。 2、DML触发器分类:Insert触发器、Delete触发器、Update触发器、上面任意类型混合。 3、触发器创建语法: 代码如下: CREATE TRIGGER ...

    一个DDL触发器例子(阻止DDL并记警告日志)

    有时我们需要控制用户对表执行DDL操作,包括truncate等操作。为了达到灵活控制的目的,我们使用了DDL trigger

    oracle 触发器 必懂

    第 9 章 触发器 9.1 触发器的种类和触发事件 9.2 DML 触发器 9.3 数据库事件触发器 9.4 DDL事件触发器 9.5 替代触发器 9.6 查看触发器 9.7 阶段训练 9.8 练习

    西南交大数据库设计实验,DDL+DML+DCL报告

    3、编写DDL语句完成数据库对象的创建(各自在自己的机器上完成) (1)创建数据库 ,写出DDL语句; (2)创建各关系,写出DDL语句,每个关系必须标注主键,至少为4张关系中的列设计Check检查约束,关系用自己的学号+...

    从Access数据库建立DDL语句

    利用该软件,能输出Access数据库表的DDL语句

    Java操作ddl使用jacob

    java操作ddl文件的开源项目

    sql 触发器 详解与实例

    触发器对表进行插入、更新、删除的时候会自动执行的特殊...SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

    Oraclet中的触发器

    数据库级触发器在任何事件都激活触发器,即触发对象为整个数据库中所有用户产生的每个指定事件;而模式触发器只有在指定的模式所产生的的触发事件发生时才触发,默认时为当前用户模式。 系统触发器事件属性 事件...

    从excel模版生成数据库表DDL

    想找个从设计文档直接生成DDL的工具,发现这里太少了,所以找了一个上传。 功能比较强大,支持的数据库有: DB2 MariaDB MySQL Oracle PostgreSQL SQL Server SQLite 功能有: Create Tables SQL Drop Tables SQL ...

    DB2数据库SQL语法(DDL,DML以及插入优化)

    DB2数据库SQL语法(DDL,DML以及插入优化)总结,需要自己下载

    数据库触发器

    这是一个详细描述数据库触发器的文档,主要包括DML触发器和DDL触发器,并且该文档内还包括了大量的举例以便读者理解。

    SQLServer2008数据库基础入门教程含思考题练习题 第11章 存储过程 触发器和函数 共62页.ppt

    触发器是一种特殊类型的存储过程,可以实现自动化的操作。用户定义函数是由用户根据应用程序的需要而定义的可以完成特定操作的函数。 本章将全面研究存储过程、触发器、用户定义函数等特点和使用方式。 【要点】 ...

    mysql数据库分组统计数据库 练习脚本DDL goods.sql

    mysql数据库分组统计数据库 练习脚本 DDL

    MySQL数据库基础(3)DDL和DML

    一、使用DDL定义数据库和表结构 结构化查询语言:(Structured Query Language,SQL)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,专用于存取数据以及查询、更新和管理关系数据库系统,同时也是...

Global site tag (gtag.js) - Google Analytics