Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在SQL Server中,后插入触发器能否在同一个表中具有INSERT语句?_Sql Server_Triggers - Fatal编程技术网

Sql server 在SQL Server中,后插入触发器能否在同一个表中具有INSERT语句?

Sql server 在SQL Server中,后插入触发器能否在同一个表中具有INSERT语句?,sql-server,triggers,Sql Server,Triggers,我不熟悉SQL Server触发器 假设我们在insert之后为表A编写一个触发器,在该触发器中,我们可以对同一个表(即表A)执行insert操作吗 有什么建议吗?是的,如果您可以禁用递归触发器 SP_CONFIGURE 'nested_triggers',0 GO RECONFIGURE GO 是的,你可以: CREATE TABLE tab(a INT); INSERT INTO tab(a) VALUES (1); CREATE TRIGGER trg_tab ON tab AF

我不熟悉SQL Server触发器

假设我们在insert之后为表A编写一个
触发器,在该触发器中,我们可以对同一个表(即
表A
)执行
insert
操作吗


有什么建议吗?

是的,如果您可以禁用递归触发器

SP_CONFIGURE 'nested_triggers',0
GO
RECONFIGURE
GO
是的,你可以:

CREATE TABLE tab(a INT);

INSERT INTO tab(a) VALUES (1);

CREATE TRIGGER trg_tab ON tab
 AFTER INSERT
AS
   INSERT tab
   SELECT a+1 FROM inserted;

INSERT INTO tab(a) VALUES (10);

SELECT *
FROM tab;
结果:

a
1
10
11
您可以使用来控制触发器应该或不应该运行的时间:

CREATE TRIGGER TR_YourTable_AfterInsert ON YourTable
  AFTER INSERT
AS
BEGIN
  DECLARE @contextInfo VARBINARY(128)
  SELECT @contextInfo = CONTEXT_INFO()

  IF (@contextInfo != 0x123456) BEGIN
    INSERT INTO YourTable ...
  END

  SET CONTEXT_INFO 0x123456 --Setting the context info to prevent nested execution.
END
现在,您可以在插入之前显式设置值:

SET CONTEXT_INFO NULL; -- resetting to default
                       -- (not necessary when you are on a new connection)
INSERT INTO YourTable...

回答标题中的问题:是的,插入后触发器可以将行插入到同一个表中,但根据服务器的配置,它可能导致嵌套触发器执行。

True,很好。然而,如果是这种情况,您有一个varbinary(128)字段来存储其中的任何内容,因此将其拆分为块非常有帮助。