SQL Server запускает - один терпит неудачу, другой - нет - PullRequest
2 голосов
/ 17 августа 2011

У нас есть триггер, который динамически генерируется для набора из 40 таблиц или около того. Учитывая случай, когда триггер находится в таблице A, он изменяет таблицу B двумя способами:

  1. Устанавливает флаг грязи для существующих строк в таблице B
  2. Вставляет пропущенные строки в таблицу B

Существует связь между двумя таблицами, так что A. bID является внешним ключом для B. id.

На этой неделе мы пришли к выводу, что хотя бы в одной из таблиц триггер не выполняет шаг 2 (мы не уверены, выполняет ли он шаг 1). Но, похоже, он работает с большинством других таблиц.

<Ч />

По какой-то причине один из наших разработчиков изменил триггер на «более эффективный». Но тогда проблема, казалось, ушла ...

Мы не можем понять, чем отличаются эти два триггера, какие-либо идеи?

Сломанный триггер:

CREATE TRIGGER [A_Dirty] ON [A] AFTER INSERT, UPDATE, DELETE
BEGIN
    SET NOCOUNT ON;

    UPDATE [B] SET [timeDirty] = GETUTCDATE() WHERE [id] IN (SELECT [bID] FROM inserted);
    UPDATE [B] SET [timeDirty] = GETUTCDATE() WHERE [id] IN (SELECT [bID] FROM deleted);

    INSERT INTO [B] ([id], [timeDirty])
        SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
        WHERE [bID] NOT IN (SELECT [id] FROM [B])
END

Рабочий триггер:

CREATE TRIGGER [A_Dirty] ON [A] AFTER INSERT, UPDATE, DELETE
BEGIN
    SET NOCOUNT ON;

    UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM inserted WHERE [id] = [bID];
    UPDATE [B] SET [timeDirty] = GETUTCDATE() FROM deleted WHERE [id] = [bID];

    INSERT INTO [B] ([id], [timeDirty])
        SELECT DISTINCT [bID], GETUTCDATE()
            FROM inserted
        LEFT OUTER JOIN [B]
            ON [B].[id] = inserted.[bID]
        WHERE [B].[id] IS NULL
END

1 Ответ

1 голос
/ 17 августа 2011

Есть ли в [B] значения NID [id]? Если это так, NOT IN не будет работать правильно. Вам необходимо обновить следующее:

INSERT INTO [B] ([id], [timeDirty])
    SELECT DISTINCT [bID], GETUTCDATE() FROM inserted
    WHERE [bID] NOT IN (SELECT [id] FROM [B] WHERE [id] IS NOT NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...