2010-11-06 12 views
6

Quiero insertar filas en la tabla de auditoría cada vez que se inserta, actualiza o elimina en la tabla maestra "Tabla1" - no importa qué columna se cambie/inserte. También quiero agregar I, U o D en insertar, actualizar o eliminar. Para insertar y eliminar estoy comprobando si existen filas en la tabla insertada y eliminada. Cuál es la mejor manera de acercarse a la actualización.Disparador para insertar, actualizar, eliminar

Mi código para insertar y eliminar es:

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 

amable ayuda!

Respuesta

5

Para las actualizaciones, los valores originales de la fila se agregarán a la tabla eliminada, y los nuevos valores de la fila se agregarán a la tabla insertada. Por lo tanto, para identificar las inserciones, eliminaciones y cambios que harían el siguiente

  • Inserciones - obtener las filas del insertada que no están en borrada
  • Borra - obtener las filas de eliminados que no están en insertado.
  • Actualizaciones - obtener las filas que se encuentran en ambos inserted y deleted
+0

¡Gracias! También probará AutoAudit. –

4

¿Ha considerado usar AutoAudit?

AutoAudit es un servidor SQL Server (2005, 2008) utilidad Código-Gen que crea Auditoría Trail disparadores con:

  • Creado, CreatedBy, Modificado, ModifiedBy y rowversion (incrementando INT) columnas a la tabla
  • caso
  • Insertar registran en la tabla Auditar
  • Actualizaciones valores antiguos y nuevos registran en la tabla Auditar
  • registros borrar una valores finales ll a la auditoría tbale
  • fin de reconstruir las filas eliminadas
  • UDF para reconstruir Fila Historia
  • esquema auditar el gatillo para realizar un seguimiento de cambios de esquema
  • Re-Code-gens se dispara cuando Modificar tabla cambia la tabla
5

A continuación se muestra un ejemplo de un disparador generado por ApexSQL Audit

No es una herramienta barata, pero es probable que pueda utilizarlo en modo de prueba a Termina el trabajo.

Observe la parte INSERT INTO dbo.AUDIT_LOG_DATA y repítalo para cada columna que desee auditar.

Existen dos tablas en el fondo para almacenar los datos y varios procedimientos almacenados también, pero esto lo ayudará a avanzar en la dirección correcta.

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), 
    [email protected]_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 
Cuestiones relacionadas