Условный триггер SQL? - PullRequest
1 голос
/ 22 июля 2011

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

, поэтому у меня есть это прямо сейчас:

    for UPDATE
AS 
begin try
INSERT INTO tblHistorySource(*)
select *
from [DELETED]
end try

, ноМне нужно показать, как проверить, если tblHistorySource.status не равно delete.status и только затем скопировать данные ....

Ответы [ 3 ]

4 голосов
/ 22 июля 2011

Вы должны быть осторожны, работая с набором данных, а не только с одной записью за раз:

INSERT INTO tblHistorySource
SELECT *
FROM DELETED INNER JOIN
     INSERTED ON <<DELETED.PK = INSERTED.PK>>
WHERE DELETED.StatusValue <> INSERTED.StatusValue;

Условие соединения <<DELETED.PK = INSERTED.PK>>потребуется адаптировать к вашей схеме, так же как и настоящее имя StatusValue.

Если StatusValue обнуляем (спасибо Алекс), используйте вместо этого:

WHERE DELETED.StatusValue <> INSERTED.StatusValue
   OR DELETED.StatusValue IS NULL AND INSERTED.StatusValue IS NOT NULL
   OR DELETED.StatusValue IS NOT NULL AND INSERTED.StatusValue IS NULL;

Какиевозможно, можно упростить использование оболочки ISNULL(), но мне нужно знать тип данных.

1 голос
/ 22 июля 2011

Просто добавьте:

IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted))
BEGIN
...
END
0 голосов
/ 22 июля 2011

Вы можете сделать что-то вроде этого:

DECLARE @statusOldValue status_type
DECLARE @statusNewValue status_type

SELECT @statusOldValue = status FROM deleted

SELECT @statusNewValue= status FROM inserted

IF (@statusOldValue<>@statusNewValue) THEN
BEGIN
 -- Do what you want
END

Если у вас могут быть ситуации, когда несколько регистров обновляются одновременно, вам нужно поместить выражения WHERE в операторы SELECT и поместить ихв итерациях, чтобы обработать все регистры.

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