Как обновить одну таблицу с помощью триггера в MS SQL 2008 - PullRequest
1 голос
/ 04 мая 2010

У меня есть таблица PeroidicDeduction и поля ID (автоинкремент), TotalDeduction (например, это может быть заем), Оплачено (на что вычет за каждый месяц), RemainingAmount,

Я хочу, чтобы каждый раз, когда я вставлял или обновлял таблицу, RemainingAmount получал бы значение TotalDeduction-SUM (Платный) .... и записывал следующий триггер ..., но он не работает для меня

CREATE TRIGGER dbo.UpdatePD ON PeroidicDedcution ПОСЛЕ ВСТАВКИ, ОБНОВЛЕНИЕ

AS

НАЧАТЬ

ОБНОВЛЕНИЕ PeroidicDedcution SET REmaininAmoubnt = (ВЫБЕРИТЕ TotalDeduction- (ВЫБЕРИТЕ СУММУ (платную) ОТ PeroidicDeduction) ОТ PeroidicDeduction)

END

ПРИМЕЧАНИЕ: на одном столе

Ответы [ 2 ]

2 голосов
/ 04 мая 2010

Создайте два триггера: INSTEAD OF UPDATE и INSTEAD OF INSERT. Вот код для INSTEAD OF UPDATE:

CREATE TRIGGER dbo.UpdatePD ON PeroidicDedcution 
INSTEAD OF Update
AS
SET NOCOUNT ON

UPDATE p
    SET col1=i.col1
       ,col2=i.col2
    FROM INSERTED  i
        INNER JOIN PeroidicDedcution p ON i.PK=p.PK

UPDATE PeroidicDedcution 
    SET REmaininAmoubnt=(SELECT TotalDeduction-(SELECT SUM(Paid) FROM PeroidicDeduction) FROM PeroidicDeduction)
go

Будет выполнено как оригинальное обновление, которое запускает триггер, так и логика SUM от триггера в вопросе.

вот триггер INSTEAD OF INSERT:

CREATE TRIGGER dbo.InsertPD ON PeroidicDedcution 
INSTEAD OF INSERT
AS
SET NOCOUNT ON

INSERT INTO PeroidicDedcution
    (col1, col2, ...)
    SELECT
       col1, col2, ...
    FROM INSERTED

UPDATE PeroidicDedcution 
    SET REmaininAmoubnt=(SELECT TotalDeduction-(SELECT SUM(Paid) FROM PeroidicDeduction) FROM PeroidicDeduction)
go
1 голос
/ 04 мая 2010

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

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