【发布时间】:2018-05-27 22:17:18
【问题描述】:
我使用的是 SQL Server 2008。
我在表中定义了一个用于 INSERT、UPDATE 和 DELETE 操作的后触发器。我的问题是,目前我的触发器一次插入一条记录,我需要多条记录作为一个
SELECT TOP 1 @ParentID FROM ... WHERE ID = @ID
返回多个唯一记录。
(请参阅下面的评论“--此子查询返回超过 1 个值,因此我需要在搜索审核表中插入与返回一样多的 ParentID”)
我认为我需要使用游标,但我不确定在哪里声明和打开游标。
--CREATE PROCEDURE [dbo].[SP_Auditing]
-- @ID INT, @Code VARCHAR(3), @AuditType VARCHAR(10), @ParentCode VARCHAR(3) = NULL, @ParentID INT = NULL
--AS
--BEGIN
-- INSERT INTO myDB.dbo.Table1 (ID, Code, AuditType, ParentCode, ParentID)
-- VALUES(@ID, @Code, @AuditType, @ParentCode, @ParentID)
--END
GO
CREATE TRIGGER [dbo].[Tr_MyFavouriteTable_UPD_INSERT_DEL] ON [dbo].[MyFavouriteTable] AFTER INSERT, DELETE, UPDATE NOT FOR REPLICATION
AS
BEGIN
DECLARE @ID INT, @Code VARCHAR(3), @AuditType VARCHAR(10), @ParentCode VARCHAR(3), @ParentID INT SET @Code = 'DOC'
IF EXISTS (SELECT 1 FROM inserted) AND
NOT EXISTS (SELECT 1 FROM deleted)
BEGIN
SELECT TOP 1
@ID = ins.ID,
@ParentID = (
SELECT TOP 1 CAST(RIGHT(parentId,LEN(parentId) - LEN(LEFT(parentId,3))) AS INT)
FROM [MyDB].[dbo].[MyFavouriteTable] t WITH (NOLOCK)
INNER JOIN [MyDB2].[dbo].[MyView] v WITH (NOLOCK)
ON t.Id = v.ID
WHERE v.ID = @ID --284
), **-- this subquery returns more than 1 value, so I need to insert in the search Audit table as many ParentIDs as it returns**
@AuditType = 'INSERT' FROM inserted ins
IF @ID IS NOT NULL
AND
@ParentID IS NOT NULL
AND
@ParentCode IS NOT NULL
EXEC [MyDB].[dbo].SP_Auditing] @ID, @Code, @AuditType, @ParentCode, @ParentID
END
-- below is the same logic for UPDATE and DELETE actions...
上面的存储过程只是将数据插入到审计表中。
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: sql-server variables triggers cursor