SQL触发器trigger, since 2021-12-20

2021-12-20  本文已影响0人  Mc杰夫

(2021.12.23 Thur)
触发器有时也称作事件-条件-动作规则(event-condition-action rule),或ECA。触发器有如下特点

  1. 仅当数据库程序员生命的事件发生时,触发器被激活。允许的事件种类是对某个特定关系的INSERT, UPDATEDELETE。很多SQL系统中允许的另一种事件是事务的结束。
  2. 当触发器被事件激活时,trigger测试触发的条件(condition)。如果条件不成立,则响应该事件的触发器不做任何事。
  3. 如果trigger声明的条件满足,则与该触发器相连的动作(action)有DBMS执行。动作可以是以某种方式修改事件的结果,甚至可以是撤销事件所在的事务。事实上,动作可以使任何数据库操作的序列,包括与触发事件毫无关联的操作。

触发器的特征

触发器的格式

CREATE TRIGGER <trigger_name>
<timing> <action> [OF <field1>] ON <table1>
[REFERENCING
OLD ROW AS <name_old>
NEW ROW AS <name_new>
]
FOR EACH <method>
BEGIN
<sql_scripts>
END

记得在MySQL中还要在该格式的前后加上DELIMITER\\DELIMITER;

例1,该案例中每次对MovieExec表中的netWorth字段做按行的UPDATE之后,并且修改前的数据大于修改后的数据的情况下,设定MoveExec中的netWorth保留为原数据。

DELIMITER &&
CREATE TRIGGER NetWorthTrigger
AFTER UPDATE OF netWorth ON MovieExec
REFERENCING
          OLD ROW AS OldTuple
          NEW ROW AS NewTuple
FOR EACH ROW
WHEN (OldTuple.netWorth > NewTuple.netWorth)
           UPDATE MovieExec
           SET netWorth = OldTuple.netWorth
           WHERE cert# = NewTuple.cert#;
DELIMITER;

new/old

(2021.12.24 Fri)
每行数据在操作前后都有一个状态,trigger将没有操作之前的状态保存到old中,将操作之后的保存到new关键字中。调用格式是

new/old.<field_name>

这里的new/old代表的是触发条件的数据。比如,对关系A的修改加入或删除会触发关系B变化,这里的A可以被new/old指代。在触发的动作里,可通过new/old.<field_name>引用触发条件关系的数据。

行级、语句级触发器

一旦有合适类型的语句被执行,语句级触发器就被执行,而不问它实际上会影响多少个元组。例如,如果用SQL更新语句更新整个表,语句级的修改触发器将只被执行一次,而元组级触发器将对要修改的元组一次一个的执行。

下面这个例子,在更新MovieExec的元组过程中,平均净资产可以暂时的低于500000,当所有变更结束时,其净资产值将超过500000。约束要做的是,若语句执行结束后,净资产值仍然低于500000,则整个一组更新操作被拒绝。

CREATE TRIGGER AvgNetWorthTrigger
AFTER UPDATE OF netWorth ON MovieExec
REFERENCING 
         OLD TABLE AS OldStuff
         NEW TABLE AS NewStuff
FOR EACH STATEMENT
WHEN (500000 > (SELECT AVG(netWorth) FROM MovieExec))
BEGIN
         DELETE FROM MovieExec
         WHERE (name, address, cert#, netWorth) IN NewStuff;
         INSERT INTO MovieExec
                 (SELECT * FROM OldStuff);
END;

命令

查看触发器

SHOW TRIGGERS;
SHOW TRIGGERS/G;

查看触发器的创建语句

SHOW CREATE TRIGGER <trigger_name>;
SHOW CREATE TRIGGER <trigger_name>/G;

删除触发器

DROP TRIGGER <trigger_name>;

限制

Reference

1 Jeffery U.等著,岳丽华等译,数据库系统基础教程,机械工业出版社

上一篇 下一篇

猜你喜欢

热点阅读