Modifica acquisizione dati: come sapere chi ha apportato la modifica?


10

Tenere traccia di chi ha apportato la modifica identificata da CDC.

Sulla falsariga del mio hack datetime ho provato lo stesso approccio aggiungendo suser_sname come nuovo campo con valore predefinito nella tabella delle tracce di modifica cdc. Ciò sembra restituire il proprietario del processo cdc e non l'utente che ha avviato la modifica nella tabella di base. Ho anche provato original_login ma questo restituisce l'accesso all'account del servizio sql. Ancora una volta, probabilmente associato al processo cdc e non all'utente che ha avviato la modifica.

Ho trovato una domanda simile sullo stack-overflow ma senza risposta se non quella di tracciare le modifiche dal front-end o tramite un trigger, che sembra vanificare lo scopo di usare cdc. Non ripubblicerei ma dato che l'originale era su StackOverflow ho pensato di provarlo qui soprattutto se R2 o 2012 avessero introdotto un modo migliore.

Quindi, in breve: come faccio a sapere chi ha apportato la modifica nell'acquisizione dei dati di modifica?

Risposte:


7

Ho presentato un bug su questo, ma è stato chiuso come "di progettazione".

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

Sfortunatamente dovrai usare un'altra tecnica (es. SQL Audit o un trigger) per ottenere queste informazioni (e un po 'di codice personalizzato per provare a correlarle il più possibile ai dati CDC). Ho scritto di questa carenza anche nel mio capitolo "Controllo di SQL Server, rilevamento delle modifiche e acquisizione dei dati delle modifiche" nel libro Deep Dives MVP di SQL Server (volume 1).

Mi dispiace di non avere una soluzione migliore per te, ma le funzionalità integrate di CDC non soddisfano i tuoi requisiti. :-(


@RThomas puoi comunque votare gli articoli anche se sono chiusi - vengono rivisitati di tanto in tanto. Ancora più utile della votazione è aggiungere un commento che dichiari i dettagli delle esigenze aziendali che renderebbero utili queste informazioni, incluso forse il costo del refactoring delle cose per aggirare la funzionalità mancante. Ho scritto un po 'su come i dati qualitativi possono superare i dati quantitativi ...
Aaron Bertrand

Buono a sapersi, ho pensato che anche chiuso avrebbe significato essere chiuso al voto. Ho sottolineato nel mio commento che Oracle offre questo nella loro implementazione CDC. Sembra logico. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas

6

È possibile aggiungere la colonna e disporre di un trigger sulla tabella per popolare l'utente in insert / update / delete e cdc lo memorizzerebbe. È possibile acquisire il nome utente dall'interfaccia utente passando il nome utente utilizzando le informazioni di contesto o dalla sessione effettiva

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

0

Potresti aggiungere un campo UpdatedBy nella tabella principale, impostarlo come predefinito su SUSER_NAME () o ORIGINAL_LOGIN () e disporre di tali dati popolati dal CDC? Credo che ti darà le stesse informazioni che stai cercando.


Questo ti dà solo l'account svc / proprietario di cdc, potresti notare che ho provato quelle cose e documentato i risultati nella mia domanda originale fino a febbraio.
RThomas

Il tuo commento ha detto che l'hai aggiunto alla tabella ChangeData. Sto parlando della tabella originale su cui si basa la tabella ChangeData. Tuttavia mi sono reso conto che dopo aver pubblicato questo avrebbe funzionato solo per gli inserti
Chef

Ahhhh, non l'ho capito. Ho capito cosa stai dicendo ora.
RThomas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.