После вставки обновите триггер отметки времени с помощью первичного ключа из двух столбцов. - PullRequest
4 голосов
/ 23 сентября 2011

У меня есть простая таблица сведений, например, так:

listid
custid
status
last_changed

Первичный ключ состоит из listid и custid.

Теперь я пытаюсь настроить триггерэто устанавливает столбец last_changed на текущую дату и время каждый раз, когда происходит вставка или обновление.Я нашел много информации о том, как это сделать с одним столбцом PK, но с несколькими PK путает правильное указание PK из таблицы INSERTED.

Триггер должен работать в SQLServer 2005/2008 / R2.

Спасибо за работающий код триггера!

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

Ответы [ 3 ]

10 голосов
/ 23 сентября 2011

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

CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
AFTER INSERT, UPDATE 
AS
  UPDATE dbo.YourTable
  SET last_changed = GETDATE()
  FROM Inserted i
  WHERE dbo.YourTable.listid = i.listid AND dbo.YourTable.custid = i.custid

Вам просто нужно установить соединение между двумятаблицы (ваша собственная таблица данных и псевдо-таблица Inserted) в обоих столбцах ...

Я что-то упустил ??.....

1 голос
/ 23 сентября 2011
    CREATE TRIGGER dbo.trgAfterUpdate ON dbo.YourTable
    AFTER INSERT, UPDATE 
    AS
      UPDATE dbo.YourTable
      SET last_changed = GETDATE()
      FROM Inserted i
      JOIN dbo.YourTable.listid = i.listid AND dbo.YourTable.custid = i.custid
    WHERE NOT EXISTS
(SELECT 1 FROM Deleted  D Where D.listid=I.listid AND D.custid=i.custid AND (D.status=i.status) 

Здесь я предполагаю, что столбец stasus не обнуляется.Если да, вы должны добавить дополнительный код, чтобы проверить, является ли один из столбцов NULL

0 голосов
/ 23 сентября 2011

Вы можете проверить каждое поле в триггере, сравнив данные из вставленной и удаленной таблицы, как показано ниже:

    CREATE TRIGGER [dbo].[tr_test] ON [dbo].[table]
    AFTER INSERT, UPDATE
    AS 
    BEGIN
    DECLARE @old_listid INT
    DECLARE @old_custid INT
    DECLARE @old_status INT

    DECLARE @new_listid INT
    DECLARE @new_custid INT
    DECLARE @new_status INT

    SELECT @old_listid=[listid], @old_custid=[custid], @old_status = [status] FROM [deleted]

    SELECT @new_listid=[listid], @new_custid=[custid], @new_status = [status] FROM [inserted]

    IF @oldstatus <> @new_status
    BEGIN
        UPDATE TABLE table SET last_changed = GETDATE() WHERE [listid] = @new_listid AND [custid] = @new_custid 
    END

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