触发器语句中使用了两种特殊的表:deleted 表和 inserted 表。Microsoft® SQL Server 2000 自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。
inserted和deleted表主要用于触发器中:
·扩展表间引用完整性
·在以视图为基础的基表中插入或更新数据
·检查错误并基于错误采取行动
找到数据修改前后表状态的差异,并基于此差异采取行动。
Deleted表用于存储DELETE和UPDATE语句所影响的行的复本。在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。Deleted表和触发器表通常没有相同的行。
Inserted表用于存储INSERT和UPDATE语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到inserted表和触发器表中。Inserted表中的行是触发器表中新行的副本。
更新事务类似于在删除之后执行插入;首先旧行被复制到 deleted 表中,然后新行被复制到触发器表和 inserted 表中。
在设置触发器条件时,应当为引发触发器的操作恰当使用 inserted 和 deleted 表。虽然在测试 INSERT 时引用 deleted 表或在测试 DELETE 时引用 inserted 表不会引起任何错误,但是在这种情形下这些触发器测试表中不会包含任何行。
说明:如果触发器操作取决于一个数据修改所影响的行数,应该为多行数据修改(基于 SELECT 语句的 INSERT、DELETE 或 UPDATE)使用测试(如检查 @@ROWCOUNT),然后采取相应的对策。
SQL Server™ 2000 不允许 AFTER 触发器引用 inserted 和 deleted 表中的 text、ntext 或 image 列;然而,允许 INSTEAD OF 触发器引用这些列。有关更多信息,请参见 CREATE TRIGGER。
在 INSTEAD OF 触发器中使用 inserted 和 deleted 表
传递到在表上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表遵从与传递到 AFTER 触发器的 inserted 和 deleted 表相同的规则。inserted 和 deleted 表的格式与在其上定义 INSTEAD OF 触发器的表的格式相同。inserted 和 deleted 表中的每一列都直接映射到基表中的列。
有关引用带 INSTEAD OF 触发器的表的 INSERT 或 UPDATE 语句何时必须提供列值的规则与表没有 INSTEAD OF 触发器时相同:
不能为计算列或具有 timestamp 数据类型的列指定值。
不能为具有 IDENTITY 属性的列指定值,除非该列的 IDENTITY_INSERT 为 ON。当 IDENTITY_INSERT 为 ON 时,INSERT 语句必须提供一个值。
INSERT 语句必须为所有无 DEFAULT 约束的 NOT NULL 列提供值。
对于除计算列、标识列或 timestamp 列以外的任何列,任何允许空值的列或具有 DEFAULT 定义的 NOT NULL 列的值都是可选的。
当INSERT、UPDATE 或 DELETE 语句引用具有 INSTEAD OF 触发器的视图时,数据库引擎将调用该触发器,而不是对任何表采取任何直接操作。即使为视图生成的 inserted 和 deleted 表中的信息格式与基表中的数据格式不同,该触发器在生成执行基表中的请求操作所需的任何语句时,仍必须使用 inserted 和 deleted 表中的信息。
传递到在视图上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表格式与为该视图定义的 SELECT 语句的选择列表相匹配。例如:
CREATE VIEW EmployeeNames (EmployeeID, LName, FName)
AS
SELECT EmployeeID, LastName, FirstName
FROM Northwind.dbo.Employees
|
视图的结果集有三列:一个 int 列和两个 nvarchar 列。传递到在视图上定义的 INSTEAD OF 触发器的 inserted 和 deleted 表也具有名为 EmployeeID 的 int 列、名为 LName 的 nvarchar 列和名为 FName 的 nvarchar 列。
视图的选择列表还包含不直接映射到单个基表列的表达式。一些视图表达式(如常量调用或函数调用)可能不引用任何列,这类表达式会被忽略。复杂的表达式会引用多列,但在 inserted 和 deleted 表中,每个插入的行仅有一个值。如果视图中的简单表达式引用具有复杂表达式的计算列,则这些简单表达式也有同样的问题。视图上的 INSTEAD OF 触发器必须处理这些类型的表达式。有关更多信息,请参见视图上 INSTEAD OF 触发器中的表达式和计算列。
顺便说一下,当对某张表建立触发器后,分3种情况讨论
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据
2.删除操作(Delete)
Inserted表无数据,Deleted表有数据
3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)
分享到:
相关推荐
在 SQL Server 触发器中,系统自动会生成两张临时表,分别是 deleted 和 inserted 表。这些表可以理解为临时表,也可以认为是逻辑表或概念表。它们的表结构与原表是完全相同的。 Inserted 表和 Deleted 表的作用 ...
在 SQL Server 中,`Inserted` 和 `Deleted` 是两个特殊的表,它们主要用于触发器(Trigger)中。当执行 INSERT、UPDATE 或 DELETE 操作时,系统会自动创建这两个虚拟表,并填充相应的数据。本文将详细介绍这两个表...
触发器中两个临时表详解 ...inserted 和 deleted 两个临时表在触发器中起着重要的作用,通过它们可以精确地确定触发器的动作对数据表所做的修改,并且可以用于触发器的条件测试。但是,用户不能直接更改它们的内容。
- deleted和inserted表的区别与使用场景。 - 示例代码和案例研究。 - 性能考虑和最佳实践。 6. **最佳实践** - 避免过度使用级联触发器,以免导致不必要的复杂性。 - 在使用deleted表时,注意不要对它进行...
在讨论SQL Server 2000中的触发器时,我们通常会涉及两个特殊的临时表:inserted和deleted。这两个临时表在触发器的执行过程中扮演了非常重要的角色,尤其是在处理数据的插入、更新和删除操作时。在触发器的上下文中...
在实际应用中,SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表,当触发器被执行时产生。这是两个逻辑表,存放在内存中,表的结构与被触发器作用的表的结构相同且由系统自动创建和撤销。 使用...
在DML触发器内部,逻辑表INSERTED和DELETED是两个特殊的表,它们仅在触发器的上下文中可用。它们用于存储触发器操作影响的行数据。 INSERTED表 INSERTED表在INSERT或UPDATE触发器中用来存储触发操作后的新行数据。...
SQL Server为每个触发器都创建了两个专用虚拟表:inserted表和deleted表。这两个表由系统来维护,他们存在于内存中,而不是在数据库中。这两个表的结构总是与被该触发器作用的表结构相同。触发器执行完成后,与该...
- 示例中通过`INSERT INTO`语句向`XINXIN_TAB`和`FENSHU_TAB`插入数据,确保了各个表中有数据可供触发器操作。 6. **视图与多表更新**: - 虽然未直接提及视图,但视图可以结合触发器用于实现多表操作。视图是...
在触发器内部,通过计算inserted表和deleted表中学分字段的差值,并结合学生表,来计算每个学生在更新后的总学分,从而保证了数据的准确性和完整性。 文章还指出了多行数据更新引发的触发器设计比单条记录更新时...
例如,可以在学生表(Student)中定义一个修改触发器,当对表中记录进行修改时,触发器会被激活并显示学生表、inserted表和deleted表中的所有记录。通过触发器,可以详细查看到修改前后的数据差异。 在另外一个应用...
SQL Server为每个触发器创建了两个特殊的表——Inserted表和Deleted表。这两个表由系统维护,并且只存在于内存中,而不是数据库中。这两个表的结构与触发器作用的表结构完全相同。 - **Deleted 表**:存储由于执行...
在本文中,我们将深入探讨两个与触发器紧密相关的临时表——Inserted和Deleted,以及如何利用它们来实现数据的跟踪和备份。 Inserted表和Deleted表是在触发器执行期间创建的隐式内部表,它们仅在触发器的上下文中...
触发器的执行过程中,SQL Server 会维护两个虚拟表,分别是Inserted表和Deleted表。这两个表在触发器被触发时存在,用以存储操作所涉及的数据。具体而言,Deleted表存储的是被DELETE或UPDATE语句影响的行的副本,即...
SQL Server 为每个触发器都创建了两个专用表:Inserted 表和 Deleted 表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该...
在SQL Server中,每个触发器执行期间,系统会创建两个特殊的逻辑表:inserted表和deleted表。这些表用于存储被触发器操作影响的行的副本。具体作用如下: - Inserted表:在执行INSERT或UPDATE操作时,新的行会同时...
- 触发器可以通过比较`deleted`表和`inserted`表中的数据来判断哪些字段发生了改变,并据此执行相应的操作。 - `deleted`和`inserted`表中的行都是目标表中对应行的副本,这样可以方便地访问更改前后的数据。 **3. ...
Deleted 和 inserted 表总是在内存中。触发器所引用的其它表的位置确定操作所需的时间。因此,应该避免在触发器中使用游标,而是使用基于行集的逻辑来设计影响多行的触发器。 Inserted 和 Deleted 表 Inserted 和 ...