Captura de dados de alteração - como saber quem fez a alteração?

10

Acompanhamento de quem fez a alteração identificada pelo CDC.

Nas linhas do meu hack de data e hora , tentei a mesma abordagem adicionando suser_sname como um novo campo com valor padrão na tabela de controle de alterações do cdc. Mas isso parece devolver o proprietário do processo cdc e não o usuário que iniciou a alteração na tabela base. Eu também tentei original_login, mas isso retorna o logon da conta de serviço sql. Novamente, provavelmente associado ao processo cdc e não ao usuário que iniciou a alteração.

Eu encontrei uma pergunta semelhante no estouro de pilha, mas sem outra resposta além de rastrear alterações no front-end ou através de um gatilho, o que parece derrotar o propósito de usar o cdc. Eu não republicaria, mas como o original estava no stackoverflow, pensei em tentar aqui, especialmente se o R2 ou 2012 introduzirem uma maneira melhor.

Então, resumindo: como sei quem fez a alteração na captura de dados alterados?

RThomas
fonte

Respostas:

7

Eu registrei um bug sobre isso, mas ele foi fechado como "por design".

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

Infelizmente, você terá que usar outra técnica (por exemplo, Auditoria SQL ou um gatilho) para obter essas informações (e algum código personalizado para tentar correlacioná-las aos dados do CDC, tanto quanto possível). Também escrevi sobre essa deficiência no meu capítulo "Auditoria do SQL Server, acompanhamento de alterações e captura de dados de alteração" no livro Deep Dives do SQL Server MVP (volume 1).

Lamento não ter uma solução melhor para você, mas os recursos internos do CDC simplesmente não atendem aos seus requisitos. :-(

Aaron Bertrand
fonte
@RThomas, você ainda pode votar nos itens mesmo se eles estiverem fechados - eles são revisitados ocasionalmente. Ainda mais útil do que votar é adicionar um comentário informando os detalhes das necessidades comerciais que tornariam essas informações úteis, incluindo talvez o custo de refatorar as coisas para solucionar a funcionalidade ausente. Eu escrevi um pouco sobre como os dados qualitativos podem superar os dados quantitativos ...
Aaron Bertrand
É bom saber que eu pensei que fechado também significava fechado para votar. Apontei no meu comentário que a Oracle oferece isso na implementação do CDC. Parece meio lógico. docs.oracle.com/cd/A91202_01/901_doc/server.901/a90237/…
RThomas
6

Você pode adicionar a coluna e ter um gatilho na tabela para preencher o usuário ao inserir / atualizar / excluir e o cdc armazenará isso. Você pode pegar o nome de usuário na interface do usuário passando o nome de usuário usando informações de contexto ou da sessão real

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
fonte
0

Você poderia adicionar um campo UpdatedBy na tabela principal, configurá-lo como padrão para SUSER_NAME () ou ORIGINAL_LOGIN () e ter esses dados preenchidos pelo CDC? Eu acredito que isso lhe dará as mesmas informações que você está procurando.

Chefe de cozinha
fonte
Isso só faz com que você a conta svc / proprietário do CDC, você pode notar que eu tentei essas coisas e documentados os resultados em meu original caminho de volta pergunta em fevereiro
RThomas
Seu comentário disse que você o adicionou à tabela ChangeData. Estou falando da tabela original na qual a tabela ChangeData se baseia. No entanto, percebi depois que eu postei isso seria apenas trabalho para inserções
Chef
Ahhhh, não entendi. Eu entendo o que você está dizendo agora.
Rhomas 3/13