none
Control de cambios en una fila RRS feed

  • Pregunta

  • Hola

    Estoy desarrollando una aplicación en la que necesito saber si una fila de una tabla fue modificada y cuando ocurrió dicha modificación.

    Mi idea es usar un campo en la tabla que pueda almacenar la fecha y hora en la que se modificó el registro y que ese campo sea actualizado en forma automática por el servidor cada vez que cualquier usuario haga un insert o update en cualquier campo de ese registro.

    Ejemplo:

    Tabla Usuarios

    CREATE TABLE usuarios(
    	cod_usuario int IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	nombre varchar(50) NOT NULL,
    	ultima_modificacion datetime NOT NULL -- este campo necesito que se actualice en forma automática cada vez que alguien ejecute las sentencias INSERT o UPDATE.
    )
    Mi idea es poder auditar cuando fue modificado el registro.


    martes, 10 de julio de 2018 14:35

Todas las respuestas

  • Hola,

    La funcionalidad de registro de cambios en SQL se llama CDC (Change Data Capture).

    Aunque buscando en Google puedes encontrar mucha información, lo básico sería:

    --Activar CDC en la base de datos:
    USE [TuBBDD]
    GO
    EXEC sys.sp_cdc_enable_db
    GO
    
    --Activar CDC en tu tabla:
    EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name   = N'Usuarios',
    @role_name     = N'CDC_Read',
    @supports_net_changes = 0
    GO
    
    --Añado una columna "EventDate" que registra el la fecha del cambio:
    ALTER TABLE cdc.dbo_Usuarios_CT ADD EventDate DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

    Una vez aquí, si haces operaciones sobre los datos de la tabla con CDC se irán registrando en la tabla que CDC crea para dicho registro.

    Puedes consultarlos mediante:

    SELECT 
    case [__$operation]
    	when 1 then 'Borrado'
    	when 2 then 'Inserción'
    	when 3 then 'OldValue'
    	when 4 then 'NewValue'
    end Operacion, *
     FROM [cdc].[dbo_Usuarios_CT]

    Espero que te sirva.

    Un saludo.

    Diego

    martes, 10 de julio de 2018 15:22
  • Aunque change data capture es una funcionalidad super cool, también es cierto que solo está en Enterprise edition y no siempre es así de sencillo.

    Si usas el tipo rowversion (o timestamp) tendrás que ese cambio se incrementa automáticamente cada vez que se modifica el registro, y lo mejor tu no tienes que hacer nada en absoluto, simplemente actuar como si ese campo no existiera. 

    la otra alternativa si quieres que sea un campo ultima_modificacion, puedes usar triggers para que te hagan ese trabajo. 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    martes, 10 de julio de 2018 15:49
    Moderador