我在SQL Server 2005数据库中有一个带有触发器的表,该触发器应该在每次插入新记录时将记录添加到另一个表中。看来工作正常,但是如果我在使用子查询作为值源的主表上执行"插入到",即使将多个记录添加到主表,触发器也只会在另一个表中插入一条记录。我希望为添加到主表的每个新记录触发触发器。在2005年有可能吗?
我正在执行的插入操作是:
1
| INSERT INTO [tblMenuItems] ([ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID]) SELECT [ID], [MenuID], [SortOrder], [ItemReference], [MenuReference], [ConcurrencyID] FROM [IVEEtblMenuItems] |
这是触发器的样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 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 |
您的触发器仅使用\\'Inserted \\'中的第一行。第一次处理SQL触发器时??,这是一个常见的误解。触发器按更新触发,而不按行触发。
例如,如果您执行以下操作:-
更新产品
设置标题= \\'geoff de geoff \\'
这将更新所有产品,但是product表上的触发器只会触发一次。
您在触发器中插入的\\'table \\'将包含所有行。您必须使用游标遍历"插入",或者更好地将"插入"连接到要更新的表。
请查找触发器的多行注意事项
触发器内的光标是什么?了解如何基于集合进行编程,游标在T-SQL中是邪恶的,仅应用于对一堆表进行碎片整理/更新统计信息/其他维护
对于执行的每个INSERT语句,触发器仅触发一次-对于插入的每个记录,触发器不会触发一次。
在触发器中,您可以访问称为插入的\\'virtual \\'表,以获取所插入记录的详细信息。
即:
1
| SELECT COUNT(*) FROM inserted |
将返回插入的记录数。
我只想在他的回答上第二个@Gordon Bell ...
"捕获"值在插入它们的那一刻。在这种情况下,您真的不需要游标(或者您有理由吗?)。
您可能需要一个简单的TRIGGER:
http://dbalink.wordpress.com/2008/06/20/how-to-sql-server-trigger-101/