2009-05-15 20 views
8

Hace una semana hice una pregunta en SOF sobre la auditoría de cambios en los datos de SQL. Apareció lo de siempre sobre el uso de desencadenadores, también se mencionó CDC en SQL Server 2008.SQL Server 2008 Change Data Capture, ¿quién realizó el cambio?

Lo he estado probando hoy y hasta ahora todo bien, lo único que no veo es compatible manteniendo un registro de quién realmente hizo el cambio. ¿Quién ejecutó la declaración?

Me gustaría saber si alguien ha usado CDC para auditar y cómo ha realizado un seguimiento de quién realizó el cambio.

+1

¿Se puede saber cómo resolvió este problema? –

Respuesta

1

CDC realmente no está diseñada para la auditoría. Si está buscando capacidades de auditoría, debe usar SQL Server Audit.

+0

Eso no es estrictamente cierto. Aunque entiendo que CDC se usa para cosas como almacenamiento de datos, he leído varios artículos que he leído sugieren que CDC se puede usar para auditar cambios de datos como una alternativa asincrónica al uso de desencadenadores. Aunque estuvo de acuerdo, no fue diseñado para esto. – MrEdmundo

+2

La auditoría del servidor SQL no captura los valores de Antes y Después. Es sorprendente que MS haya tenido problemas para implementar dos enfoques (CDC y SSA) y ninguno de ellos resuelve el problema de la auditoría completa de los cambios. – tbone

+0

@tbone Creo que en realidad hay tres métodos. CDC, auditoría y seguimiento de cambios. Actualmente se diseñó un buen sistema de auditoría antes/después con CDC y una combinación de desencadenantes simples que CONTEXT_INFO ha rellenado la aplicación con el usuario (porque no está utilizando usuarios del servidor SQL) y otra información de estado. – GilesDMiddleton

0

Aunque no es ideal, el consenso general parece ser que CDC no capturará quién realizó el cambio, pero hemos implementado columnas CreatedBy/Date y UpdatedBy/Date que se pueden usar para ver quién activó el cambio. Para que eso funcione, por supuesto, la declaración SP o SQL que actualiza la fila necesita establecer explícitamente los campos UpdatedBy/Date apropiadamente usando suser_name() y getDate() respectivamente. Estoy de acuerdo en que sería bueno tenerlo listo para usar y esto hace que CDC haga algo para lo cual no estaba destinado, pero yo también estoy tratando de usar CDC para auditar los cambios en los datos asincrónicos en lugar de utilizar los desencadenantes tradicionales.

+0

Actualmente estamos utilizando CDC para el seguimiento de auditorías y este es el enfoque que hemos seguido. Agregamos una columna de ID de usuario de auditoría a cada tabla y modificamos nuestros procedimientos almacenados para actualizar esa columna. Puede que no sea la solución más bonita, pero funciona. – MrDustpan

1

MrEdmundo, CDC no está listo para el horario estelar en mi opinión. En la actualidad parece haber un poco de dificultad en lo que respecta a la implementación de un proyecto de base de datos desde Visual Studio con CDC habilitado (no le gustan los cambios de DDL). Además, parece que los CDC cuentan con un proceso integrado de limpieza del final de la vida útil de los datos, por lo que pueden ser malos momentos para usted si realmente desea mantener su historial de auditoría durante mucho tiempo.

Además, corrígeme si he entendido bien, pero parece Auditoría de SQL está orientado para auditar una gran cantidad de eventos que se producen en SQL Server como inicios de sesión fallidos, cambios DDL, etc.

de seguimiento de cambios es solo para DDL y no para DML, entonces no tienes suerte allí.

Si su intención es capturar el "viejo" registro que se actualizó o eliminó de una tabla, parece que la mejor respuesta es crear un Audit.TableName y un activador de actualización + eliminación en dbo.TableName. También asegúrese de que TableName incluya columnas de CreatedBy DEFAULT SUSER, CreatedDate DEFAULT getdate(), ModifiedBy, ModifiedDate.

6

alteré la tabla CDC usando directamente: ALTER TABLE ADD cdc.dbo_MyTable_CT nvarchar nombre de usuario (50) NULL DEFAULT (SUSER_SNAME())

Por cierto que no necesita la información de la fecha, ya que ya está en el inicio y el final de los campos LSN.

Mi único problema es que mis usuarios inician sesión a través de un Grupo de Windows que les permite modificar derechos, pero el campo UserName siempre es mi nombre de usuario y no el de ellos. No he encontrado una manera de evitar este problema.

+0

La hora está en la tabla cdc.lsn_time_mapping – Satfactor

+0

esto no parece funcionar - Recibo "sa" en la columna cuando ejecuto una ACTUALIZACIÓN desde un inicio de sesión diferente –

0

Aquí es el gatillo que puede ser creado a través de un proceso automatizado o manual cuando CDC está habilitado en esa tabla específica, este disparador va a resolver el problema que que & desde donde se hicieron cambios:

CREATE TRIGGER TR_TABLENAME_CDC 
ON TABLENAME 
FOR INSERT, UPDATE, DELETE 
AS 
DECLARE   
     @SessionID int, 
     @AppName nvarchar(255), 
     @HostName nvarchar(255), 
     @UserName nvarchar(32) 
BEGIN 
    SELECT @[email protected]@SPID 
    SELECT @AppName=program_name, @HostName=host_name from sys.dm_exec_sessions where session_id = @SessionID 

    IF(@AppName = 'BLAH BLAH' OR @AppName = 'XYZ' OR @AppName = 'ABC') 
    BEGIN 
     SELECT @UserName=login_name from sys.dm_exec_sessions where session_id = @SessionID 
     INSERT INTO UserDetail (SessionID, AppName, HostName, UserName) VALUES (@SessionID, @AppName, @HostName, @UserName) 
    END 
END 
5

Change Data Capture no hace un seguimiento del usuario, la máquina que realizó el cambio ni la hora del cambio.

La mejor solución para realizar un seguimiento de los usuarios que realizaron el cambio con CDC es crear un nuevo campo para almacenar los detalles de los usuarios, que se actualizará en cada cambio (encontrado esa idea here).

Otro artículo en la misma serie me lleva a una herramienta de terceros que ofrece una solución lista para usar. Todavía estoy en proceso de evaluación, pero se ve bastante bien hasta ahora. Puede ver la comparación de información rastreada en una tabla práctica al final de this sequel.

Espero que esto ayude.

+0

puede expandir en "crear un nuevo campo para almacenar usuarios" detalles, que se actualizarán en cada cambio ". ¿Es esta la respuesta anterior? ¿De dónde vendrán los detalles del usuario? –

Cuestiones relacionadas