1.触发器代码的大小不能超过32K,如果确实要在触发器中使用大量的代码,应该先建立存储过程,然后再触发器中使用CALL语句调用存储过程。
2.触发器只能使用SELECT,INSERT,UPDATE,DELETE不能包含CREATE,ALERT,DROP和COMMIT,ROLLBACK,SAVEPOINT。
3.一个表上多个触发器的执行顺序:BEFORE语句级触发器-(BEFORE行触发器-AFTER行触发器)-AFTER语句触发器。括号中的可循环。
4.语句级触发器样例:
--语句级触发器,多用途。
CREATE OR REPLACE TRIGGER EMP_TRI
BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP
DECLARE
BEGIN
CASE
WHEN INSERTING THEN --表示是插入
--CONTENTS1;
WHEN UPDATING THEN --表示是更新
--CONTENTS2;
WHEN DELETING THEN --表示是删除
--CONTENTS3;
END CASE;
END;
5.行触发器
--行触发器,每一行都执行该触发器一次。
CREATE OR REPLACE TRIGGER EMP_TRI
BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW --不同点一
DECLARE
BEGIN
:NEW.字(:OLD.字段) := 值1; --不同点二
END;
6.在给这张表做操作时,触发器代码不能从触发器所对应的基表中读取数据。例子:
--下边的触发器,可以成功编译,但是在触发的时候会有问题。其实这是一个死循环。
CREATE OR REPLACE TRIGGER EMP_TRI
BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW
DECLARE
V VARCHAR2(10);
BEGIN
SELECT NAME INTO V FROM EMP WHERE ID = :NEW.ID(:OLD.ID);
END;
7.抛出异常:raise_application_error(数字,'提示')。
8.限制行触发器,因为行触发器是每一行执行一次触发器,所以可以根据需要限制。语句级因为执行一次,所以不需要。样例:
CERATE OR REPLACE TRIGGER EMP_TRI
BEFORE(AFTER) INSERT OR UPDATE OR DELETE ON EMP
FOR EACH ROW
WHEN (:OLD.JOB = 'SALESMAN') --当满足该条件才执行下述操作。
DECLARE
BEGIN
--CONTENTS;
END;
9.SELECT D.trigger_name FROM DBA_TRIGGERS D WHERE D.table_name = '表名';--用来查询TRIGGER