SQL Server 2005插入触发器未插入足够的记录
时间:2020-03-05 18:41:10 来源:igfitidea点击:
我在SQL Server 2005数据库中有一个带有触发器的表,该触发器应该在插入新记录时将记录添加到其他表中。看来工作正常,但是如果我在使用子查询作为值源的主表上执行"插入到",则触发器将只在另一个表中插入一条记录,即使向主表中添加了多条记录。我希望为添加到主表的每个新记录触发触发器。在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触发器时,这是一个常见的误解。触发器是按更新触发的,而不是按行触发的。
例如,如果我们执行以下操作:
更新产品
设置标题='geoff de geoff'
这将更新所有产品,但是product表上的触发器只会触发一次。
我们在触发器中插入的"表"将包含所有行。我们必须使用游标遍历"插入",或者更好地将"插入"联接到要更新的表。
回答
对于每个执行的INSERT语句,触发器仅触发一次,而对于插入的每个记录,触发器不会触发一次。
在触发器中,我们可以访问称为插入的"虚拟"表,以获取插入记录的详细信息。
IE:
SELECT COUNT(*) FROM inserted
将返回插入记录的数量。
回答
请查找触发器的多行注意事项
触发器内的光标是什么?了解如何基于集合进行编程,游标在T-SQL中是邪恶的,仅应用于对一堆表进行碎片整理/更新统计信息/其他维护
回答
我只想在他的回答上第二个@Gordon Bell ...
在插入值时立即"捕获"值。在这种情况下,我们实际上并不需要光标(或者我们有理由吗?)。
一个简单的TRIGGER可能就是我们所需要的:
http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101/