我在让我的触发器与多个记录一起工作时遇到了麻烦,同时还包含我需要在插入记录之前进行测试的if/else逻辑。
我在这里的目标是使系统的前端用户能够在值1、2和3之间更改事件类型,但是如果他们将其更改为事件类型1,那么他们必须输入发生日期,否则事务将回滚。如果他们确实输入了发生日期,那么交易将被输入。下面的逻辑适用于通过前端更新的任何1条记录,但问题是,当通过SQL编写多个更改时,我收到错误:
"Msg 512,级别16,状态1,过程TG_tbl_LE_Event_Occurence_Date_Validation,第9行子查询返回多个值。当子查询紧跟在=、!=、<、<=、>、>=之后,或者子查询用作表达式时,不允许这样做。语句已被终止。"
我知道触发器可以重写以解释多个记录,但我找不到一种方法来编写If Else测试仍然起作用的地方。
ALTER TRIGGER [dbo].[TG_tbl_LE_Event_Occurence_Date_Validation]
ON [dbo].[tbl_LE_Event]
AFTER update
AS
DECLARE @InsertID int
SET @InsertID = (Select Event_ID from Inserted)
IF (
SELECT COUNT(*)
FROM inserted
WHERE inserted.Occurence_Date is null and inserted.Event_Type_ID = 1) > 0
BEGIN
ROLLBACK TRAN
RAISERROR('#####OCCURENCE DATE IS A REQUIRED FIELD FOR TYPE 1 EVENTS. PLEASE ENTER AN OCCURENCE DATE OR THIS CHANGE WILL NOT BE SAVED#####',10,1)
END ELSE
UPDATE dbo.tbl_LE_Event
SET dbo.tbl_LE_Event.Event_Type_ID = Inserted.event_type_ID,
dbo.tbl_LE_Event.Occurence_Date = Inserted.Occurence_Date
FROM inserted
JOIN dbo.tbl_LE_Event ON dbo.tbl_LE_Event.Event_ID = @InsertID
去我能够解决多个记录发生的错误。似乎代码不喜欢使用变量的ID,我包括以下修订:
CREATE TRIGGER [dbo].[TG_tbl_LE_Event_Occurence_Date_Validation]
ON [dbo].[tbl_LE_Event]
AFTER update
AS
IF (SELECT count (*)FROM inserted
WHERE inserted.Occurence_Date is null and inserted.Event_Type_ID = 1) >0
BEGIN
rollback tran
raiserror('#####OCCURENCE DATE IS A REQUIRED FIELD FOR LOSS EVENTS. PLEASE ENTER AN OCCURENCE DATE OR THIS CHANGE WILL NOT BE SAVED#####',10,1)
END
ELSE update dbo.tbl_LE_Event
SET dbo.tbl_LE_Event.Event_Type_ID = Inserted.event_type_ID,
dbo.tbl_LE_Event.Occurence_Date = Inserted.Occurence_Date
from inserted join dbo.tbl_LE_Event on dbo.tbl_LE_Event.Event_ID = inserted.Event_ID
GO