Informações básicas:
- Estou criando uma coleção de tabelas de auditoria para acompanhar as atualizações e exclusões em um conjunto de tabelas de dados para o meu aplicativo.
- Os registros de auditoria são criados por meio de gatilhos.
- O DML no banco de dados do meu aplicativo geralmente vem de um logon que um serviço usa para entrar no banco de dados. Por isso, acho que o resultado de
SYSTEM_USER
sempre será o mesmo quando chamado em um gatilho. - Meu aplicativo não armazena dados do usuário atualmente, embora uma string
UserId
seja fornecida toda vez que o DML for executado (feito exclusivamente em procedimentos armazenados).
O problema que encontrei é que, quando um usuário exclui um registro, quero saber quem o fez. Como será feito pelo mesmo login, não quero ver que todas as ações foram executadas pelo serviço, quero ver qual usuário fez. Esse não é um problema em uma atualização, porque temos ModifiedBy
colunas que serão atualizadas por meio de atualizações enviadas UserId
.
A pergunta é: existe uma maneira de definir SYSTEM_USER
ou colocar as informações do usuário no gatilho quando uma exclusão é executada?
A "melhor" ideia que tenho agora, embora ainda não tenha certeza se é uma boa ideia, é que, no serviço, verifico se a corrente UserId
está no banco de dados como usuário e, se não, crie um usuário objeto para eles. Em seguida, execute os procedimentos armazenados com EXECUTE AS User = @UserId
. Então, quando o DML for concluído no procedimento armazenado e o gatilho for disparado, SYSTEM_USER
o usuário deverá retornar o EXECUTE AS
.