2014-06-26 7 views
0

У меня возникли проблемы с запуском моего триггера с несколькими записями, а также с if/else-логикой мне нужно провести тест перед вставкой записей.SQL Update Trigger with If Else logic with Multiple Rows

Моя цель состоит в том, чтобы позволить внешнему пользователю системы изменять тип события между значениями 1,2 и 3, но если они меняют его на тип события 1, то они должны ввести дату возникновения, иначе транзакция будет откат. Если они вводят дату наступления события, транзакция будет введена. Следующая логика работает для любой 1 записи, обновленной через интерфейс, но проблема в том, что при изменении нескольких писем через SQL я получаю ошибку:

«Msg 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

Я не могу воссоздать вашу ошибку. Этот SQLFiddle (http://sqlfiddle.com/#!3/1b381/2), похоже, не делает тест COUNT (*) и добавляет нулевые даты, где event_type_id = 1. Желаю, чтобы я мог больше помочь - будет продолжать царапать мои глава. –

+0

Здравствуйте, спасибо, что посмотрели. Здесь оператор if пытается выяснить, пытается ли пользователь изменить тип события на 1, но не смог ввести дату появления. Если это так, верните транзакцию и вызовите ошибку. Продолжайте обновлять записи/с. – user3780847

ответ

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