Triggers - identificação

29/11/2004

Olá, Galera
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

Respostas

30/11/2004

Marcus.magalhaes

Bom dia Marcus.

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,


Responder Citar

30/11/2004

Marcusvnt

Fala, Marcus (xará)

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


Responder Citar

30/11/2004

Marcus.magalhaes

Boa tarde Marcus.

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,


Responder Citar

30/11/2004

Marcusvnt

Boa Tarde, Marcus
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


Responder Citar

30/11/2004

Marcus.magalhaes

Marcus,

vc está usando transação, se estiver, vc está fechando-a?? (Commit).

Att,


Responder Citar

30/11/2004

Marcusvnt

Marcus, sim estou usando transação e o travamento ocorre ao clicar no botão gravar. O que fiz foi criar o trigger e a tabela de log via query. e a transação está com commit. Ah ! e quando excluo a trigger o sistema opera normalmente.

Marcus


Responder Citar

30/11/2004

Marcus.magalhaes

Boa noite,

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,


Responder Citar

01/12/2004

Marcusvnt

Marcus, Boa Tarde
Coloquei o comando e o resultado foi 0, porem a aplicação continua pendurada.

Marcus V.N.Tavares
Programador Jr


Responder Citar

01/12/2004

Robertolucio

Oi Marcus´s

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


Responder Citar

02/12/2004

Marcusvnt

Bom Dia !

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.


Responder Citar

02/12/2004

Felipe_cduarte

Fala pessoal,

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


Responder Citar

02/12/2004

Marcusvnt

Felipe

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 !


Responder Citar

02/12/2004

Laertepjunior

Bom..pode ser meio lusitano, mas já que o trigger não está funcionando, e não se sabe pq...use o profiler. Poderiam ser duas maneiras.
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...!!!!


Responder Citar

02/12/2004

Marcus.magalhaes

Bom dia a todos.

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


Responder Citar

02/12/2004

Marcus.magalhaes

Bom dia Laerte.

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,


Responder Citar