Modifier la capture des données - comment savoir qui a effectué le changement?

10

Suivi qui a effectué le changement identifié par le CDC.

Dans la lignée de mon hack datetime, j'ai essayé la même approche en ajoutant suser_sname en tant que nouveau champ avec une valeur par défaut sur la table de suivi des modifications cdc. Mais cela semble renvoyer le propriétaire du processus cdc et non l'utilisateur qui a initié le changement sur la table de base. J'ai également essayé original_login mais cela renvoie la connexion au compte de service SQL. Encore une fois, probablement associé au processus cdc et non à l'utilisateur qui a initié le changement.

J'ai trouvé une question similaire sur le débordement de pile, mais sans réponse autre que le suivi des modifications depuis le frontal ou via un déclencheur, ce qui semble aller à l'encontre du but de l'utilisation de cdc. Je ne republierais pas, mais comme l'original était sur stackoverflow, j'ai pensé essayer ici, surtout si R2 ou 2012 a introduit une meilleure méthode.

Donc, en bref: comment savoir qui a effectué le changement dans la capture des données de changement?

RThomas
la source

Réponses:

7

J'ai déposé un bug à ce sujet, mais il a été fermé comme "par conception".

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

Malheureusement, vous devrez utiliser une autre technique (par exemple, SQL Audit ou un déclencheur) pour obtenir ces informations (et du code personnalisé pour essayer de les corréler aux données CDC autant que possible). J'ai également parlé de cette lacune dans mon chapitre «Audit SQL Server, suivi des modifications et capture des données modifiées» dans le livre SQL Server MVP Deep Dives (volume 1).

Je suis désolé de ne pas avoir de meilleure solution de contournement pour vous, mais les capacités intégrées de CDC ne vont tout simplement pas répondre à vos besoins. :-(

Aaron Bertrand
la source
@RThomas vous pouvez toujours voter pour des articles même s'ils sont fermés - ils sont revus de temps en temps. Encore plus utile que de voter est d'ajouter un commentaire indiquant les détails du besoin commercial qui rendrait ces informations utiles, y compris peut-être le coût de refactorisation des éléments pour contourner la fonctionnalité manquante. J'ai écrit un peu sur la façon dont les données qualitatives peuvent l'emporter sur les données quantitatives ...
Aaron Bertrand
Bon à savoir, je pensais que fermer signifiait également fermer au vote. J'ai souligné dans mon commentaire qu'Oracle offre cela dans leur implémentation CDC. Cela semble en quelque sorte logique. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Vous pouvez ajouter la colonne et avoir un déclencheur sur la table pour remplir l'utilisateur lors de l'insertion / mise à jour / suppression et cdc le stockera ensuite. Vous pouvez récupérer le nom d'utilisateur à partir de l'interface utilisateur en passant le nom d'utilisateur à l'aide des informations de contexte ou de la session réelle

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
la source
0

Pourriez-vous ajouter un champ UpdatedBy sur la table principale, le définir par défaut sur SUSER_NAME () ou ORIGINAL_LOGIN () et faire remplir ces données par le CDC? Je crois que cela vous donnera les mêmes informations que vous recherchez.

Chef
la source
Cela ne vous donne que le compte svc / propriétaire de cdc, vous remarquerez peut-être que j'ai essayé ces choses et documenté les résultats dans ma question d'origine en février
RThomas
Votre commentaire indique que vous l'avez ajouté à la table ChangeData. Je parle de la table d'origine sur laquelle la table ChangeData est basée. Cependant, j'ai réalisé après avoir posté que cela ne fonctionnerait que pour les encarts
Chef
Ahhhh, je n'ai pas compris ça. Je comprends ce que tu dis maintenant.
RThomas