达梦触发器管理

达梦触发器管理,全部参照官方文档。

  1. DM是一个具有主动特征的数据库管理系统,其主动特征包括约束机制和触发器机制。约束机制主要用于对某些列进行有效性和完整性验证;触发器定义当某些与数据库有关的事件发生时,数据应该采取的操作。触发器是一种特殊的存储过程,它在创建后就存储在数据库中,触发器的特殊性在于它是建立在某个具体的表或视图上的,或建立在各种事件前后,而且是自动激发执行的。
  2. 触发器是激发它们的语句的一个组成部分,即直到一个语句激发的所有触发器执行完成之后该语句才结束,而其中任何一个触发器执行的失败都将导致该语句的失败。
  3. DM提供了四种类型的触发器:表级触发器(基于表中的数据进行触发)、事件触发器(基于特定系统事件进行触发,包括库级和模式级)和时间触发器(基于时间进行触发)。
  4. 表级触发器都是基于表中数据的触发器,它通过针对相应表对象的插入/删除/修改等DML语句触发。
  5. 创建表级触发器的语法:CREATE [OR REPLACE] TRIGGER TRI_NAME [WITH ENCRYPTION] BEFORE|AFTER|INSTEAD OF DELETE|INSERT|UPDATE [OF 列名] ON TAB_NAME [FOR EACH ROW [WHEN 条件]] BEGIN STMT; END; 其中INSTEAD OF子句仅用于视图上的触发器,表示用触发器体内定义的操作代替原操作,如:CREATE OR REPLACE TRIGGER TRI INSTEAD OF INSERT ON VI BEGIN UPDATE VI SET B = ‘YYQX’; END;,且INSTEAD OF触发器固定为元组级触发器。触发器可以被任何DML命令激发,包括INSERT、DELETE、UPDATE,若希望其中的一种、两种或三种命令能激发该触发器,则可以指定他们之间的任意组合,两种不同的命令之间用OR分开。若指定了UPDATE命令,还可以进一步指定当表中的哪个列受到UPDATE命令的影响时激发该触发器,触发器列清单指定的字段数不能超过128个。FOR EACH ROW:元组级;FOR EACH STATEMENT:语句级(默认,可缺省)。
  6. 在元组级触发器中可以引用当前修改的记录在修改前后的值,修改前的值称为旧值,修改后的值称为新值。对于插入操作不存在旧值,而对于删除操作则不存在新值。对于新旧值的访问请求常常决定一个触发器是BEFOR类型还是AFTER类型,若需要通过触发器对插入的行设置列值,那么为了能设置新值,需要使用一个BEFORE触发器,因为在AFTER触发器中不允许用户设置已插入的值。在审计应用中则经常使用AFTER触发器,因为元组修改成功后才有必要运行触发器,而成功的完成修改意味着成功地通过了该表的引用完整性约束。如:CREATE OR REPLACE TRIGGER TRI BEFORE UPDATE ON TEST REFERENCING OLD ROW AS RO NEW ROW AS RN FOR EACH ROW BEGIN INSERT INTO TEST VALUES (:RO.A,’DELETED’);INSERT INTO TEST VALUES (:RN.A,’ADDED’);END; (REFERENCING后面必须OLD ROW在前,NEW ROW在后,否则会报错;使用新旧值时需要在前面加冒号:,否则会报错)
  7. DM还支持事件触发器,包括库级和模式级,这类触发器并不依赖于某个表,而是基于特定系统事件触发的,通过指定DATABASE或某个SCHEMA来表示事件触发器的作用区域。可以触发的事件包含以下两类:DDL事件(包括CREATE、ALTER、DROP、GRANT、REVOKE以及TRUNCATE)、系统事件(包括LOGIN/LOGON、LOGOUT/LOGOFF、AUDIT、NOAUDIT、BACKUP DATABASE、RESTORE DATABASE、TIMER、STARTUP、SHUTDOWN以及SERERR(即执行错误事件))。所有DDL事件触发器都可以设置BEFORE或AFTER的触发时机,但系统事件中LOGOUT/LOGOFF仅能设置为BEFORE,而其他仅能设置为AFTER。模式级触发器不能是LOGIN/LOGON、LOGOUT/LOGOFF、BACKUP DATABASE、RESTORE DATABASE、STARTUP、SHUTDOWN以及SERERR事件触发器。与数据触发器不同,事件触发器不能影响对应触发事件的执行,他的主要作用是帮助管理员监控系统正在运行发生的各类事件,进行一定程度的审计和监视工作。如:CREATE OR REPLACE TRIGGER TRI AFTER CREATE ON DATABASE BEGIN INSERT INTO TEST VALUES (1,’HAHA’); END;
  8. 时间触发器是一种特殊的事件触发器。特点是用户可以定义在任何时间点、时间区域、每隔多长时间等方式来激发触发器,它的最小时间精度为分钟。语法:CREATE OR REPLACE TRIGGER TRI AFTER TIMER ON DATABASE {时间定义语句} BEGIN STMT; END;如:CREATE OR REPLACE TRIGGER TIMER2 AFTER TIMER ON DATABASE FOR EACH 1 MONTH DAY 28 FROM TIME ‘09:00’ TO TIME ‘18:00’ FOR EACH 1 MINUTE BEGIN PRINT ‘HELLO WORLD’; END;
  9. 在触发器中可以定义变量,但必须以DECLARE开头。触发器也可以进行异常处理,若发生异常,就执行相应的异常处理程序。如:CREATE OR REPLACE TRIGGER TRI AFTER DELETE ON TEST BEGIN DECLARE EX EXCEPTION FOR -22222; CNT INT; BEGIN SELECT COUNT(*) INTO CNT FROM TEST; IF CNT > 0 THEN RAISE EX; END IF; EXCEPTION WHEN EX THEN INSERT INTO TEST VALUES (-22222,’EXCEPTION’); END; END;
  10. 删除触发器:DROP TRIGGER TRI_NAME;
  11. 使触发器失效:ALTER TRIGGER TRI_NAME DISABLE;
  12. 使触发器生效:ALTER TRIGGER TRI_NAME ENABLE;
  13. 每张基表上可创建的触发器的个数没有限制,但是触发器的个数越多,处理DML语句所需的事件就越长。不存在触发器的执行权限,因为用户不能主动调用某个触发器,是否激发一个触发器是由系统决定的。同类触发器的激发顺序没有明确的定义,若顺序非常重要,应该把所有的操作组合在一个触发器中。在DM数据守护环境下,备库上定义的触发器不会被触发。

你可能感兴趣的:(达梦数据库,达梦数据库)