SQL Server 2005 插入触发器未插入足够的记录

SQL Server 2005 insert trigger not inserting enough records

提问人:Chris Tybur 提问时间:8/20/2008 更新时间:12/14/2010 访问量:11786

问:

我在 SQL Server 2005 数据库中有一个表,该表带有一个触发器,每当插入新记录时,该触发器都会将记录添加到其他表中。它似乎工作正常,但是如果我在使用子查询作为值源的主表上执行 Insert Into,则触发器只会在另一个表中插入一条记录,即使向主表添加了多条记录。我希望为添加到主表的每条新记录触发触发器。这在2005年可能吗?

我正在做的插入是:

INSERT INTO [tblMenuItems] ([ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID]) SELECT [ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID] FROM [IVEEtblMenuItems]

触发器如下所示:

CREATE TRIGGER [dbo].[tblMenuItemInsertSecurity] ON [dbo].[tblMenuItems] 
FOR INSERT
AS

Declare @iRoleID int
Declare @iMenuItemID int

Select @iMenuItemID = [ID] from Inserted

DECLARE tblUserRoles CURSOR FASTFORWARD FOR SELECT [ID] from tblUserRoles
OPEN tblUserRoles 
FETCH NEXT FROM tblUserRoles INTO @iRoleID 

WHILE (@@FetchStatus = 0)
  BEGIN
    INSERT INTO tblRestrictedMenuItems(
      [RoleID],
      [MenuItemID],
      [RestrictLevel])

      VALUES(
      @iRoleID,
      @iMenuItemID,
      1)    

    FETCH NEXT FROM tblUserRoles INTO @iRoleID 
  END

CLOSE tblUserRoles 
Deallocate tblUserRoles
sql-服务器

评论


答:

4赞 Andrew Rimmer 8/20/2008 #1

您的触发器仅使用“已插入”中的第一行。这是第一次处理 SQL 触发器时常见的误解。触发器每次更新触发,而不是每行触发。

例如,如果您执行以下操作:-

更新产品 SET TITLE = '杰夫·德·杰夫'

这将更新所有产品,但产品表上的触发器只会触发一次。

您在触发器中获取的插入“表”将包含所有行。您必须使用游标遍历 Inserted,或者最好将 Inserted 连接到要更新的表中。

1赞 Martin 8/20/2008 #2

触发器仅针对执行的每个 INSERT 语句触发一次,而不是针对插入的每条记录触发一次。

在触发器中,您可以访问名为 inserted 的“虚拟”表,以获取插入记录的详细信息。

结婚

SELECT COUNT(*) FROM inserted 

将返回插入的记录数。

2赞 SQLMenace 8/20/2008 #3

请查找触发器的多行注意事项 触发器内的光标是什么?了解如何基于编程集,游标在 T-SQL 中是邪恶的,只能用于对一堆表进行碎片整理/更新统计信息/其他维护

0赞 MarlonRibunal 10/22/2008 #4

我只想附议@Gordon贝尔的回答......

在插入值的那一刻“捕获”它们。在这种情况下,您并不真正需要光标(或者您有理由?

一个简单的 TRIGGER 可能就是您所需要的:

http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101/