CREATE TRIGGER 语句

说明 

此语句用于在数据库中创建新触发器。它是一种形式的触发器,专门设计用于 SQL Remote。

语法 

CREATE TRIGGER trigger-name trigger-time
trigger-event, ...
ORDER integer ] ON table-name
REFERENCING [ OLD AS old-name ]
   [ NEW AS new-name ] ]
   [ REMOTE AS remote-name ] ]
FOR EACH { ROW | STATEMENT } ]
WHEN ( search-condition ) ]
IF UPDATE ( column-name ) THEN
[ { AND | OR } UPDATE ( column-name ) ] ... ]
   compound-statement
ELSEIF UPDATE ( column-name ) THEN
[ { AND | OR } UPDATE ( column-name ) ] ...
    compound-statement
END IF ] ]

trigger-time:
BEFORE | AFTER | RESOLVE

trigger-event:
DELETE | INSERT | UPDATE
UPDATE OF column-name [, column-name, ...]

参数 

trigger-time    可以定义行级触发器在插入、更新或删除之前 (BEFORE) 或之后 (AFTER) 执行。语句级触发器在语句后 (AFTER) 执行。RESOLVE 触发器时间用于 SQL Remote:它只在行级 UPDATE 或 UPDATE OF 列列表之前触发。

只要行中发生更新,BEFORE UPDATE 触发器就会触发,而不论新值是否与旧值不同。AFTER UPDATE 触发器只在新值与旧值不同时才触发。

触发器事件    触发器可以由以下一个或多个事件触发:

  • DELETE    每当删除关联表中的行时激活。

  • INSERT    每当有新行插入到与触发器关联的表中时激活。

  • UPDATE    每当更新关联表中的行时激活。

  • UPDATE OF column-list    每当更新关联表中的行和修改 column-list 中的列时激活。

用法 

任何地方。

权限 

必须有 RESOURCE 权限和表的 ALTER 权限,或者必须有 DBA 权限。CREATE TRIGGER 在表上放置表锁,因此要求独占使用表。

副作用 

自动提交。

另请参见 
说明 

CREATE TRIGGER 语句创建与数据库中的表关联的触发器,并且在数据库中存储触发器。

BEFORE UPDATE 触发器在行上发生更新的任何时候触发,不论新值是否不同于旧值。AFTER UPDATE 触发器仅当新值不同于旧值时才触发。

行级和语句级触发器 

触发器声明为行级触发器(此情况下,它在每行修改之前或之后执行)或语句级触发器(此情况下,它在整个触发器语句完成后执行)。

可以定义行级触发器在插入、更新或删除之前 (BEFORE) 或之后 (AFTER) 执行。语句级触发器在语句后 (AFTER) 执行。RESOLVE 触发器事件用于 SQL Remote:它仅在行级 UPDATE 或 UPDATE OF column-lists 之前触发。

要将触发器声明为行级触发器,请使用 FOR EACH ROW 子句。要将触发器声明为语句级触发器,可以使用 FOR EACH STATEMENT 子句或忽略 FOR EACH 子句。为清楚起见,建议在声明语句级触发器时输入 FOR EACH STATEMENT 子句。

触发顺序 

同时触发(之前、之后或解析)的同类型触发器可以使用 ORDER 子句确定触发器的触发顺序。

引用已删除和插入的值 

REFERENCING OLD 和 REFERENCING NEW 子句允许引用已删除和插入的行。在此子句中,UPDATE 处理为删除后插入。

REFERENCING REMOTE 子句用于 SQL Remote。它允许引用 UPDATE 语句的 VERIFY 子句中的值。它仅能用于 RESOLVE UPDATE 或 RESOLVE UPDATE OF column-list 触发器。

REFERENCING OLD 和 REFERENCING NEW 的含义不同,具体取决于触发器是行级还是语句级触发器。对于行级触发器,REFERENCING OLD 子句允许引用更新或删除之前行中的值,REFERENCING NEW 子句允许引用已插入或更新的值。在 BEFORE 和 AFTER 触发器中可以引用 OLD 和 NEW 行。REFERENCING NEW 子句允许在插入或更新操作发生之前在 BEFORE 触发器中修改新行。

对于语句级触发器,REFERENCING OLD 和 REFERENCING NEW 子句引用保存行的新旧值的声明过的临时表。这些表的缺省名称是 deletedinserted

WHEN 子句使触发器仅对搜索条件计算为真值的行触发。

用同一值更新值 

只要行中发生更新,BEFORE UPDATE 触发器就会触发,而不论新值是否与旧值不同。AFTER UPDATE 触发器只在新值与旧值不同时才触发。

示例 
  • 当任命一个新的部门经理时,更新该部门中雇员的 manager_id 列。

    CREATE TRIGGER
    tr_manager BEFORE UPDATE OF dept_head_id ON department
    REFERENCING OLD AS old_dept
    NEW AS new_dept
    FOR EACH ROW
    BEGIN
       UPDATE employee
       SET employee.manager_id=new_dept.dept_head_id
       WHERE employee.dept_id=old_dept.dept_id
    END
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值