Триггер для вставки, обновления, удаления - PullRequest
6 голосов
/ 06 ноября 2010

Я хочу вставлять строки в таблицу аудита всякий раз, когда в основной таблице «Таблица1» происходит вставка, обновление или удаление - независимо от того, какой столбец изменен / вставлен.Я также хочу добавить I, U или D при вставке, обновлении или удалении.Для вставки и удаления я проверяю, существуют ли строки во вставленной и удаленной таблице.Как лучше всего подойти к обновлению.

Мой код для вставки и удаления:

CREATE TRIGGER [dbo].[tr_Table1_InsertUpdate_Table1History_Insert]
ON [dbo].[Table1]
FOR INSERT, DELETE, UPDATE

AS
BEGIN
 IF EXISTS(SELECT * FROM Inserted)
 BEGIN
  INSERT INTO Table1History(...., ModificationType)
  SELECT ..., 'I'
  FROM Inserted
 END


 IF EXISTS(SELECT * FROM Deleted)
 BEGIN
  INSERT INTO Table1History(..., ModificationType)
  SELECT ..., 'D'
  FROM Deleted
 END

END
GO

Пожалуйста, помогите!

Ответы [ 3 ]

5 голосов
/ 06 ноября 2010

Для обновлений исходные значения для строки будут добавлены в удаленную таблицу, а новые значения для строки будут добавлены во вставленную таблицу. Итак, чтобы идентифицировать вставки, удаления и обновления, вы должны сделать следующее

  • Вставки - получить вставленные строки, которые не были удалены
  • Удалить - получить строки из удаленных, которые не вставлены.
  • Обновления - получить строки, которые как вставлены, так и удалены
5 голосов
/ 08 августа 2013

Ниже приведен пример триггера, сгенерированного ApexSQL Audit

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

Обратите внимание на часть INSERT INTO dbo.AUDIT_LOG_DATA и повторите ее для каждого столбца, который вы хотите проверить.

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

CREATE TRIGGER [dbo].[tr_d_AUDIT_TableName]
ON [dbo].[TableName]
FOR DELETE
NOT FOR REPLICATION
AS
BEGIN
DECLARE 
    @IDENTITY_SAVE              varchar(50),
    @AUDIT_LOG_TRANSACTION_ID       Int,
    @PRIM_KEY               nvarchar(4000),
    --@TABLE_NAME               nvarchar(4000),
    @ROWS_COUNT             int

SET NOCOUNT ON


Select @ROWS_COUNT=count(*) from deleted
Set @IDENTITY_SAVE = CAST(IsNull(@@IDENTITY,1) AS varchar(50))

INSERT
INTO dbo.AUDIT_LOG_TRANSACTIONS
(
    TABLE_NAME,
    TABLE_SCHEMA,
    AUDIT_ACTION_ID,
    HOST_NAME,
    APP_NAME,
    MODIFIED_BY,
    MODIFIED_DATE,
    AFFECTED_ROWS,
    [DATABASE]
)
values(
    'TableName',
    'dbo',
    3,  --  ACTION ID For DELETE
    CASE 
      WHEN LEN(HOST_NAME()) < 1 THEN ' '
      ELSE HOST_NAME()
    END,
    CASE 
      WHEN LEN(APP_NAME()) < 1 THEN ' '
      ELSE APP_NAME()
    END,
    SUSER_SNAME(),
    GETDATE(),
    @ROWS_COUNT,
    'DatabaseName'
)


Set @AUDIT_LOG_TRANSACTION_ID = SCOPE_IDENTITY()

INSERT
INTO dbo.AUDIT_LOG_DATA
(
    AUDIT_LOG_TRANSACTION_ID,
    PRIMARY_KEY_DATA,
    COL_NAME,
    OLD_VALUE_LONG,
    DATA_TYPE
    , KEY1
)
SELECT
    @AUDIT_LOG_TRANSACTION_ID,
    convert(nvarchar(1500), IsNull('[Order_ID]='+CONVERT(nvarchar(4000), OLD.[Order_ID], 0), '[Order_ID] Is Null')),
    'Order_ID',
    CONVERT(nvarchar(4000), OLD.[Order_ID], 0),
    'A'
    ,  CONVERT(nvarchar(500), CONVERT(nvarchar(4000), OLD.[Order_ID], 0))
FROM deleted OLD
WHERE
    OLD.[Order_ID] Is Not Null
END
4 голосов
/ 06 ноября 2010

Рассматривали ли вы использование AutoAudit ?

AutoAudit - это SQL Server (2005, 2008) Утилита Code-Gen, которая создает Аудит Триггеры следа с:

  • Created, CreatedBy, Modified, ModifiedBy и RowVersion (увеличивая INT) столбцы таблицы
  • Вставить событие, зарегистрированное в таблице аудита
  • Обновляет старые и новые значения, занесенные в таблицу аудита
  • Удалить записывает все окончательные значения в таблицу аудита
  • просмотр для восстановления удаленных строк
  • UDF для реконструкции истории строк
  • Схема аудита Запуск для отслеживания изменений схемы
  • Re-code-gens срабатывает, когда Alter Table меняет таблицу
...