达梦数据库中触发器分为表触发器、事件触发器和时间触发器。下面主要记录一下表触发器的基本使用方法。
表触发器是对表里数据操作引发的数据库的触发,下面先介绍两个概念:
触发级别
根据触发器的级别可分为元组级 (也称行级)和语句级。
元组级触发器,对触发命令所影响的每一条记录都激发一次。元组级触发器是在触发器定义语句中通过FOR EACH ROW子句创建的。
语句级触发器,对每个触发命令执行一次。语句级触发器是在触发器定义语句中通过FOR EACH STATEMENT子句创建的,该子句可缺省。
触发时机
BEFORE 指明触发器在执行触发语句之前激发。
AFTER 指明触发器在执行触发语句之后激发。
INSTEAD OF 指明触发器执行时替换原始操作,INSTEAD OF 触发器仅允许建立在视图上,并且只支持行级触发。
下面通过具体的示例来进一步说明表触发器的基本使用方法:
示例一:
CREATE OR REPLACE TRIGGER TRG_UPD
AFTER UPDATE OF NAME,PHONE ON PERSON.PERSON
BEGIN
PRINT 'UPDATE OPERATION ON COLUMNS NAME OR PHONE OF PERSON';--触发器体
END;
上面创建了一个触发器,该触发器为语句级触发器;触发时机为在执行触发语句之后激发;
触发条件:更新表PERSON.PERSON中NAME,PHONE两列的值之后,会触发触发器体执行。
验证结果如下:
执行完后,会输出UPDATE OPERATION ON COLUMNS NAME OR PHONE OF PERSON,说明触发器TRG_UPD被激发。
示例二:
CREATE OR REPLACE TRIGGER TRG_DEL_ROW
BEFORE DELETE ON PERSON.PERSON
FOR EACH ROW //元组级:此子句一定不能省略
BEGIN
PRINT 'DELETE' || :OLD.NAME|| ' ON PERSON';--触发器体
END;
上面创建了一个触发器,该触发器为元组级触发器;触发时机为在执行触发语句之前激发;触发条件:删除PERSON.PERSON表中的数据,会触发触发器体执行。
验证结果如下:
从执行结果来看,每删除一条行记录,都会触发触发器体中的操作。
注:在元组级触发器内部,可以访问正在处理中的记录的数据,这种访问是通过两个引用变量:OLD 和:NEW 实现的。上面的示例中,通过引用变量:OLD,来输出被删掉记录中的name字段值。
触发器激发顺序:
1.如果有语句级前触发器的话,先运行该触发器;
2.对于受语句影响每一行:
1) 如果有行级前触发器的话,运行该触发器;
2) 执行该语句本身;
3) 如果有行级后触发器的话,运行该触发器。
3.如果有语句级后触发器的话,运行该触发器。
示例三:
--创建触发器
CREATE OR REPLACE TRIGGER Reader_Before_St
BEFORE UPDATE ON OTHER.READER --语句级前触发器
BEGIN
PRINT 'BEFORE UPDATE TRIGGER FIRED';
END;
CREATE OR REPLACE TRIGGER Reader_After_St
AFTER UPDATE ON OTHER.READER --语句级后触发器
BEGIN
PRINT 'AFTER UPDATE TRIGGER FIRED';
END;
CREATE OR REPLACE TRIGGER Reader_Before_Row
BEFORE UPDATE ON OTHER.READER --元组级前触发器
FOR EACH ROW
BEGIN
PRINT 'BEFORE UPDATE EACH ROW TRIGGER FIRED';
END;
CREATE OR REPLACE TRIGGER Reader_After_Row
AFTER UPDATE ON OTHER.READER --元组级后触发器
FOR EACH ROW
BEGIN
PRINT 'AFTER UPDATE EACH ROW TRIGGER FIRED';
END;
上述创建了4个触发器,现执行update操作,用来触发触发器,通过输出的触发器体中的信息,可以对触发顺序进行验证。
达梦社区:https://eco.dameng.com