После вставки триггер обновления не работает

У меня есть два триггера: «После вставки или обновления» и «Вместо вставки». Похоже, что триггер after не работает или не отправляет правильные данные.

Я проверил правильность работы хранимой процедуры Z_UpdateStageTable и триггера вместо вставки. Удаление триггера «Вместо вставки» не оказывает никакого влияния. Триггер After Insert, Update одно время работал правильно, я не вносил в него никаких изменений. Я пытался удалить его и добавить, но он по-прежнему не работает или содержит правильные данные.

Любые идеи?

Вместо вставки:

ALTER TRIGGER [DeleteExistingFilter]
   ON  [dbo].[Z_MobileSyncFilters]
INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON;
DELETE FROM Z_MobileSyncFilters WHERE UserID = (SELECT UserID FROM INSERTED);
INSERT INTO Z_MobileSyncFilters
SELECT *
FROM INSERTED;
END

После вставки обновить:

TRIGGER [UpdateStageTable] 
   ON  [dbo].[Z_MobileSyncFilters]
   AFTER INSERT,UPDATE
AS 
BEGIN
SET NOCOUNT ON;
DECLARE @AllWos AS VARCHAR(5000);
DECLARE @PmWos AS VARCHAR(5000);
DECLARE @RepWos AS VARCHAR(5000);
SET @AllWos = (SELECT AllWos FROM INSERTED);
SET @RepWos = (SELECT AllWos FROM INSERTED);
SET @PmWos = (SELECT AllWos FROM INSERTED);
EXEC Z_UpdateStageTable @AllWos;
EXEC Z_UpdateStageTable @RepWos;
EXEC Z_UpdateStageTable @PmWos;
END

person NitroxDM    schedule 24.02.2009    source источник


Ответы (3)


Есть ли опечатка в части SET триггера AFTER? Вы выбираете одно и то же в трех разных переменных.

Вместо того, чтобы подтверждать поведение Z_UpdateStageTable, я бы попытался заменить его чем-то очень простым (скажем, оператором sql без параметров), чтобы проверить, вызывается ли триггер. Возможно, sproc вызывается не с тем, с чем вы думаете, что он вызывается.

person MNGwinn    schedule 24.02.2009
comment
О! Я только что видел это. Спасибо! - person NitroxDM; 24.02.2009

Вы можете добавить операторы PRINT в триггер и вручную вставить из ManagementStudio/Enterprise Manager, чтобы увидеть, где триггер не работает.

Я вижу проблему, когда вы вставляете несколько записей в один оператор, так как SELECT FROM Inserted возвращает более 1 записи.

Вы также можете обновить оператор SET до SELECT @Var = AllWos FROM Inserted.

person devio    schedule 24.02.2009
comment
Хороший вызов оператора SET. Приложение (не мое) будет вставлять только одну запись за раз. Я не беспокоился о более чем одной строке. - person NitroxDM; 24.02.2009
comment
Вы не можете полагаться на это, базы данных зависят не только от приложения. - person HLGEM; 24.02.2009

Подождите секунду, если идентификатор пользователя является вашим PK, тогда Z_MobileSyncFilters еще не будет иметь данных, это также вместо триггера

весь этот блок на самом деле ничего не делает, зачем вам этот триггер?

DELETE FROM Z_MobileSyncFilters WHERE UserID = (SELECT UserID FROM INSERTED);
INSERT INTO Z_MobileSyncFilters
SELECT *
FROM INSERTED;

ваш второй триггер ошибочен, потому что он не будет работать, если у вас есть многострочная операция

почему у вас есть 2 триггера вставки (1 вместо 1 после) в этой таблице?

person SQLMenace    schedule 24.02.2009
comment
Приложение (не мое) получает новые данные при каждом подключении. К сожалению, приложение недостаточно умно, чтобы выполнять обновление, поэтому оно пытается выполнить вставку сразу после подключения. Без удаления это работает только в первый раз. - person NitroxDM; 24.02.2009
comment
Деннис прав, второй триггер неверен и не будет работать правильно, если произойдет вставка нескольких строк. Никогда не полагайтесь на вставку/обновление/удаление только одной строки в триггере. - person HLGEM; 24.02.2009