提问人:Chris Tybur 提问时间:8/20/2008 更新时间:12/14/2010 访问量:11786
SQL Server 2005 插入触发器未插入足够的记录
SQL Server 2005 insert trigger not inserting enough records
问:
我在 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 触发器时常见的误解。触发器每次更新触发,而不是每行触发。
例如,如果您执行以下操作:-
更新产品 SET TITLE = '杰夫·德·杰夫'
这将更新所有产品,但产品表上的触发器只会触发一次。
您在触发器中获取的插入“表”将包含所有行。您必须使用游标遍历 Inserted,或者最好将 Inserted 连接到要更新的表中。
触发器仅针对执行的每个 INSERT 语句触发一次,而不是针对插入的每条记录触发一次。
在触发器中,您可以访问名为 inserted 的“虚拟”表,以获取插入记录的详细信息。
结婚
SELECT COUNT(*) FROM inserted
将返回插入的记录数。
请查找触发器的多行注意事项 触发器内的光标是什么?了解如何基于编程集,游标在 T-SQL 中是邪恶的,只能用于对一堆表进行碎片整理/更新统计信息/其他维护
我只想附议@Gordon贝尔的回答......
在插入值的那一刻“捕获”它们。在这种情况下,您并不真正需要光标(或者您有理由?
一个简单的 TRIGGER 可能就是您所需要的:
http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101/
评论