Обновите ту же таблицу в триггере - PullRequest
2 голосов
/ 20 марта 2012

У меня есть таблица, в которой рассчитывается общий вычет и оставшийся вычет за предыдущий месяц.

И любое обновление в оставшемся вычете старого месяца должно повлиять на порядок следующих месяцев, поэтому я создалтриггер AFTER UPDATE для этой таблицы, но я заметил, что триггер не вызывается UPDATE в течение следующего месяца.

Проверьте код триггера

CREATE TRIGGER [dbo].[tgUpdateRemainingBalance]
ON [dbo].[GAT_MONTHLY_DEDUCTION] 
AFTER UPDATE
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @OldTotalDeduction INT 
DECLARE @NewTotalDeduction INT
DECLARE @OldRemainingToNextMonth INT
DECLARE @NewRemainingToNextMonth INT

SELECT @OldRemainingToNextMonth = RemainingToNextMonth,
@OldTotalDeduction = TotalDeduction
FROM DELETED

SELECT @NewRemainingToNextMonth = RemainingToNextMonth,
@NewTotalDeduction = TotalDeduction
FROM INSERTED

DECLARE @EmpNo BIGINT
DECLARE @RegDate DATETIME

SELECT @EmpNo = PersonnelNo, @RegDate = RegDate FROM INSERTED

IF (@OldRemainingToNextMonth <> @NewRemainingToNextMonth) OR (@OldTotalDeduction <> @NewTotalDeduction)
BEGIN
UPDATE GAT_MONTHLY_DEDUCTION
SET TotalDeduction = TotalDeduction - @OldRemainingToNextMonth + @NewRemainingToNextMonth,
Visited = 1
WHERE RegDate = DATEADD(month, 1, @RegDate) AND PersonnelNo = @EmpNo
END
END

Iя делаю обновление для той же таблицы, в которой есть эти триггеры, но вызов триггера в первый раз должен вызвать триггер снова для следующего обновления, но это не происходит.

Мне необходимо знать, как решить проблему.это.

Спасибо

1 Ответ

9 голосов
/ 20 марта 2012

Одна вещь, на которую следует обратить внимание: триггер SQL Server срабатывает один раз за оператор НЕ один раз на строку, как многие разработчики считают / предполагают)

Если этот оператор обновляет более одной строки, то псевдотаблицы Inserted и Deleted будут содержать несколько строк - поэтому вы выбираете как

SELECT 
    @NewRemainingToNextMonth = RemainingToNextMonth,
    @NewTotalDeduction = TotalDeduction
FROM INSERTED

потерпит неудачу - какую строку следует выбрать, если их пятьдесят * Inserted ??

Вам потребуется переписать триггер, чтобы иметь возможность обрабатывать несколько строк, обрабатываемых одновременно, в псевдотаблицах Inserted и Deleted ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...