语句级触发器,顾名思义,就是针对一条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语句
对于条件我们还可以判断其中特定的列是否被更新
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;
发现更新特定的行也能被判断。
本站文章除注明转载/出处外,均为本站原创,转载前请务必署名,转载请标明出处