Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Progr'amador

trigger

Recommended Posts

Olá,

 

Alguem podeira me ajudar a montar uma trigger, é que to comecando agora no SQL Server e bem diferente do MySQL.

a Trigger é da seguinte forma:

em todos as TABELAS tem os Campos: nmUsuario (nome do Usuario) e dtTransacao (data da transacao) e esses campos recebem o usuario logado e a data da alteração ou inserção (update e insert) tentei fazer assim mas não deu certo:

 

CREATE TRIGGER TG_DATAUSER ON TABELAFOR INSERT, UPDATEAS BEGIN  SET NEW.dtTransacao = CONVERT(CHAR,GETDATE(),103)+' '+CONVERT(CHAR,GETDATE(),108),  SET NEW.nmUsuario = SUSER_SNAME()ENDGO
Obs: no campo dtTransacao, a data é gravada no formato: DD/MM/YYYY HH:MI:SS , por isso concatenei a data e a hora porque não encontrei esse formato dentre os formatos existente.

 

Alguem poderia da uma força ae?

To usando o SQL Server 2005 Express

 

no mySQL funciona assim:

CREATE TRIGGER `banco`.`tg_teste` BEFORE UPDATE ON `banco`.`tabela`  FOR EACH ROW BEGINSET NEW.dtTransacao = DATE_FORMAT(CURRENT_TIMESTAMP,'%d/%m/%Y %h:%i:%s');SET NEW.nmUsuario = CURRENT_USER;END;

Abs. Progr'amador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Segue um exemplo bem tosco mas que acho que pode ajudar:

CREATE TRIGGER reminderON titlesFOR INSERT, UPDATEAS UPDATE SUA_TABELA SET 	NEW.dtTransacao = GETDATE(),  								NEW.nmUsuario = ????GO
O campo EW.nmUsuario = ???? é o usuário do bd ou do seu sistema? Pq aqui onde trabalhamos temos usuarios para as páginas e usamos user anonimo para acessa o bd.

 

Dê uma pesquisa no books online em CREATE TRIGGER pois têm um fato material.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta dando esse erro:

Msg 102, Level 15, State 1, Procedure tg_teste, Line 5Sintaxe incorreta próxima a '.'.
linha 5 :

SET NEW.dtTransacao = CONVERT(CHAR,GETDATE

 

tem alguam coisa a ver com o NEW

 

e fiz um outro teste sem as linhas do SET e deu esse erro:

Msg 4104, Level 16, State 1, Procedure tg_teste, Line 7O identificador de várias partes "NEW.dtTransacao" não pôde ser vinculado.
você faz ideia do que pode ser esse erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Ooops! Desculpe-me mas post o código incorreto.Por favor re-veja o post anterior e teste o código corrigido!t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

corrigi e deu o mesmo erro que postei por ultimo:

Msg 4104, Level 16, State 1, Procedure reminder, Line 6

O identificador de várias partes "NEW.dtTransacao" não pôde ser vinculado.

 

que erro é esse???

 

Valew!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Me dê um tempinho que crio um exemplo fuincional de trigger e post aqui.Prometo não me esquecer de lhe ajudar.t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Me dê um tempinho que crio um exemplo fuincional de trigger e post aqui.

 

Prometo não me esquecer de lhe ajudar.

 

t+

Olá jothaz

 

valeu irmão! pela força

 

estou na etapa final da migração do meu DB, e agora imperou nisso.

 

vou ficar no aguardo, e continuar tentando aki.

 

valeu!

 

e respondendo esse sua pergunta:

O campo NEW.nmUsuario = ???? é o usuário do bd ou do seu sistema?

é do DB mesmo ( SUSER_SNAME() ), na verdade pra cada usuario do sistema é criado um usuario no DB, pra que fique registrado o nome do usuario em todoas as alterações inclusive tabelas de auditoria.

 

Abs. Progr'amador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

encontrei uma solução para o meu problema, no entanto, não estou muito contente não, é que no exemplo que encontrei vou ter que criar duas trigger pra cada tabela uma para o UPDATE e outra pro INSERT, e usando todos os campos, e isso vai ser muito chato e trabalhoso, ainda acredito que há uma solução mais pratica, da mesma forma que existe no ORACLE e MySQL.

 

esse é o link onde encontrei um artigo sobre o assunto:

http://www.bufaloinfo.com.br/Artigos/Artigo2508.asp

 

Abs. Progr'amador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,

 

Dei um bizu no link e pelo q puder ver:

CREATE TRIGGER TRU_AUDIT ON TABTESTE FOR INSERT,UPDATE AS	UPDATE TABTESTE SET USUARIO=SUSER_NAME(),DATAALTERADO=GETDATE() WHERE CODIGO IN (SELECT CODIGO FROM INSERTED)

você pode sim criar um trigger FOR INSERT,UPDATE AS para insert e update conjunta.

 

Posta sua trigger ai para facilitar a ajuda.

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá jothaz,

 

Abaixo tem exemplo real, observe esse trigger:

ALTER TRIGGER tgPedidoBensUp ON tbPedidoBens INSTEAD OF UPDATE ASBEGIN  UPDATE tbPedidoBens  SET dtTransacao = GETDATE(),	  cdUser = UPPER(SUSER_SNAME())  FROM tbPedidoBens INNER JOIN INSERTED I ON tbPedidoBens.nuPedido=I.nuPedidoEND
se eu deixar dessa forma o banco não grava as alterações nos outros campos, atualiza somente os dois campos dtTransacao e cdUser, ai tive que incluir todos os campos (exceto campo que seja IDENTITY) nesse UPDATE, tipo:

ALTER TRIGGER tgPedidoBensUp ON tbPedidoBens INSTEAD OF UPDATE ASBEGIN  UPDATE tbPedidoBens  SET dtPedido = I.dtPedido, 	  cdSetor = I.cdSetor,	  nuDoc = I.nuDoc, 	  flSituacao = I.flSituacao, 	  dsObs = I.dsObs,	  dtTransacao = GETDATE(),	  cdUser = UPPER(SUSER_SNAME())  FROM tbPedidoBens INNER JOIN INSERTED I ON tbPedidoBens.nuPedido=I.nuPedidoEND
Nesse exemplo tem apenas 7 campos, que na verdade é bem mais que isso, e são mais de 30 tabelas e ainda tem a TRIGGER do INSERT, ou seja, pra cada tabela são duas trigger. http://forum.imasters.com.br/public/style_emoticons/default/upset.gif :blink:

 

Se alguem tiver uma solução mais prática pra caso, ficaria muito grato pro resto da vida http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Abs. Progr'amador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.