E aí pessoal, blz....

Eu participo de outras listas de Delphi, e na lista DTDelphi eu vi essa 
dica, os créditos estão na própria Tigger.
Como não manjo de Banco de Dados, deixo para vocês mestres analisarem e 
falarem se funciona, etc...

Só não consegui organizar porque não manjo... poderia alguém reenviar 
com a ordem correta, pois mistura comentários com o código, foi do jeito 
que estava no email (talvez porque recebo via texto e não via html).

A mensagem completa do email:
___________________________________________________________

Bom dia!

Consegui fazer uma rotina que há muito precisa, saber qual a coluna 
alterada, o valor anterior e o valor atual de forma automática em 
determinadas tabelas, segue uma trigger para sqlserver que pode ser 
adaptada a qualquer outro banco de dados, consegui e estou dispondo ai 
para todos: Para que funcione basta que informe o nomedatabela e a chave 
que será utilizada para busca da alteração posteriormente.

-- Criada por Sérgio/PROINDDY/MA em 15 10 2008-- Podem distribuir a 
vontade essas linhas só não tirem os creditosCREATE TRIGGER 
[TG_AUDITORIA] ON [dbo].[FUNCIONARIOS] FOR UPDATEAS declare @coluna_nome 
varchar(60), @EXECUTA VARCHAR(1000), @NomeTabela char(30), @chave 
char(80) set @nomeTabela = 'FUNCIONARIOS' -- INFORME O NOME DA TABELAset 
@Chave = 'a.f_empresa+a.f_local+cast(a.f_codigo as varchar)' -- INFORME 
A CHAVE DE PROCURA --CONTEUDO DA TABELA ALTERAÇÃ0 -- SELECT TRAZ TODAS 
AS COLUNAS DA TABELADECLARE GC_ALTERACAO CURSOR FOR SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @nomeTabelaOPEN 
GC_ALTERACAO FETCH NEXT FROM GC_ALTERACAOINTO @COLUNA_NOME
SELECT * INTO #INSERT2 FROM INSERTED SELECT * INTO #DELETED2 FROM 
DELETED -- LOOP PARA TODOS OS CAMPOS
WHILE (@@FETCH_STATUS = 0) BEGIN --GRAVA ALTERAÇÃO QUE HOUVE NA COLUNA 
PESQUISADA EM TODOS OS REGISTROS set @EXECUTA = 'insert into 
alteracao(alt_tabela,alt_chave,alt_campo,alt_valor_de,alt_valor_para) '+ 
'select ''' + @NomeTabela + 
''','[EMAIL PROTECTED]','''[EMAIL PROTECTED]''',B.'[EMAIL PROTECTED]',A.'[EMAIL 
PROTECTED]' 
from #insert2 a, #deleted2 b where a.'[EMAIL PROTECTED]' <> 
b.'[EMAIL PROTECTED] exec(@executa)
FETCH NEXT FROM GC_ALTERACAO INTO @COLUNA_NOME END CLOSE 
GC_ALTERACAODEALLOCATE GC_ALTERACAO
-- ESTRUTURA DA TABELA DE ALTERAÇÃO if exists (select * from 
dbo.sysobjects where id = object_id(N'[dbo].[ALTERACAO]') and 
OBJECTPROPERTY(id, N'IsUserTable') = 1)drop table 
[dbo].[ALTERACAO]GOCREATE TABLE [dbo].[ALTERACAO] ( [ALT_CHAVE] [char] 
(80) COLLATE SQL_Latin1_General_CP1_CI_AI NULL , [ALT_CAMPO] [char] (50) 
COLLATE SQL_Latin1_General_CP1_CI_AI NULL , [ALT_VALOR_DE] [char] (80) 
COLLATE SQL_Latin1_General_CP1_CI_AI NULL , [ALT_VALOR_PARA] [char] (80) 
COLLATE SQL_Latin1_General_CP1_CI_AI NULL , [ALT_TABELA] [char] (30) 
COLLATE SQL_Latin1_General_CP1_CI_AI NULL ) ON [PRIMARY]GO

_________________________________________

:)




Responder a