5)在任何方案上的DDL语句
2、触发条件(可选)CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name PL/SQL block;如上所示,trigger_name用于指定触发器名;timing用于指定触发时机(BEFORE或AFTER);event角于指定触发事件(INSERT,UPDATE和DELETE);table_name用于指定DML操作所对应的表名。
CREATE OR REPLACE TRIGGER tr_sec_emp BEFORE INSERT OR UPDATE OR DELETE ON emp BEGIN IF to_char(SYSDATE,‘D‘) IN (1,7) THEN RAISE_APPLICATION_ERROR(-20001,‘不能在休息日改变雇员信息‘); END IF; END;2、使用条件谓词
CREATE OR REPLACE TRIGGER tr_sec_emp BEFORE INSERT OR UPDATE OR DELETE ON emp BEGIN IF to_char(SYSDATE,‘D‘) IN (1,7) THEN CASE WHEN INSERTING THEN RAISE_APPLICATION_ERROR(-20001,‘不能在休息日增加雇员‘); WHEN DELETING THEN RAISE_APPLICATION_ERROR(-20002,‘不能在休息日解雇雇员‘); WHEN UPDATING THEN RAISE_APPLICATION_ERROR(-20003,‘不能在休息日更新雇员‘); END CASE; END IF; END;3、建立AFTER语句触发器
CREATE TABLE tbl_audit( NAME VARCHAR2(20), ins INTEGER, upd INTEGER, del INTEGER, starttime DATE, endtime DATE );为了审计在EMP表上DML操作执行的次数、最早执行时间和最近执行时间,需要建立AFTER语句触发器。示例如下:
CREATE OR REPLACE TRIGGER tr_audit_emp AFTER INSERT OR DELETE OR UPDATE ON emp DECLARE v_temp INTEGER; BEGIN SELECT COUNT(*) INTO v_temp FROM tbl_audit WHERE NAME=‘EMP‘; IF v_temp = 0 THEN INSERT INTO tbl_audit(NAME,ins,upd,del,starttime) VALUES (‘EMP‘,0,0,0,SYSDATE); END IF; CASE WHEN INSERTING THEN UPDATE tbl_audit SET ins = ins + 1,endtime = SYSDATE WHERE NAME = ‘EMP‘; WHEN DELETING THEN UPDATE tbl_audit SET del = del + 1,endtime = SYSDATE WHERE NAME = ‘EMP‘; WHEN UPDATING THEN UPDATE tbl_audit SET upd = upd + 1,endtime = SYSDATE WHERE NAME = ‘EMP‘; END CASE; END;测试:
UPDATE emp SET sal = 888 WHERE empno = 7788; UPDATE emp SET sal = 999 WHERE empno = 1111; SELECT * FROM tbl_audit;
PL/SQL_触发器(触发器简介),布布扣,bubuko.com
原文:http://blog.csdn.net/com185272358/article/details/22097243