提问人:Jason Orman 提问时间:11/14/2023 最后编辑:Jason Orman 更新时间:11/15/2023 访问量:72
触发器未在 SQL Server 中触发
Trigger is not firing in SQL Server
问:
我创建了以下触发器,它应该正在寻找更新。我的理解是,更新会在表和表中创建一个条目。所以我不确定为什么以下内容不起作用。(它正在检查值是否从一个更改为另一个,如果是,请将其记录在第二个表中)。DELETED
INSERTED
CREATE TRIGGER [dbo].[captureNameChainToLocateComplete]
ON [dbo].[tblLand]
AFTER UPDATE
AS
BEGIN
DECLARE @old AS varChar(50)
DECLARE @new AS varChar(50)
DECLARE @name AS varchar(50)
DECLARE @now AS dateTime
DECLARE @recordId AS varchar(50)
SELECT @old = d.sSubdivision FROM DELETED d
SELECT @new = i.sSubdivision FROM INSERTED i
SELECT @name = (SELECT TOP 1 sHistoryUser
FROM tblDocumentHistory
ORDER BY dtHistoryDate DESC)
SELECT @recordId = (SELECT TOP 1 iRecordId
FROM tblDocumentHistory
ORDER BY dtHistoryDate DESC)
SELECT @now = (SELECT GETDATE())
IF @old = 'NAME CHAIN' AND @new = 'LOCATE COMPLETE'
BEGIN
INSERT INTO nameChainLog (recDate, irecordId, userName)
VALUES (@now, @recordId, @name)
END
ELSE
BEGIN
INSERT INTO nameChainLog (recDate, irecordId, userName)
VALUES (@now, 'test', 'test')
END
END
编辑:第二个插入仅用于故障排除,以便在发生其他情况时尝试记录。
答:
1赞
Gesuele Russello
11/15/2023
#1
你应该尝试这样的事情,你需要涵盖多个更新
CREATE TRIGGER [dbo].[captureNameChainToLocateComplete]
ON [dbo].[tblLand]
AFTER UPDATE
AS
BEGIN
DECLARE @old AS varChar(50)
DECLARE @new AS varChar(50)
DECLARE @name AS varchar(50)
DECLARE @now AS dateTime
DECLARE @recordId AS varchar(50)
-- Use a cursor to handle multiple rows in DELETED and INSERTED
DECLARE cursorTrigger CURSOR FOR
SELECT d.sSubdivision, i.sSubdivision
FROM DELETED d
JOIN INSERTED i ON d.irecordId= i.irecordId
OPEN cursorTrigger
FETCH NEXT FROM cursorTrigger INTO @old, @new
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @name = (SELECT TOP 1 sHistoryUser
FROM tblDocumentHistory
ORDER BY dtHistoryDate DESC)
SELECT @recordId = (SELECT TOP 1 iRecordId
FROM tblDocumentHistory
ORDER BY dtHistoryDate DESC)
SELECT @now = GETDATE()
IF @old = 'NAME CHAIN' AND @new = 'LOCATE COMPLETE'
BEGIN
INSERT INTO nameChainLog (recDate, irecordId, userName)
VALUES (@now, @recordId, @name)
END
ELSE
BEGIN
INSERT INTO nameChainLog (recDate, irecordId, userName)
VALUES (@now, 'test', 'test')
END
FETCH NEXT FROM cursorTrigger INTO @old, @new
END
CLOSE cursorTrigger
DEALLOCATE cursorTrigger
END
评论