【发布时间】:2015-01-20 12:46:35
【问题描述】:
请帮忙,我一直在尝试创建一个更新触发器,以便在使用特定值更新数据后将数据插入到特定表中。 “公认”。由于某种原因,触发器没有触发
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[TRGIU_CLEARING_SAMPLE_RESULT]') and OBJECTPROPERTY(id, N'IsTrigger') = 1)
DROP TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT]
GO
CREATE TRIGGER [dbo].[TRGIU_CLEARING_SAMPLE_RESULT] ON [dbo].[CLEARING_BATCH]
AFTER INSERT
AS
IF UPDATE(QM_STATUS)
BEGIN
Declare @QM_Status Varchar(12),
@QM_Status_Old Varchar(12),
@Submission_Pk Uniqueidentifier
SELECT @QM_Status = I.QM_STATUS,
@QM_Status_old = D.QM_STATUS,
@Submission_Pk = I.PK
--@Lab_used = LE.ID
FROM CLEARING_BATCH CB
LEFT JOIN SAMPLE_RESULT SR ON CB.PK = SR.PPK
JOIN INSERTED I ON SR.PK = I.PPK
JOIN DELETED D ON I.PK = D.PK
IF(@QM_Status = 'Accepted' and (@QM_Status <> @QM_Status_old or @QM_Status_old is null))
begin
INSERT INTO BATCH(PPK,BATCH_ID)
SELECT CB.PK,CB.BATCH_ID
FROM LABORATORY L
JOIN CLEARING_BATCH CB ON L.PK = CB.PPK
JOIN CLEARING_SAMPLE_RESULT CSR ON CB.PK = CSR.PPK
LEFT JOIN BATCH B ON CB.PK = B.PPK
WHERE B.PPK IS NULL
UPDATE BATCH
SET BATCH_ID = CB.BATCH_ID
FROM BATCH B
JOIN CLEARING_BATCH CB ON B.PPK = CB.PPK
END
end
GO
【问题讨论】:
-
在任意审计表中添加一个插入来查看正在触发的内容,即在您的 IF 之前,以查看 IF 没有停止正在运行的代码。甚至可能添加多个插入以查看它被“抛出”的位置。
-
@BethuelMhiongo,在您的情况下,触发器不应该是 AFTER UPDATE 吗?
-
你已经定义了一个
AFTER INSERT触发器 - 这将在任何INSERT之后触发 - 而不是UPDATE!你需要一个AFTER UPDATE触发器... -
此外,您的代码似乎假设所有操作都只会影响一行。如果操作影响三行,您期望
@QM_Status的值是多少? “第一”行,“最后”行,“中间”行,随机,...? -
@AnthonyHorne 在我将插入添加到任意审计表后,我能够看到当 QM_Status 更改为“已接受”时触发器正在触发,唯一的问题是它没有插入数据插入语句。但是,我设法通过修复我的联接和改进我的 where 条件来解决这个问题。 Eduard 和 marc_s 感谢您的提醒
标签: sql-server triggers