我无法让我的触发器使用多个记录,同时还包含在插入记录之前进行测试所需的if / else逻辑。
我的目标是让系统的前端用户在值1,2和3之间更改事件类型,但如果他们将其更改为事件类型1,则他们必须输入发生日期,否则交易将回滚。如果他们确实输入了发生日期,那么将输入交易。以下逻辑适用于通过前端更新的任何1条记录,但问题是当通过SQL写入多个更改时我收到错误:
“消息512,级别16,状态1,过程TG_tbl_LE_Event_Occurence_Date_Validation,第9行子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,>时,不允许这样做。 =或子查询用作表达式时。 该语句已终止。 “
我知道触发器可以重写以考虑多个记录,但是我找不到在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
GO
答案 0 :(得分:0)
我能够解决多条记录发生的错误。似乎代码不喜欢使用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