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

时间:2008-08-20 15:26:07

标签: sql-server

我在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

4 个答案:

答案 0 :(得分:3)

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

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

更新产品 set title ='geoff de geoff'

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

您在触发器中插入的'表'将包含所有行。您必须使用光标循环插入,或者更好地将“已插入”连接到要更新的表。

答案 1 :(得分:2)

请查看multi row consideration for triggers 触发器内的光标是什么?了解如何基于程序集,游标在T-SQL中邪恶,并且只应用于对一堆表进行碎片整理/更新统计/其他维护

答案 2 :(得分:1)

触发器仅针对每个执行的INSERT语句触发一次 - 对于每个插入的记录都不会触发一次。

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

即:

SELECT COUNT(*) FROM inserted 

将返回插入记录的数量。

答案 3 :(得分:0)

我只想在@Gordon Bell上回答他的答案......

在插入时“捕获”值。在这种情况下你真的不需要光标(或者你有理由吗?)。

您可能只需要一个简单的TRIGGER:

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