【问题标题】:SQL Server 2005 insert trigger not inserting enough recordsSQL Server 2005 插入触发器未插入足够的记录
【发布时间】:2008-08-20 15:26:06
【问题描述】:

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


    【解决方案1】:

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

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

    更新产品 设置标题 = 'geoff de geoff'

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

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

    【讨论】:

      【解决方案2】:

      请查找multi row consideration for triggers 触发器内的光标是什么?了解如何基于集合编程,游标在 T-SQL 中是邪恶的,只能用于碎片整理/更新统计信息/其他维护一堆表

      【讨论】:

        【解决方案3】:

        触发器只为每个执行的 INSERT 语句触发一次 - 而不是为每条插入的记录触发一次。

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

        即:

        SELECT COUNT(*) FROM inserted 
        

        将返回插入的记录数。

        【讨论】:

          【解决方案4】:

          我只想对@Gordon Bell 的回答表示赞同...

          在它们被插入的那一刻“捕捉”这些值。在这种情况下,您实际上并不需要光标(或者您可能有原因?)。

          一个简单的 TRIGGER 可能就足够了:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-11-09
            • 1970-01-01
            • 1970-01-01
            • 2016-01-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多