这次谈的是触发器
Microsoft SQL Server 提供两种主要机制来强制使用业务规则和数据完整性:约束和触发器。
关于触发器和约束用谁比较好,这主要看业务的逻辑复杂程度.
如果你的处理逻辑比较简单,并且可以用一些简单的约束来处理,则应该尽量使用PRIMARY KEY ,UNIQUE CHECK这些约束.
当约束支持的功能无法满足应用程序的功能要求时,DML 触发器非常有用 例如:
1.除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能用与另一列中的值完全匹配的值来验证列值
2.约束只能通过标准化的系统错误消息来传递错误消息。如果应用程序需要(或能受益于)使用自定义消息和较为复杂的错误处理,则必须使用触发器。
3.DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。
check约束只能检查引用表内的列,当涉及外表的一些规则时候 需要在本表里使用trigger.
4.如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。
如果违反了约束,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。
5.一个表中的多个同类 DML 触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的操作来响应同一个修改语句。
触发器分类:(- -|| 这个分类 可能是错的 )
1.DDL触发器:当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器
2.登录触发器:将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。
3.DML触发器:当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器
这个类型触发器还可以分成:
AFTER 触发器:在执行了INSERT、UPDATE 或 DELETE 语句操作之后执行 AFTER 触发器(指定 AFTER 与指定 FOR 相同)
INSTEAD OF 触发器 :执行 INSTEAD OF 触发器代替通常的触发动作。还可为带有一个或多个基表的视图定义 INSTEAD OF 触发器
clr触发器:CLR 触发器可以是 AFTER 触发器或 INSTEAD OF 触发器。CLR 触发器还可以是 DDL 触发器。
CLR 触发器将执行在托管代码(在 .NET Framework 中创建并在 SQL Server 中上载的程序集的成员)中编写的方法
先来说说我们最常用的DML触发器
这里只介绍DML中的 AFTER触发器和INSTEAD OF触发器.
首先列出2者的不同点:
函数 AFTER 触发器 INSTEAD OF 触发器
~适用范围 表 表和视图
~每个表或视图包含触发器的数量 每个触发操作(UPDATE、DELETE 和 INSERT) 每个触发操作(UPDATE、DELETE 和 INSERT)
包含多个触发器 包含一个触发器
~级联引用 无任何限制条件 不允许在作为级联引用完整性约束目标的表上使用
INSTEAD OF UPDATE 和 DELETE 触发器
~执行 晚于: 约束处理 早于: 约束处理
声明性引用操作 替代: 触发操作
创建插入的和删除的表(反映对基表所做的更改) 晚于: 创建插入的和删除的表(反映对基表所做的更改)
触发操作
~执行顺序 可指定第一个和最后一个执行 不适用
~插入的和删除的表中的 varchar(max) 允许 允许
nvarchar(max) 和 varbinary(max) 列引用。
~插入的和删除的表中的 text、ntext 不允许 允许
和 image 列引用。
~ 递归性 可以 在内部再次触发该触发器后不会再递归触发,但是可以触发
将启动一系列约束操作和 AFTER 触发器执行