SQL Server贰零零贰提供了二种触发器

SQL Server:触发器安详严整

 

SQL Server:触发器详明

 

  • 1. 概述
  • 2. 触发器的分类
  • 3.
    Inserted和Deleted表
  • 4.
    触发器的执行进度
  • 5. 创制触发器
  • 6. 更正触发器:
  • 7. 刨除触发器:
  • 8.
    查看数据库中原来就有触发器:
  • 9. “Instead
    of”相关示例:
  • 10.
    “After”触发器
  • 11. 参照他事他说加以考查能源

1. 概述

触发器是后生可畏种相当的囤积进程,它不能够被显式地调用,而是在往表中插入记录﹑更新记录可能去除记录时被活动地激活。
所以触发器能够用来落到实处对表施行复杂的完整性限制。

2. 触发器的分类

SQL Server二零零四提供了三种触发器:“Instead of” 和“After” 触发器。

二个表或视图的每二个改动动作(Insert、Update和Delete)都得以有叁个“Instead
of” 触发器,一个表的每一个改革动作都足以有多个“After”触发器。

2.1 “Instead of”触发器

  • “Instead of”触发器在试行真正“插入”以前被试行。除表之外,“Instead of”
    触发器也能够用于视图,用来扩充视图能够支撑的翻新操作。
  • “Instead
    of”触发器会顶替所要执行的SQL语句,言下之意正是所要实施SQL并不会“真正实践”

 

上例中定义了“trigger学子_Delete”触发器,该触发器从“delete”表中打字与印刷出所要删除的学子.在实践“delete”操作后,会发觉“学号
= 4”的学子未有被删除,
原因在于“trigger学子Delete”代替了所要试行的“delete from 学子 where 学号
= 4”语句,而在“trigger学子_Delete”中绝非真正删除学子。

2.2 “After”触发器

  • “After”触发器在Insert、Update或Deleted语句试行之后被触发。“After”触发器只可以用于表。
  • “After”触发器重要用于表在改过后(insert、update或delete操作之后卡塔尔国,来改革别的表

3. Inserted和Deleted表

SQL Server为种种触发器都创立了多个专项使用表:Inserted表和Deleted表。

  • 那四个表由系统来维护,它们存在于内部存款和储蓄器中实际不是在数据库中,能够精通为多少个虚构的表。
  • 那五个表的构造总是与被该触发器成效的表的协会一样。
  • 触发器试行到位后,与该触发器相关的这多个表也被去除。
  • Deleted表寄存由于试行Delete或Update语句而要从表中删除的具有行。
  • Inserted表存放由于奉行Insert或Update语句而要向表中插入的装有行。
对表的操作 Inserted逻辑表 Deleted逻辑表
增加记录(insert) 存放增加的记录
删除记录(delete) 存放被删除的记录
修改记录(update) 存放更新后的记录 存放更新前的记录

4. 触发器的实践进程

  • 借使五个Insert﹑update可能delete语句违反了限制,那么那条SQL语句就一直不奉行成功,因而“After”触发器也不会被激活。

  • “Instead of”
    触发器能够代替激发它的操作来实行。它在Inserted表和Deleted表刚刚建设构造,其它任何操作还没有曾发生时被实行。因为“Instead
    of” 触发器在约束以前实施,所以它可以对限制进行部分预管理。

5. 创办触发器

create trigger trigger_name

on  {table_name|view_name}

{``After``|``Instead of``} {``insert``|``update``|``delete``}

as 相应T-SQL语句

6. 校勘触发器:

alter trigger trigger_name

on  {table_name|view_name}

{``After``|``Instead of``} {``insert``|``update``|``delete``}

as 相应T-SQL语句

7. 刨除触发器:

drop trigger trigger_name

8. 查看数据库中原来就有触发器:

8.1 查看数据库中有着触发器

select * ``from sysobjects ``where xtype=``'TR'

8.2 查看单个触发器

exec sp_helptext ``'触发器名'

9. “Instead of”相关示例:

两张表:学子(学号 int, 姓名 varchar)、借书记录(学号 int, 图书编号 int)

得以完毕效果与利益:在剔除学生表时,假设该学子依然有借书记录(未还卡塔 尔(阿拉伯语:قطر‎则不可能去除

alter trigger trigger_学生_Delete

on 学生

instead of Delete

as

begin

``if ``not exists(``select * ``from 借书记录, deleted ``where 借书记录.学号 = deleted.学号)

``delete from 学生 ``where 学生.学号 ``in (``select 学号 ``from deleted)

end

10. “After”触发器

10.1 在“订单”表中国建工业总集结团立触发器,当向“订单”表中插入一条订单记录时,检查“商品”表的货品状态“状态”是不是为1(正在整理),则无法往“订单”表出席该订单。

create trigger trigger_订单_insert

on 订单

after insert

as

``if (``select 状态 ``from 商品, inserted ``where 商品.pid = inserted.pid)=1

``begin

``print ``'the goods is being processed'

``print ``'the order cannot be committed'

``rollback transaction --回滚,避免加入

``end

  • 该示例中“pid”为商品编码
  • 该示例的if判定严厉来说是不标准的,因为“订单”表要是每便插入一条记下,该论断没不不荒谬;假如三遍插入多条记下,则“select
    状态”重返的是多行。

10.2 在“订单”表建设构造二个安排触发器,在增加一条订单时,收缩“商品”表相应的货品记录中的仓库储存。

create trigger trigger_订单_insert2

on 订单

after insert

as

``update 商品 ``set 数量 = 数量 - inserted.数量

``from 商品, inserted

``where 商品.pid = inserted.pid

10.3 在“商品”表创设删除触发器,实现“商品”表和“订单”表的级联删除。

create trigger goodsdelete trigger_商品_delete

on 商品

after delete

as

``delete from 订单 ``where 订单.pid ``in (``select pid ``from deleted)

10.4 在“订单”表建构三个翻新触发器,监视“订单”表的“订单日期”列,使其不可能被“update”.

create trigger trigger_订单_update

on 订单

after update

as

``if ``update``(订单日期)

``begin

``raiserror(``'订单日期不能手动修改'``,10,1)

``rollback transaction

``end

10.5 在“订单”表创设八个布置触发器,保险向“订单”表插入的物品必要求在“商品”表中一定期存款在。

create trigger trigger_订单_insert3

on 订单

after insert

as

``if (``select count``(*) ``from 商品, inserted ``where 商品.pid = inserted.pid)=0

``begin

``print ``'商品不存在'

``rollback transaction

``end

10.6 “订单”表建构叁个安顿触发器,保险向“订单”表插入的物品音信要在“订单日志”表中加多

alter trigger trigger_订单_insert

on 订单

for insert

as

``insert into 订单日志 ``select inserted.Id, inserted.pid,inserted.数量 ``from inserted

 

 

转发原著:

相关文章