`

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

 
阅读更多
http://www.eygle.com/archives/2004/12/use_trigger_to_implement_ddl_deny.html

不管是有意还是无意的,你可能会遇到数据库中重要的数据表等对象被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语句都被禁止了,如果你不是禁止,可以选择把执行这些操作的用户及时间记录到另外的临时表中.以备查询.
分享到:
评论

相关推荐

    Oracle11g 数据库中文 文档

    这款数据库系统广泛应用于企业级数据存储和处理,支持复杂的事务处理、数据仓库以及互联网应用。中文文档的提供对于中国用户来说非常友好,能够帮助读者更好地理解和操作Oracle 11g。 文档通常会包含以下几个核心...

    ORACLE数据库知识、操作方法。安装ORACLE

    - **高可用性**:了解RAC(Real Application Clusters)和数据守护等技术,实现数据库的高可用性和故障切换。 - **数据库设计**:学习如何进行规范化设计,减少数据冗余和异常,提高数据一致性。 以上只是Oracle...

    语言程序设计资料:MySQL数据库3.ppt

    2. **SQL支持**:MySQL实现了SQL标准,使得数据库操作简单且灵活。 3. **高性能**:MySQL设计的目标是快速响应,即使处理大量数据也能保持高效。 4. **易用性**:MySQL的安装和使用相对简单,适合各种规模的应用场景...

    oracle 实验报告

    这可能涉及到用户权限的精细控制,使用角色和权限分离原则,以及实施数据库复制、数据守护或Real Application Clusters (RAC)来实现故障切换和负载均衡。 总的来说,这份Oracle实验报告可能详细记录了上述各方面的...

    Oracle_Database_9i10g11g编程艺术深入数据库体系结构

    了解SQL的DML(数据操纵语言)、DDL(数据定义语言)和DCL(数据控制语言)对于数据库操作至关重要。 3. **表空间与数据文件**:在Oracle中,数据存储在表空间中,表空间由一个或多个数据文件组成。通过管理表空间...

    oracle学习教案

    Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其在企业级数据存储、管理和处理方面具有卓越性能。"Oracle学习教案"旨在为初学者提供全面、深入的Oracle知识体系,帮助他们从零开始掌握这一强大的数据库...

    Oracle讲义.rar

    3. **PL/SQL编程**:Oracle特有的PL/SQL是一种过程化语言,用于编写存储过程、函数、触发器等数据库级程序。学员会学习变量声明、流程控制、异常处理、游标、包等PL/SQL特性。 4. **数据库设计**:良好的数据库设计...

    东方标准Oracle内部教程

    Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据主导地位。"东方标准Oracle内部教程"无疑是一份极具价值的学习资料,旨在帮助读者深入理解Oracle的核心概念、功能以及最佳实践。本教程可能...

    Oracle11g从入门到精通

    Oracle数据库是关系型数据库管理系统(RDBMS)的代表,其强大的数据处理能力和安全性使其在企业级应用中占据主导地位。Oracle11g引入了许多新特性,如自动存储管理(ASM)、实时应用集群(RAC)、数据守护(Data ...

    Oracle Database 11g初学者指南

    Oracle Database 11g是Oracle公司推出的一款关系型数据库管理系统,是企业级数据管理的首选平台,广泛应用于各种规模的企业和组织。对于初学者来说,理解并掌握Oracle Database 11g的基础知识至关重要,这将为未来在...

    OCP 053最新题库

    6. **SQL 和 PL/SQL**:深入理解 SQL 语言,包括 DDL、DML、DDL 和 DCL 操作,以及 PL/SQL 存储过程、函数、触发器等高级特性。 在提供的压缩包文件中,`053新题01.pdf` 和 `053新题02.pdf` 可能包含了这些主题的...

    Oracle大学课件Oracle大学课件

    Oracle大学的课件主要涵盖了数据库管理、SQL语言、数据库设计、性能优化以及系统管理等多个方面的内容,这些都是构建和维护高效企业级数据库所必备的知识。Oracle数据库是全球最广泛使用的数据库管理系统之一,尤其...

    oracle课件ppt

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,由美国甲骨文公司(Oracle Corporation)开发和维护。本课件旨在帮助学习者深入理解Oracle的核心概念和技术,以提升数据库管理、开发和优化的能力。 ...

    OCP题库!!!!!!!!!!!!!!!

    - **审计**:实现数据库级别的审计,跟踪敏感操作。 - **网络安全**:理解监听器、TNS(透明网络寻址)配置,以及防火墙设置。 5. **高可用性**: - **RAC(实时应用集群)**:了解 RAC 的架构,如何配置和管理 ...

    达梦8帮助手册.zip

    5. **DM8数据守护与读写分离集群V4.0.pdf**:这部分内容专注于数据库高可用性和负载均衡,讲述了如何设置数据守护以保证服务不间断,以及实现读写分离来提升系统性能。 6. **DM8系统包使用手册.pdf**:讲解了DM8...

    Oracle培训资源

    6. 触发器和存储过程:触发器是预定义的数据库事件响应程序,可以在特定操作发生时自动执行。存储过程是一组预编译的SQL语句,可以封装复杂的业务逻辑,提高代码复用和执行效率。 7. 安全性:Oracle提供了用户、...

    oracle学习基础

    Oracle是一款广泛应用的关系型数据库管理系统,尤其在企业级数据存储和处理中占据重要地位。以下将详细介绍Oracle学习的一些关键知识点: 1. **Oracle概述**:Oracle是由甲骨文公司开发的数据库管理系统,支持多种...

    清华大学ORACLE培训资料

    Oracle数据库是全球最广泛使用的商业关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。清华大学作为国内顶级学府,其Oracle培训资料无疑涵盖了这个领域的核心知识和实践经验。以下将详细介绍这些资料...

    Oracle精髓(第四版)pdf

    最后,书中还讨论了一些高级特性,如实时应用集群(RAC)、数据守护(DG)、Exadata硬件优化等,这些内容对于大型企业级数据库的高可用性和扩展性具有重要意义。 总的来说,《Oracle精髓(第四版)》是一部全面且深入的...

Global site tag (gtag.js) - Google Analytics