ORACLE语句级触发器的实现

/ 技术 / 293浏览

语句级触发器的实现

语句级触发器,顾名思义,就是针对一条DML语句而引起的触发器执行,在语句级触发器中不使用for each row子句,也就是说无论数据操作影响多少行,触发器都只会执行一次。

创建测试表
create table test_dml(
rec_id int,
rec_test varchar2(20),
rec_test1 varchar2(20)  
);
create table test_trigger (
options  varchar2(30),
times  date
);
创建一个触发器
CREATE OR REPLACE TRIGGER TRI_TEST
  BEFORE INSERT OR UPDATE OR DELETE ON TEST_DML
DECLARE
  VAR_TAG VARCHAR2(20);
BEGIN
  IF INSERTING THEN
    VAR_TAG := '插入';
  ELSIF UPDATING THEN
    VAR_TAG := '修改';
  ELSIF DELETING THEN
    VAR_TAG := '删除';
  END IF;
  INSERT INTO TEST_TRIGGER (OPTIONS, TIMES) VALUES (VAR_TAG, SYSDATE);
END TRI_TEST;

往表中分别插入、修改、删除数据

INSERT INTO TEST_DML (REC_ID, REC_TEST) VALUES (1, '插入一条语句');
UPDATE TEST_DML T SET T.REC_ID = 2 WHERE T.REC_ID = 1;
DELETE TEST_DML T WHERE T.REC_ID = 2;
COMMIT;

查询触发器TRI_TEST的测试表

select * from  TEST_TRIGGER t;

已经记录了三条DML语句

image-20200822140510848

对于条件我们还可以判断其中特定的列是否被更新

现在我们修改触发器
CREATE OR REPLACE TRIGGER TRI_TEST
  BEFORE UPDATE ON TEST_DML
DECLARE
  VAR_TAG VARCHAR2(20);
BEGIN
  IF UPDATING('REC_ID') THEN
    VAR_TAG := '修改REC_ID字段';
  ELSIF UPDATING('REC_TEST') THEN
    VAR_TAG := '修改REC_TEST字段';
   ELSE
    VAR_TAG := '修改其他字段';
  END IF;
  INSERT INTO TEST_TRIGGER (OPTIONS, TIMES) VALUES (VAR_TAG, SYSDATE);
END TRI_TEST;

修改字段

UPDATE TEST_DML T SET T.REC_ID = 2 WHERE T.REC_ID = 1;
UPDATE TEST_DML T SET T.REC_TEST = 'REC_TEST字段' ;
UPDATE TEST_DML T SET T.REC_TEST1 = '其他字段' ;
COMMIT;

查询触发器TRI_TEST的测试表

select * from  TEST_TRIGGER t order by times desc;

image-20200822141228952

发现更新特定的行也能被判断。