SQL Server 2008 - при вставке / обновлении триггер, который копирует значения в другую таблицу? - PullRequest
2 голосов
/ 09 апреля 2011

У меня есть две таблицы: Tasks и TasksHistory, по названию которых вы можете догадаться, что я хочу создать историю всего, что происходило в Задачах.Таким образом, каждая новая вставленная или обновленная строка должна попадать в таблицу истории, просто игнорируя ее удаление и сохраняя строку в истории.Моя идея состоит в том, чтобы история была точной копией исходной таблицы.

Как мне этого добиться?

1 Ответ

4 голосов
/ 09 апреля 2011

Довольно просто ...

CREATE TRIGGER TRG_Tasks_UI ON Tasks FOR INSERT,UPDATE
AS
SET XACT_ABORT, NOCOUNT ON

--Ignore zero row updates, inserts
IF NOT EXISTS (SELECT * FROM INSERTED) RETURN;

BEGIN TRY
    INSERT TasksHistory
       (col1, col2, ...)
    SELECT
       I.*
    FROM
       INSERTED I
       LEFT JOIN
       DELETED D ON I.key = D.Key
    WHERE
       D.Key IS NULL --insert only
       OR -- need null handling here
       I.col1 <> D.col1 OR I.col2 <> D.col2 OR ...;
END TRY
BEGIN CATCH
   IF XACT_STATE() <> 0 ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...