Triggers - identificação

SQL Server

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

Marcusvnt

Curtidas 0

Respostas

Marcus.magalhaes

Marcus.magalhaes

29/11/2004

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,


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

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,


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

Marcus,

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

Att,


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

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,


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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

Marcus V.N.Tavares
Programador Jr


GOSTEI 0
Robertolucio

Robertolucio

29/11/2004

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


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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.


GOSTEI 0
Felipe_cduarte

Felipe_cduarte

29/11/2004

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


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

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 !


GOSTEI 0
Laertepjunior

Laertepjunior

29/11/2004

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...!!!!


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

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


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

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,


GOSTEI 0
Laertepjunior

Laertepjunior

29/11/2004

Bom dia Marcos

Bem Legal a proc que vc montou de monitoração.Mas nãos seria melhor estar usando o profiler ? Tipo esta proc executa de tantos em tanto tempo..mas neste intervalo de tempo que ela não está executando pode acontecer o problema. Com o profiler ele estaria pegando tudo que acontece neste banco, gravando pra uma tabela e depois filtrando estes dados de retorno do profiler só pra tabela que ele quer ver. Tendo a facilidade e a segurança do profiler.
Mas achei bem legal esta sua proc...


GOSTEI 0
Laertepjunior

Laertepjunior

29/11/2004

Fala Marcos..beleza..Concordo contigo quanto a um pouco de perda de performance usando o profiler, óbvio que vc não estaria fazendo nada disso no servidor tb..e sim numa maquina cliente. Mas acredito que não seria um processo que ele fará toda hora..e sim pra descobrir o problema. É que eu já resolvi muitos problemas com o profiler..é uma idéia...mas sua proc tb é legal..vou usá-la ...hehehhe


GOSTEI 0
Marcus.magalhaes

Marcus.magalhaes

29/11/2004

Bom dia Laerte.

Concordo com vc, eu inclusive uso o Profiler com frequencia, principalmente para tuning, porém como este é um processo de usuário, em que o mesmo poderá fazer em algum momento qq eu um dia qq, não dá para ficar com o Profiler ligado até pegar. Por isso a sugestão da proc, ela é leve e pode ficar ativa qto tempo quiser.

Att,


GOSTEI 0
Marcusvnt

Marcusvnt

29/11/2004

Boa Tarde à todos.
Bom, pessoal, com a trigger realmente não funcionou, pelo menos na minha situação, mas gostaria de agrader a todos pelo empenho em me ajudar. Obrigado Marcus, Laerte, Felipe e Roberto e aproveito para agradecer a Ligia pelas dicas. Valeu pessoal !

Abraços à todos !


GOSTEI 0
POSTAR