Triggers - identificação
29/11/2004
0
Gostaria de saber como posso fazer um trigger para identificar qual usuario fez insert , update ou delete em uma tabela.
Sou novato com SQL Server 2000 e quem puder me ajudar fico grato.
Marcus Vnt :roll:
Marcusvnt
Posts
30/11/2004
Marcus.magalhaes
Vc pode usar este código como exemplo :
[color=red:4a8ef07c3c]Create Table TESTE
(
col1Int Identity(1, 1)NOT NULL,
col2VarChar(10)NULL
)
GO
Create Trigger TG_TESTE On TESTE For Insert, Update, Delete
As
Select user_name()
GO
Grant all on TESTE to marcus
GO
Insert Into TESTE (col2) values (´teste1´)
GO
Insert Into TESTE (col2) values (´teste2´)
GO
Insert Into TESTE (col2) values (´teste3´)
GO
Insert Into TESTE (col2) values (´teste4´)
GO
Drop Table TESTE
GO[/color:4a8ef07c3c]
Espero ter ajudado.
Att,
30/11/2004
Marcusvnt
Deixa eu tentar explicar a minha situação, tenho uma tabela chamada EMP, onde precisamos descobrir quem está cadastrando as informações incorretas, esta tabela não tem nenhum campo onde guardo o login do usuario do sistema e nem posso criar este campo nesta tabela, o que eu preciso é criar uma trigger que me informe o loginname e o hostname quando houver inclusão, alteração ou exclusão nesta tabela, pq no ambiente que se encontra o sistema cada usuario utiliza sua maquina e o hostname é o nome do usuario, o que fica mais fácil para verificar quem acessou e fez alguma alteração na tabela. Outra coisa é como eu posso verificar este log de quem fez as alterações.
Descupe pois estou começando a trabalhar com SQL e ainda não tenho tanta experiência assim.
Se puder me ajudar eu agradeço
Abraços,
Marcus V.N. Tavares
Programador Jr
30/11/2004
Marcus.magalhaes
O exemplo que eu te passei já te mostra o user name, para que mostre tb o host name é só vc usar a função host_name()
O resultado vc pode inserir em uma tabela que vc queira, como segue no exemplo abaixo:
[color=red:b5d080b992]Create Table TESTE
(
col1 Int Identity(1, 1) NOT NULL,
col2 VarChar(10) NULL
)
GO
Create Table TBL_LOG
(
username VarChar(32) NULL,
hostname VarChar(32) NULL
)
GO
Create Trigger TG_TESTE On TESTE For Insert, Update, Delete
As
Insert Into tbl_log (username, hostname) Values (user_name(), host_name())
GO [/color:b5d080b992]
Att,
30/11/2004
Marcusvnt
Agradeço a grande ajuda que está me dando, valeu mesmo !
Criei a trigger e também a tabela de log, o que está acontecendo quando o usuario acessa a aplicação, é um travamento, o registro fica lockado, tendo que forçar o fechamento da aplicação, voce saberia me dizer pq isso está acontecendo.
obrigado.
Marcus V.N. Tavares
30/11/2004
Marcus.magalhaes
vc está usando transação, se estiver, vc está fechando-a?? (Commit).
Att,
30/11/2004
Marcusvnt
Marcus
30/11/2004
Marcus.magalhaes
isso é muito esquisito, faça o seguinte, quando vc for executar o insert, acrescente um select @@trancount no início e no final da trigger, se esse valor for 0 é pq ainda tem alguma transação pendente.
Att,
01/12/2004
Marcusvnt
Coloquei o comando e o resultado foi 0, porem a aplicação continua pendurada.
Marcus V.N.Tavares
Programador Jr
01/12/2004
Robertolucio
Não tenho muita experiencia, mas não seria bom dar uma olhada no DBCC OPENTRAN? E a partir daí verificar na sysprocesses e na syslocks?
Quem sabe Marcus (o Marcus V.N.) se vc postar o script da sua trigger e o da criação da tabela de log não nos ajude a entender melhor o que está acontecendo?
Att
Roberto
02/12/2004
Marcusvnt
Justino, o que fiz foi o seguinte:
Create Table TBL_LOG
(
username VarChar(32) NULL,
hostname VarChar(32) NULL
)
GO
Create Trigger TG_EMP On EMP For Insert, Update, Delete
As
Insert Into tbl_log (username, hostname) Values (user_name(), host_name())
GO
Conforme o Marcus havia me instruído. Após ter criado a trigger e a tabela de log, executei o software e tentei fazer alguma alteração no registro, alterei e após clicar no botão salvar o software fica parado.
Obrigado.
02/12/2004
Felipe_cduarte
deixa eu tentar ajudar tb hehehehe ... esse botao ´gravar´ é de um aplicativo em Delphi, VB ou coisa assim ??? pq o erro pode estar no sistema, uma vez q os testes realizados no query analizer ou no enterprise manager funcionam ... se for em Delphi , vc pode postar o codigo do botao que eu tento dar uma ajudada.
[]´s
02/12/2004
Marcusvnt
Não possuo o código, pois esse software não foi quem o desenvolvemos, mas esse software é muto utilizado e já faz 4 anos e nunca deu problema, acredito que não seja problema no SW, o que preciso saber é somente o usuario (hostname) que fez insert, update e delete, pois alguém está alterando os dados, como por exemplo salario, endereço, etc... desta tabela. O que preciso é criar uma trigger que me informe isso
Valeu, obrigado !
02/12/2004
Laertepjunior
A primeira..usar o profiler pra ver pq a trigger não está funcionando, verficando o que acontece depois do insert.
E usar o profiler pra pegar os insert, updates e deletes desta tabela. Não sou especialista em profiler, não sei se tem como só pegar esses eventos, mas vc poderia usar um trace normal(sql profiler tsql) filtrar pelo banco de dados, (acho que a tebale diretamente não tem jeito), jogar pra uma tabela de retorno (viriam todos os acessos deste banco..provavelmente bastante coisa) depois no final da tarde fazer uma trabalho nesta tabela de retorno do profiler. Já que vc vai ter o comando que foi executado na tebela , vc pode procurar por algo como ´¬nometabela¬´ pra achar as instruções só desta tabela. Desta maneira, jpa adicionado tb neste trace os data columns hosta name, login name..vc tera como saber quem mandou tal comando pra esta tabela.
Acho que é uma saida ..já que o trigger não está funcionando
Abraços...!!!!
02/12/2004
Marcus.magalhaes
Bom já que não temos o código da aplicação e o código do SQL Server funciona bem no query analyzer e por algum motivo não funciona quando é rodado pela aplicação, o q pode ser feito é, ao invés de uma trigger, ser criado um processo de monitoração sobre o objeto que o Marcus VN está querendo.
Este processo eu já tinha postado para a Li, o que precisaria ser feito é só, fazer um select na tabela de resultado para achar as linhas q afetam o objeto, desta forma não estaria interferindo no aplicativo.
PS.: Se o aplicativo é de terceiros, não é nem uma boa prática, nem idéia, alterar seu banco de dados sem o conhecimento do 3o. pq isso pode acarretar falta de suporte posteriormente.
O código está neste artigo : http://delphiforum.icft.com.br/forum/viewtopic.php?t=50984
[]´s
02/12/2004
Marcus.magalhaes
Usar o profiler é uma saída, porém ele degrada a performance da máquina, visto que estará rodando e verificando cada processo executado no servidor.
O processo que comentei acima, é mais leve pq uso tabelas temporárias sem fazer lock, o que faz o processo ficar mais leve.
Att,
Clique aqui para fazer login e interagir na Comunidade :)