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';
posted @ 2023-12-10 23:42  osbreak  阅读(29)  评论(0编辑  收藏  举报