Почему SELECT возвращает NULL внутри триггера?

Рейтинг: 1Ответов: 1Опубликовано: 06.02.2023

Я создаю триггер, который уменьшает количество книг в библиотеке, когда удаляется читатель, который не вернул книги. Читатель может не вернуть много книг, поэтому записи о возврате книг просматриваются последовательно:
SELECT @idHistory = MIN ( ID ) FROM BookHistory WHERE ReaderID = @idColumn AND RealDate is null
Выполняя выборку вне триггера, ожидаемо выводится ID соответствующей записи. При отработке триггера выборка возвращает NULL. С чем это может быть связано?

CREATE TRIGGER [dbo].[Trigger_1] 
   ON [dbo].[Reader] 
   FOR DELETE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @idColumn INT
    SELECT @idColumn = MIN( ID ) FROM deleted

    WHILE @idColumn is not null
    BEGIN
        
        DECLARE @idHistory INT;
        -- В этом запросе ничего не возвращается
        SELECT @idHistory = MIN ( ID ) FROM BookHistory WHERE ReaderID = @idColumn AND RealDate is null

        WHILE @idHistory is not null
        BEGIN
            UPDATE Book SET Count = Count - 1 WHERE ID = (SELECT BookID FROM BookHistory WHERE ID = @idHistory)
            SELECT @idHistory = MIN ( ID ) FROM BookHistory WHERE ReaderID = @idColumn AND RealDate is null AND ID > @idHistory
        END

        SELECT @idColumn = MIN( ID ) FROM deleted WHERE ID > @idColumn
    END

END

Ответы

▲ 0

Возможно лучше убрать каскадное удаление и триггер, сделать вычисляемый столбец IsDeleted в таблице BookHistory со следующей логикой: если даты возврата нет, а с момента выдачи прошло N дней(месяцев, лет), то 1 иначе 0.

Так у тебя и история книг сохранится, и неожиданности с каскадным удалением уйдут, и недостатки триггера исчезнут вместе с ним.