У нас есть триггер, который динамически генерируется для набора из 40 таблиц или около того. Учитывая случай, когда триггер находится в таблице A
, он изменяет таблицу B
двумя способами:
- Устанавливает флаг грязи для существующих строк в таблице
B
- Вставляет пропущенные строки в таблицу
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