Как создать триггер для отслеживания последних измененных данных - PullRequest
0 голосов
/ 01 января 2011
CREATE TABLE Member
(
    memberID - PK
    memberName
    dateRegistered - one time process
);

CREATE TABLE MemberLastChanged
(
   memberID 
   memberName
   dateEntered
);

Если по какой-либо причине пользователь меняет свое имя пользователя, мне нужно отслеживать текущее измененное имя участника в таблице истории.

Например, текущая информация:

memberID: 5534memberName: james

Пользователь меняет его на:

memberID: 5534memberName: mark

К настоящему времени «Member» будет содержать текущие значения:

5534 и метка

AND

MemberLastChanged будет удерживаться:

5534 и james


Как мне добиться этого в t-sql с помощью триггера?

Ответы [ 3 ]

4 голосов
/ 01 января 2011
CREATE TRIGGER TRG_Member_U ON Member FOR UPDATE
AS
SET NOCOUNT ON

INSERT MemberLastChanged (memberID, memberName)
SELECT
   D.memberID, D.memberName
FROM
   DELETED D JOIN INSERTED I ON D.memberID = I.memberID
WHERE
   D.memberName <> I.memberName
GO

Кроме того, добавьте значение по умолчанию GETDATE для dateRegistered, чтобы оно записывалось автоматически.

Это также отфильтровывает фиктивные обновления путем сравнения новых и старых значений (INSERTED и DELETED).

INSERTED и DELETED - специальные таблицы, доступные только в триггере.

3 голосов
/ 01 января 2011

Вы создаете триггер UPDATE - триггеры имеют доступ к двум логическим таблицам, структура которых идентична таблице, для которой они определены:

  • INSERTED - новые данные для добавления в таблицу
  • DELETED, старые данные в таблице

См. эту статью MDSN об использовании этих логических таблиц.

С этими данными вы можете заполнить свою таблицу истории.

CREATE TRIGGER trg_Member_MemberUpdate
ON dbo.Member AFTER UPDATE
AS
    INSERT INTO dbo.MemberLastChanged(memberID, memberName)
    SELECT d.MemberID, d.MemberName
    FROM DELETED d
2 голосов
/ 01 января 2011

Вы хотите иметь триггер AFTER UPDATE в своей таблице пользователей - что-то вроде:

CREATE TRIGGER trg_MemberUpdated
ON dbo.Member AFTER UPDATE 
AS BEGIN
   IF UPDATE(memberName)
      INSERT INTO 
          dbo.MemberLastChanged(memberID, memberName, dateEntered)
          SELECT
             d.MemberID, d.MemberName, GETDATE()
          FROM 
             Deleted d
END

По сути, этот триггер проверяет, было ли обновлено свойство memberName; если это так, строка со старыми значениями (которые доступны в псевдотаблице Deleted внутри триггера UPDATE) вставляется в MemberLastChanged

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