Zmiana przechwytywania danych - jak wiedzieć, kto dokonał zmiany?

10

Śledzenie, kto dokonał zmiany zidentyfikowanej przez CDC.

Wzdłuż wiersza hakowania datetime próbowałem tego samego podejścia, dodając suser_sname jako nowe pole z wartością domyślną w tabeli ścieżek zmiany cdc. Wydaje się jednak, że zwraca to właściciela procesu cdc, a nie użytkownika, który zainicjował zmianę w tabeli podstawowej. Próbowałem także original_login, ale to zwraca login do konta usługi sql. Ponownie, prawdopodobnie związany z procesem cdc, a nie z użytkownikiem, który zainicjował zmianę.

Znalazłem podobne pytanie dotyczące przepełnienia stosu, ale bez odpowiedzi innej niż śledzenie zmian z interfejsu użytkownika lub za pomocą wyzwalacza, który wydaje się pokonywać cel używania cdc. Nie chciałbym repost, ale ponieważ oryginał był na przepełnieniu stosu, pomyślałem, że spróbuję tutaj, szczególnie jeśli R2 lub 2012 wprowadziły lepszy sposób.

Krótko mówiąc: skąd mam wiedzieć, kto dokonał zmiany w przechwytywaniu danych zmian?

RThomas
źródło

Odpowiedzi:

7

Złożyłem na ten temat błąd, ale został on zamknięty jako „z założenia”.

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

Niestety będziesz musiał użyć innej techniki (np. SQL Audit lub wyzwalacza), aby uzyskać te informacje (i trochę niestandardowego kodu, aby spróbować skorelować je z danymi CDC w jak największym stopniu). O tym niedoborze pisałem także w rozdziale „Audyt serwera SQL, śledzenie zmian i przechwytywanie danych” w książce SQL Server MVP Deep Dives (tom 1).

Przykro mi, że nie mam dla ciebie lepszego obejścia, ale wbudowane możliwości CDC po prostu nie spełnią twoich wymagań. :-(

Aaron Bertrand
źródło
@RThomas nadal możesz głosować na przedmioty, nawet jeśli są zamknięte - od czasu do czasu wracają. Jeszcze bardziej przydatne niż głosowanie jest dodanie komentarza określającego szczegóły potrzeb biznesowych, które sprawiłyby, że informacje te byłyby przydatne, w tym być może koszt przefakturowania rzeczy w celu obejścia brakującej funkcjonalności. Napisałem trochę o tym, w jaki sposób dane jakościowe mogą przeważyć dane ilościowe ...
Aaron Bertrand
Dobrze wiedzieć, myślałem, że zamknięcie oznacza również zamknięcie głosowania. W swoim komentarzu wskazałem, że Oracle oferuje to w swojej implementacji CDC. To wydaje się logiczne. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Możesz dodać kolumnę i mieć wyzwalacz w tabeli, aby zapełnić użytkownika podczas wstawiania / aktualizacji / usuwania, a cdc zapisuje to. Możesz pobrać nazwę użytkownika z interfejsu użytkownika, przekazując nazwę użytkownika za pomocą informacji kontekstowych lub z rzeczywistej sesji

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
użytkownik2031675
źródło
0

Czy możesz dodać pole UpdatedBy do głównej tabeli, ustawić go jako domyślne na SUSER_NAME () lub ORIGINAL_LOGIN () i czy te dane zostaną wypełnione przez CDC? Wierzę, że dostarczy ci tych samych informacji, których szukasz.

Szef kuchni
źródło
To daje ci tylko konto svc / właściciela cdc, możesz zauważyć, że próbowałem tych rzeczy i udokumentowałem wyniki w moim pierwotnym pytaniu w lutym
RThomas
Twój komentarz mówi, że dodałeś go do tabeli ChangeData. Mówię o oryginalnej tabeli, na której opiera się tabela ChangeData. Jednak zdałem sobie sprawę, że po tym, jak opublikowałem, zadziała to tylko dla wkładek
szef kuchni
Ahhhh, nie złapałem tego. Rozumiem teraz, co mówisz.
RThomas