请教 关于级联操作和触发器以及临时表Deleted、Inserted

heyixiang 2005-03-10 04:59:35
例如,假设有一个数据库包含三个表:TableA、TableB 和 TableC。针对 TableA 中的主键,用 ON DELETE CASCADE 定义 TableB 中的外键。针对 TableB 中的主键,用 ON DELETE CASCADE 定义 TableC 中的外键。如果 DELETE 语句删除 TableA 中的行,则该操作也将删除 TableB 中具有与 TableA 中所删除的主键匹配的任何外键中的所有行,然后删除 TableC 中具有与 TableB 中所删除的主键匹配的任何外键中的所有行。


触发器和级联引用操作
级联引用操作按下列顺序激发 AFTER 触发器:
1、首先执行由原始 DELETE 或 UPDATE 直接导致的所有级联引用操作。
2、当完成原始级联引用操作后,无论是否更新了任何行,都将激发原始表上的 AFTER 触发器。
3、然后激发级联引用操作链中表上的 AFTER 触发器,但只有已更新或删除了表中的一行或多行时才激发。
如果任何原始级联引用操作集生成任何错误,则产生错误,不激发 AFTER 触发器,并且回滚 DELETE 或 UPDATE。

这个是SQLSERVER的联机丛书上写的。

我有疑惑,按上面的说明,是先把3个表中的数据先删除然后在执行每个表中的触发器。但触发器中如果使用到了临时表Deleted,要从Deleted中取数据,那这个表中的数据到底是些什么?因为3个表中的数据都已经删掉了。

小弟初涉这个,对Deleted和Inserted临时表还不熟悉,希望高人指点迷津。


...全文
309 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
heyixiang 2005-03-17
  • 打赏
  • 举报
回复
那我就晕了
heyixiang 2005-03-17
  • 打赏
  • 举报
回复
现在是先级联操作完再激发每个表上的触发器,就是说如果TableA的触发器执行了,就不存在级联错误,那么TableB和TableC的触发器都会触发。

按照aflyingpig(毛毛)的观点,TableA、TableB、TableC三个表删除的数据都存放在Deleted中,是这个意思吗?
DST_good 2005-03-17
  • 打赏
  • 举报
回复
当delete from tableA where ....时,
TableA 的deleted 表中存放执行delete from tableA where ....操作后所删除的数据
TableB 的deleted 表中存放级联删除tableB中的数据,如果级联错误,则不会触发
TableC 的deleted 表中存放级联删除tableC中的数据,如果级联错误,则不会触发
DST_good 2005-03-17
  • 打赏
  • 举报
回复
当delete from tableA where ....时,
TableA 的deleted 表中存放执行delete from tableA where ....操作后所删除的数据
TableB 的deleted 表中存放级联删除tableB中的数据,如果级联错误,则不会触发
TableC 的deleted 表中存放级联删除tableC中的数据,如果级联错误,则不会触发
heyixiang 2005-03-16
  • 打赏
  • 举报
回复
顶起
heyixiang 2005-03-11
  • 打赏
  • 举报
回复
顶起
heyixiang 2005-03-10
  • 打赏
  • 举报
回复
照这么说那在级联操作中,如题目中的例子,Deleted表中保存的就是对表TableC所影响的数据,

但现在是先级联操作完再激发每个表上的触发器,TableA、TableB、TableC三个表中的触发器都使用了Deleted,那头2个触发器不都不能正常激发了。
real_name 2005-03-10
  • 打赏
  • 举报
回复
Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。
xluzhong 2005-03-10
  • 打赏
  • 举报
回复
deleted表对于delete 和 update 操作,inserted 表对于insert 和 update操作,其表的结构跟触发的表结构相同

对于delete和insert相对比较简单,就是对表上次的delete和insert所影响的数据.分别存放于deleted和inserted表中

对于update,过程是先delete原数据,之后再insert更新数据.
实验5.1 存储过程的建立与使用 一、实验目的 理解存储过程的概念、作用、建立和调用方法。 二、实验原理 使用CREATE PROCEDURE语句创建存储过程,ALTER PROCEDURE语句修改存储过程,DROP PROCEDURE语句删除存储过程,存储过程有不带参数的、有带输入参数的、有带输出参数(output)的,还可以有带返回值的。创建好的存储过程可以使用EXEC procedure_name语句执行。 实验5.2 触发器的建立与使用 一、实验目的 理解触发器的概念和作用;了解触发器的分类及触发条件;掌握触发器的定义及应用。 二、实验原理 1、 使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。 2、 触发器分AFTER/FOR和INSTEAD OF两种类型:AFTER/FOR类型的触发器是在相应的触发语句(insertdelete、update)执行完后被触发的。如果触发语句对应的表上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的AFTER/FOR类型的触发器。INSTEAD OF类型的触发器会在触发语句(insertdelete、update)执行之前被触发,并取代相应的触发语句。 3、 在表或视图上,每个INSERT、UPDATE或DELETE语句只能创建一个INSTEAD OF类型的触发器,无法为有外键约束且指定为级联删除或级联修改的表创建DELETE或UPDATE语句上的INSTEAD OF 类型的触发器。 SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行INSERT时,INSERTED表中保存要向表中插入的所有行;当执行DELETE时,DELETED表中保存要从表中删除的所有行;当执行UPDATE时,修改前的行保存在DELETED表中,修改后的行保存在INSERTED行中。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧