PLSQL 触发器
1.触发器
(1)触发器是当特定事件出现时自动执行的存储过程
(2)特定事件可以是执行更新的DML语句和DDL语句
(3)触发器不能被显式调用
(4)触发器的功能:
- 自动生成数据
- 自定义复杂的安全权限
- 提供审计和日志记录
- 启用复杂的业务逻辑
1.1 触发器类型
- DDL 触发器: 在模式中执行 DDL 语句时执行
- 数据库级触发器: 在发生打开、关闭、登录和退出数据库等系统事件时执行
- DML 触发器: 在对表或视图执行DML语句时执行
- 语句级触发器: 无论受影响的行数是多少,都只执行一次
- 行级触发器: 对DML语句修改的每个行执行一次
- INSTEAD OF 触发器: 用于用户不能直接使用 DML 语句修改的视图
1.2 触发器的组成部分
触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触发器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行
CREATE OR REPLACE TRIGGER aiu_itemfile
AFTER INSERT
ON itemfile
FOR EACH ROW
BEGIN
IF (:NEW.qty_hand = 0) THEN
DBMS_OUTPUT.PUT_LINE('警告:已插入记录,但数量为零');
ELSE
DBMS_OUTPUT.PUT_LINE(‘已插入记录');
END IF;
END;
1.3 触发器谓词
- INSERTING如果触发语句是 INSERT 语句,则为TRUE,否则为FALSE
- UPDATING如果触发语句是 UPDATE语句,则为TRUE,否则为FALSE
- DELETING如果触发语句是 DELETE 语句,则为TRUE,否则为FALSE
1.4 DML触发器的限制
- 触发器中不能使用控制语句(commit,rollback,savepoint)
- 由触发器所调用过程或函数也不能使用控制语句
- 触发器中不能使用long, long raw类型
1.5 当触发器被触发时,要使用被插入,更新或删除的记录中的列值,有时要使用操作前、后列的值.
- :new 修饰符访问操作完成后列的值
- :old 修饰符访问操作完成前列的值
CREATE OR REPLACE TRIGGER BI_TEST_TRG
BEFORE INSERT OR UPDATE OF ID
ON TEST_TRG
FOR EACH ROW
BEGIN
IF INSERTING THEN
SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
ELSE
RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');
END IF;
END;
1.6 语句级触发器
CREATE OR REPLACE TRIGGER trgdemo
AFTER INSERT OR UPDATE OR DELETE
ON order_master
BEGIN
IF UPDATING THEN
DBMS_OUTPUT.PUT_LINE('已更新 ORDER_MASTER 中的数据');
ELSIF DELETING THEN
DBMS_OUTPUT.PUT_LINE('已删除 ORDER_MASTER 中的数据');
ELSIF INSERTING THEN
DBMS_OUTPUT.PUT_LINE('已在 ORDER_MASTER 中插入数据');
END IF;
END;
1.7 模式触发器
CREATE OR REPLACE TRIGGER log_drop_obj
AFTER DROP ON SCHEMA
BEGIN
INSERT INTO dropped_obj
VALUES( ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);
END;
1.8 启用\禁用\删除 触发器
ALTER TRIGGER aiu_itemfile DISABLE;
ALTER TRIGGER aiu_itemfile ENABLE;
DROP TRIGGER aiu_itemfile;
1.9 查看有关触发器的信息
SELECT TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME='EMP';
SELECT TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE
FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';