DML 触发器语句使用两种特殊的表:删除的表和插入的表。SQL Server 会自动创建和管理这两种表。您可以使用这两种驻留内存的临时表来测试特定数据修改的影响以及设置 DML 触发器操作条件。但不能直接修改表中的数据或对表执行数据定义语言 (DDL) 操作,例如 CREATE INDEX。
在 DML 触发器中,inserted 和 deleted 表主要用于执行以下操作:
- 扩展表之间的引用完整性。
- 在以视图为基础的基表中插入或更新数据。
- 检查错误并采取相应的措施。
- 找出数据修改前后表的状态差异并基于该差异采取相应的措施。
删除的表用于存储 DELETE 和 UPDATE 语句所影响的行的副本。在执行 DELETE 或 UPDATE 语句的过程中,行从触发器表中删除,并传输到删除的表中。删除的表和触发器表通常没有相同的行。
插入的表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在执行插入或更新事务过程中,新行会同时添加到 inserted 表和触发器表中。插入的表中的行是触发器表中的新行的副本。
更新事务类似于在删除操作之后执行插入操作;首先,旧行被复制到删除的表中,然后,新行被复制到触发器表和插入的表中。
在设置触发器条件时,应使用激发触发器的操作相应的插入的和删除的表。尽管在测试 INSERT 时引用删除的表或在测试 DELETE 时引用插入的表不会导致任何错误,但在这些情况下,这些触发器测试表将不包含任何行。
SQL Server 2008 不允许在 AFTER 触发器的插入的和删除的表中引用 text、ntext 或 image 列。但会包括这些数据类型,这只是为了向后兼容。存储大型数据的首选方法是使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型。AFTER 和 INSTEAD OF 触发器均支持插入的和删除的表中的 varchar(max)、nvarchar(max) 和 varbinary(max) 数据。有关详细信息,请参阅CREATE TRIGGER (Transact-SQL)。
在触发器中使用插入的表以强制实施业务规则的示例
由于 CHECK 约束只能引用定义了列级或表级约束的列,表间的任何约束(在本例中是业务规则)都必须定义为触发器。
以下示例将创建一个 DML 触发器。如果有人试图将一个新采购订单插入到 PurchaseOrderHeader 表中,此触发器将进行检查以确保供应商具有良好的信用等级。若要获取与刚插入的采购订单对应的供应商信用等级,必须引用 Vendor 表并将其与插入的表联接。如果信用等级太低,则显示信息,并且不执行该插入操作。
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/sjkxydsj/30751.html