Oracle触发器

触发器是附加在数据库对象上的一段代码,它指定了触发的时机和事件。
自动触发(指定触发的事件,增,删,改,登录,登出,重启,关闭)可以在某个事件前,后触发(还有一个替代)指定在什么对象上建触发器触发器执行的力度是语句级的还是行级(DML)DDL没有,系统级的也没有行级触发器比较隐蔽,发生问题不好定问,可以考虑是否用存储过程或其它技术来替代。
根据触发器作用的对象分为三种:1.DML触发器;2.替代触发器;3.系统触发器。

DML触发器

DML触发器有语句级和行级两种

语句级触发器

建一个日志表,给emp表创建一个语句级DML触发器,操作数据时在日志表中建日志

CREATE OR REPLACE TRIGGER trg_emp1
BEFORE INSERT OR UPDATE OR DELETE
ON emp
DECLARE
v_event VARCHAR(10);
BEGIN
  IF inserting THEN
    v_event:='insert';
  ELSIF updating THEN
    v_event:='update';
  ELSE
    v_event:='delete';
  END IF;
  INSERT INTO t_log VALUES(seq1.nextval,USER,SYSDATE,v_event||' on emp ');
END;
INSERT INTO emp(empno) VALUES(1);
INSERT INTO emp(empno) VALUES(2);
DELETE FROM emp WHERE empno IN(1,2);
COMMIT;

行级触发器

给emp表中增加一条记录,查看emp2表,发现成功插入新记录。
再来看一下更新操作的触发器,在上述触发trg_emp2的基础之上进行修改,增加修改和删除的处理。对emp表做更新和删除操作,观察emp2表的数据变化.

-- 创建新表,同原表数据填充
CREATE TABLE emp2 AS SELECT * FROM emp;
--创建新表,只要原表的结构
CREATE TABLE emp3 AS SELECT * FROM emp WHERE 1=2;
CREATE OR REPLACE TRIGGER trg_emp2
BEFORE INSERT OR UPDATE OR DELETE
ON emp
FOR EACH ROW -- 行级
DECLARE
BEGIN
  IF inserting THEN
    INSERT INTO emp2(empno,ename) VALUES (:new.empno,:new.ename);
  ELSIF updating THEN
    UPDATE emp2 SET ename=:new.ename WHERE empno=:old.empno;
  ELSE
    DELETE FROM emp2 WHERE empno=:old.empno;
  END IF;
END;

替代触发器

替代视图完成表数据的维护
instead of和before、after是三选一,所以替代触发器没有before和after选项。

CREATE OR REPLACE VIEW v_emp AS SELECT empno,sal+comm sal FROM emp;
SELECT * FROM v_emp;
INSERT INTO v_emp(empno,sal) VALUES(3,100);
CREATE OR REPLACE TRIGGER trg_vemp
INSTEAD OF INSERT ON v_emp
FOR EACH ROW
  DECLARE
  BEGIN
    INSERT INTO emp(empno,sal,comm) VALUES(:new.empno,:new.sal,0);
  END;

系统触发器(DDL)

在scott用户下操作数据库对象时可以记录操作日志。

CREATE OR REPLACE TRIGGER trg_dd1
AFTER DDL ON scott.schema
DECLARE
BEGIN
  INSERT INTO t_log(ID,Log_User,log_date,log_text)
  VALUES(seq1.nextval,USER,SYSDATE,ora_sysevent||'-'||
  ora_dict_obj_name||'-'||ora_dict_obj_type);
END;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle触发器是一种在数据库定义的特殊类型的存储过程,它在指定的数据库事件发生时自动执行。在Oracle11g和Oracle12c,可以定义和使用多种类型的触发器。其包括简单DML触发器(如BEFORE、AFTER和INSERT OF触发器)、组合触发器和非DML触发器(如DDL事件触发器数据库事件触发器)[1]。 触发器的作用是在特定的数据库事件发生时执行一系列的操作,例如在插入、更新或删除数据时触发某些逻辑。触发器可以用于实现数据完整性约束、审计跟踪、数据变更记录等功能[1]。 创建触发器的语法如下: CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE | {INSERT | UPDATE | DELETE}} ON table_name [FOR EACH ROW] [WHEN (condition)] [DECLARE] -- 声明变量和常量 BEGIN -- 触发器的逻辑代码 END; 触发器可以根据需要定义在表级别或行级别,并可以使用条件谓词来区分不同的触发事件。例如,INSERTING条件谓词在INSERT事件发生时为TRUE,UPDATING条件谓词在UPDATE事件发生时为TRUE,DELETING条件谓词在DELETE事件发生时为TRUE[3]。 总结起来,Oracle触发器是一种在数据库定义的特殊类型的存储过程,可以在特定的数据库事件发生时自动执行一系列的操作。在Oracle11g和Oracle12c,可以定义和使用多种类型的触发器,包括简单DML触发器、组合触发器和非DML触发器触发器可以用于实现数据完整性约束、审计跟踪、数据变更记录等功能[1][2][3]。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值