一个ORACLE的DDL触发器例子

转载 2012年03月22日 17:23:05

一个ORACLE的DDL触发器例子

有时我们需要控制用户对表执行DDL操作,包括truncate等操作。为了达到灵活控制的目的,我们使用了DDL trigger。由于我们的系统每5分钟会检查alert log错误信息并短信报警,这样我采取了写alert log的方式来记录不明DDL操作。

下面这个trigger限制非服务器本机进行的DDL操作,由于应用的要求,我们允许非服务器本地登陆用户对snapshot log和以log结尾的表进行操作。

为了实现目标我们需要给用户授予相关权限

conn / as sysdba
grant select on v_$session to alibaba;
grant execute on dbms_system to alibaba;

CREATE or replace TRIGGER db_ddl_trigger
before ddl on alibaba.schema
declare
n number;
str_stmt varchar2(4000);
sql_text ora_name_list_t;
l_trace number;
str_session v$session%rowtype;
BEGIN
select count(*) into l_trace from dual
where ora_dict_obj_name not like 'MLOG%'
and ora_dict_obj_name not like '%LOG'
and utl_inaddr.GET_HOST_ADDRESS is not null
and sys_context('userenv','ip_address') is not null
and sys_context('userenv','ip_address') <> utl_inaddr.GET_HOST_ADDRESS;

if l_trace > 0 then

n := ora_sql_txt(sql_text);

for i in 1..n loop
str_stmt := substr(str_stmt || sql_text(i),1,3000);
end loop;

select * into str_session
from v$session where audsid = userenv('sessionid');
sys.dbms_system.ksdwrt(2,to_char(sysdate,'yyyymmdd hh24:mi:ss')||' ORA-20001 user: '||user||' program: '||
str_session.program||' IP: '|| sys_context('userenv','ip_address')||' object: '||ora_dict_obj_name||'DDL: '||str_stmt );

raise_application_error(-20001,'You can not execute ddl on this object except on the local machine');
end if;
END;

我在非本机sqlplus中登陆尝试truncate table ,返回自己定义错误信息,并在alert log中写入一行记录

20041117 18:45:50 ORA-20001 user: ALIBABA program: sqlplus.exe IP: 10.0.78.80 object: T DDL: truncate table t

总结:

数据库范围内的DDL触发器作为对象是存储在创建它们的数据库中的,服务器范围内的DDL触发器作为对象是存储在master数据库中的;DDL触发器又是与激发它们的语句运行在相同的事务中的,所以DDL事件执行后,就可以从触发器中回滚此事务,所以就会触发了

http://danielzzu.blog.163.com/blog/static/1185153042011101373913384/

学习oracle里面触发器的功能作用,举一个例子来说明:

触发器

Oracle使用触发器禁止远程DDL操作

SQL> grant select on v_$session to zhongwc; Grant succeeded. SQL> grant execute on dbms_system to ...

oracle 系统的ddl触发器研究

可以使用两种方式来禁用掉某些schema下面的ddl操作 1、语句数据库级别的: CREATE OR REPLACE TRIGGER &trigger_name    BEFORE CREATE...

VBA从ORACLE生成DDL例子

  • 2010年10月25日 22:27
  • 396KB
  • 下载

Oracle触发器3-DDL触发器

DDL触发器,当执行DDL语句时会被触发。按照作用范围,分为schema triggers,database triggers。schema triggers作用在一个用户上,database tri...

Oracle基础知识(六) - 触发器的分类:DDL触发器

1. 什么是DDL触发器 当执行DDL语句时会被触发。 2. 分类 按照作用范围,分为schema triggers,database triggers。schema triggers作用在一个...

利用Oracle DDL触发器实现DDL监控

前言创建此触发器的主要目的是为了控制数据库的版本,虽然会将DDL语句保留但难免会出现遗漏,所以创建DDl触发器记录DDL操作,主要是用来核对数据库变更的SQL语句创建用户并授权...

Oracle创建触发器详解及例子

触发器详解 1。触发器与触发该触发器的SQL语句同属于一个事务,触发器不允许发出任何事务控制语句,如 commit、rollback、savepoint或者set transaction,它只能随着...

关于oracle触发器的两个小例子

今天接到一个任务,需要修改触发器,因为好久都没有看过关于oracle触发器的东东了,所以这里通过两个简单的小例子复习下触发器,以备忘。 1. 案例一 需求:建立触发器,判断员工工资,如果小于0,则改为...
  • zdp072
  • zdp072
  • 2015年01月30日 16:25
  • 807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个ORACLE的DDL触发器例子
举报原因:
原因补充:

(最多只允许输入30个字)