7

我在表TEST上触发了 UPDATETRIGGER

它被编写为在更新 TEST 表时被调用。

现在在这个UPDATETRIGGER中更新同一个TEST表的列。

这会是递归的吗?

我的触发器和表在 MS SQL 数据库中。从表值中我看到它并没有发生这种情况,任何人都可以解释一下。

USE [TESTING]
GO
/****** Object:  Trigger [dbo].[UPDATETRIGGER] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[UPDATETRIGGER] on [dbo].[TEST]
 FOR UPDATE 
 AS
  UPDATE dbo.TEST
    SET lastEditedDate=GetDate()
    FROM INSERTED newdata
    WHERE TEST.MasterK = newdata.MasterK
4

2 回答 2

4

触发事件可以在另一个触发动作中触发。一个触发器执行甚至可以在另一个表或同一个表上触发。此触发器称为 NESTED TRIGGER 或 RECURSIVE TRIGGER。SQL Server 中的嵌套触发器支持最多 32 级的触发器嵌套。

嵌套意味着当一个触发器被触发时,它也会导致另一个触发器被触发。如果触发器创建了不定式循环,则嵌套级别 32 将被超出,触发器将取消并显示错误消息。递归触发器是当触发器触发并执行将导致相同触发器触发的语句时。

禁用嵌套/递归触发器:以下脚本将停止执行所有嵌套触发器。

sp_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO

还有另一种停止触发递归的方法:

ALTER DATABASE databasename
SET RECURSIVE_TRIGGERS ON | OFF

将触发器嵌套限制在一定级别将以下脚本放入触发器代码中。这将在特定级别后停止触发递归。在以下情况下,它将在 5 次递归后停止。

IF ((
SELECT TRIGGER_NESTLEVEL()) > 5 )
RETURN

参考:- http://blog.sqlauthority.com/2007/05/18/sql-server-2005-understanding-trigger-recursion-and-nesting-with-examples/

于 2014-11-11T06:13:10.617 回答
0

MS SQL 有一些属性集,除非您打开它们,否则它们不允许触发递归触发器。好吧,它将触发递归/嵌套触发器 32 次,然后失败。此外,这是一个更新触发器,而不是更新之前/之后的触发器,因此它取代了更新功能本身。

之后(对于)/之前

这两种类型在数据库在更新中实际执行的操作之上创建了功能。因此,如果更改之前或之后的信息,数据库原始更新功能将再次触发,然后您就进入了循环。

代替

这会覆盖数据库的正常功能,并且只会在发生更新时执行您告诉它执行的操作。在数据库中更新实际上是删除/插入的组合。当我第一次意识到这一点时,这让我大吃一惊。

于 2014-11-11T06:11:18.473 回答