Cambiar la captura de datos: ¿cómo saber quién realizó el cambio?

10

Seguimiento de quién realizó el cambio identificado por los CDC.

En la línea de mi truco de fecha y hora , intenté el mismo enfoque agregando suser_sname como un nuevo campo con valor predeterminado en la tabla de seguimiento de cambios de cdc. Pero, eso parece devolver al propietario del proceso de CDC y no al usuario que inició el cambio en la tabla base. También probé original_login pero eso devuelve el inicio de sesión de la cuenta de servicio sql. De nuevo, probablemente asociado con el proceso de cdc y no con el usuario que inició el cambio.

Encontré una pregunta similar sobre el desbordamiento de la pila, pero sin otra respuesta que el seguimiento de los cambios desde el extremo frontal o mediante un disparador, que parece anular el propósito de usar cdc. No volvería a publicar, pero como el original estaba en stackoverflow, pensé en probarlo, especialmente si R2 o 2012 ha introducido una mejor manera.

En resumen: ¿cómo sé quién realizó el cambio en la captura de datos modificados?

RThomas
fuente

Respuestas:

7

Archivé un error sobre esto, pero se cerró como "por diseño".

http://connect.microsoft.com/SQLServer/feedback/details/283707/cdc-options-to-capture-more-data-username-date-time-etc

Desafortunadamente, tendrá que usar otra técnica (por ejemplo, Auditoría SQL o un disparador) para obtener esta información (y un código personalizado para intentar correlacionarla con los datos de CDC tanto como sea posible). Escribí sobre esta deficiencia también en mi capítulo "Auditoría de SQL Server, seguimiento de cambios y captura de datos de cambios" en el libro SQL Server MVP Deep Dives (volumen 1).

Lamento no tener una mejor solución para usted, pero las capacidades integradas de CDC simplemente no cumplirán con sus requisitos. :-(

Aaron Bertrand
fuente
@RThomas, aún puedes votar por los artículos, incluso si están cerrados; de vez en cuando se vuelven a visitar. Incluso más útil que votar es agregar un comentario que indique los detalles de la necesidad comercial que haría útil esta información, incluido quizás el costo de refactorizar las cosas para evitar la funcionalidad que falta. Escribí un poco sobre cómo los datos cualitativos pueden superar a los datos cuantitativos ...
Aaron Bertrand
Es bueno saber que pensé que cerrado también significaba cerrado a la votación. Señalé en mi comentario que Oracle ofrece esto en su implementación de CDC. Parece algo lógico. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Puede agregar la columna y tener un activador en la tabla para llenar al usuario en insertar / actualizar / eliminar y luego el CDC lo almacenará. Puede obtener el nombre de usuario desde la interfaz de usuario pasando el nombre de usuario utilizando la información de contexto o desde la sesión

SET @CapturedBy = CAST(REPLACE(CAST(CONTEXT_INFO() AS VARCHAR(10)),CHAR(0),'''''''') AS INT)

IF(@CapturedBy) IS NULL
    BEGIN
       SELECT @CapturedBy = P.[Code]
       FROM sys.dm_exec_sessions AS S
         INNER JOIN [dbo].[Person] AS P
          ON S.[login_name] = P.[User_Name]
       WHERE S.[session_id] = @@spid
    END
user2031675
fuente
0

¿Podría agregar un campo UpdatedBy en la tabla principal, configurarlo por defecto en SUSER_NAME () u ORIGINAL_LOGIN () y que los CDC llenen esos datos? Creo que eso le dará la misma información que está buscando.

Cocinero
fuente
Que sólo te lleva la cuenta de SVC / propietario del CDC, es posible observar que traté esas cosas y documentado los resultados en la espalda camino pregunta original en feb
RThomas
Su comentario dice que lo agregó a la tabla ChangeData. Estoy hablando de la tabla original en la que se basa la tabla ChangeData. Sin embargo, me di cuenta de que después de publicar esto solo funcionaría para inserciones
Chef
Ahhhh, no entendí eso. Entiendo lo que dices ahora.
RThomas el