Triggers - identificação
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:
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
Curtidas 0
Respostas
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,
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
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
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
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,
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
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
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
29/11/2004
Marcus,
vc está usando transação, se estiver, vc está fechando-a?? (Commit).
Att,
vc está usando transação, se estiver, vc está fechando-a?? (Commit).
Att,
GOSTEI 0
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
Marcus
GOSTEI 0
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,
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
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
Coloquei o comando e o resultado foi 0, porem a aplicação continua pendurada.
Marcus V.N.Tavares
Programador Jr
GOSTEI 0
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
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
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.
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
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
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
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 !
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
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...!!!!
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
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
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
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,
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
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...
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
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
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,
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
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 !
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