Orcal创建触发器

在工作,发现公共的一张表某个字段的数据一直被删除。但是系统庞大,短时间难以定位是哪里删除了这些数据。因此萌生了创建一个触发器【审计开销太大】,记录删除这张表的操作。遗憾的是Orcal 11无法使用ora_sql_txt记录操作的SQL语句。

一、触发器语法

-- 创建触发器
create or replace trigger 触发器名
  before|after|instead of 触发时间
  on 触发对象 表|视图 (for each row)
  begin
    触发操作
  end;

参考

 

 

二、实例

--1.创建删除记录表 监控用户删除某个表的操作
--drop table ZT_DELETETABLEINFO;
create table ZT_DELETETABLEINFO
(
  operatoruser      VARCHAR2(20),
  machine      VARCHAR2(32),
  ip      VARCHAR2(32),
  operatortime   DATE,
  dmlsql    VARCHAR2(4000),
  tablename     VARCHAR2(256)
);
comment on table ZT_DELETETABLEINFO is '删除记录表';
comment on column ZT_DELETETABLEINFO.operatoruser is '操作用户';
comment on column ZT_DELETETABLEINFO.operatoruser is '机器';
comment on column ZT_DELETETABLEINFO.ip is '操作IP';
comment on column ZT_DELETETABLEINFO.operatortime  is '操作时间';
comment on column ZT_DELETETABLEINFO.dmlsql is '执行的SQL语句';
comment on column ZT_DELETETABLEINFO.tablename is '被删除的表';

--2.创建触发器 监控 删除表记录
--drop trigger ZT_DELETETABLEINFO_TRIGGER

drop trigger ZT_DELETETABLEINFO_TRIGGER;
create trigger ZT_DELETETABLEINFO_TRIGGER
  before delete on tablename
  for each row
  begin
    IF :old.cloumn= 'cloumn' THEN --这里加过滤条件
      insert into ZT_DELETETABLEINFO
      (operatoruser, machine, ip, operatortime, dmlsql,tablename)
    values
      (user,SYS_CONTEXT('USERENV', 'HOST'),sys_context('userenv', 'ip_address'),sysdate,'','tablename');
    END IF;
  end;

 

 

-- 1.查询当前登录用户
select user,ora_login_user from dual;
-- 2.查询当前登录IP
select SYS_CONTEXT('USERENV', 'IP_ADDRESS') as clientip from dual;
-- 3.查询登录机器
select SYS_CONTEXT('USERENV', 'HOST') as clientname  from dual;

 

posted @ 2020-12-25 14:58  别动我的猫  阅读(184)  评论(0编辑  收藏  举报