Trigger, eventos Insert, Delete e Update

22/05/2003

1

E aí, galera???

Meu problema agora é:

Fiz uma trigger para gerar um log de alteração de uma tabela, funciona, só que de vez em quando ele não faz o update. Eu gostaria de, se for possível, separar os eventos, tenho um livro que diz que isso é possível mas quando tento fazer dá pau.

gostaria de algo assim:

CREATE TRIGGER tr_LogFinanceiro_imob ON dbo.Financeiro_imob
FOR INSERT
AS
instruçao

FOR DELETE
AS
instroção

FOR UPDATE
AS
instrução

Tentei fazer mas ela dá pau no segundo for.
O que eu estou fazendo de errado???


A trigger que eu fiz é assim:

if exists (select * from sysobjects where id = object_id(´dbo.tr_LogFinanceiro_imob´) and sysstat & 0xf = 8)
drop trigger dbo.tr_LogFinanceiro_imob
GO

CREATE TRIGGER tr_LogFinanceiro_imob ON dbo.Financeiro_imob
FOR INSERT,UPDATE,DELETE
AS
/* Cria o trigger para log das operacoes dos usuarios
Na Tabela Financeiro_imob
AUTOR : FLÁVIO SANCHES
DATA : 21/05/2003
*/

-- Declara as variaveis dos campos da tabela onde o trigger atua
Declare
@Inscricao_imob char(6) ,
@chave_ident char(3) ,
@Ano_Divida char(4) ,
@Cod_Divida char(2) ,
@Sub_Divida char(2) ,

@Cod_Tipo_Moeda char(2) ,
@Parcela char(2) ,
@Vencimento DateTime,
@Valor float ,
@Cod_Situacao_Divida char(2) ,
@Num_Termo_Origem char(6) ,
@Ano_Termo_Origem char(4) ,
@Num_Termo_Destino char(6) ,
@Ano_Termo_Destino char(4) ,
@Qtde_Parc_Agrup char(2) ,
@Tem_Composicao char(1)


-- Testa se Tem algum registro na tabela Inserted
If exists(Select inscricao_imob from Inserted)
Begin
-- Testa se Tem algum registro na tabela Deleted
If exists(Select inscricao_imob from deleted)
begin
-- se tem registro em ambas as tabelas entao a operacao e alteracao
-- insere no log o registro antes da operacao

Declare cur_ins Cursor For
Select
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
from Inserted


Declare cur_del Cursor For
Select
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
from deleted

Open cur_del
Open cur_ins

While (@@Fetch_Status <> -1)
Begin
Fetch Next From cur_del
Into
@Inscricao_imob ,@Chave_ident ,@Ano_Divida ,@Cod_Divida ,
@Sub_Divida ,@Cod_Tipo_Moeda ,@Parcela ,@Vencimento ,
@Valor ,@Cod_Situacao_Divida ,@Num_Termo_Origem ,@Ano_Termo_Origem ,
@Num_Termo_Destino ,@Ano_Termo_Destino ,@Qtde_Parc_Agrup ,@Tem_Composicao

Insert Into Lg_Financ_imob (
Usuario ,estacao ,Dia_Hora ,Operacao ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
)Values(
Suser_Name() ,Host_Name() ,GetDate() ,´A´ ,
@Inscricao_imob ,@Chave_ident ,@Ano_Divida ,@Cod_Divida ,
@Sub_Divida ,@Cod_Tipo_Moeda ,@Parcela ,@Vencimento ,
@Valor ,@Cod_Situacao_Divida ,@Num_Termo_Origem ,@Ano_Termo_Origem ,
@Num_Termo_Destino ,@Ano_Termo_Destino ,@Qtde_Parc_Agrup ,@Tem_Composicao )

Fetch Next From cur_ins
Into
@Inscricao_imob ,@Chave_ident ,@Ano_Divida ,@Cod_Divida ,
@Sub_Divida ,@Cod_Tipo_Moeda ,@Parcela ,@Vencimento ,
@Valor ,@Cod_Situacao_Divida ,@Num_Termo_Origem ,@Ano_Termo_Origem ,
@Num_Termo_Destino ,@Ano_Termo_Destino ,@Qtde_Parc_Agrup ,@Tem_Composicao

Insert Into Lg_Financ_imob (
Usuario ,estacao ,Dia_Hora ,Operacao ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
)Values(
Suser_Name() ,Host_Name() ,GetDate() ,´A´ ,
@Inscricao_imob ,@Chave_ident ,@Ano_Divida ,@Cod_Divida ,
@Sub_Divida ,@Cod_Tipo_Moeda ,@Parcela ,@Vencimento ,
@Valor ,@Cod_Situacao_Divida ,@Num_Termo_Origem ,@Ano_Termo_Origem ,
@Num_Termo_Destino ,@Ano_Termo_Destino ,@Qtde_Parc_Agrup ,@Tem_Composicao
)
End

Close cur_del
Deallocate cur_del
Close cur_ins
Deallocate cur_ins

End
Else
Begin
-- Se nao tem registro na tabela deleted entao a operacao e de inclusao
Insert Into lg_Financ_imob (
Usuario ,estacao ,Dia_Hora ,Operacao ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao )
select
Suser_Name() ,Host_Name() ,GetDate() ,´I´ ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
from inserted

End
End
Else
Begin

-- Se nao tem registro na tabela Inserted entao a operacao e de exclusao
-- Insere no log o registro apagado
Insert Into lg_Financ_imob (
Usuario ,estacao ,Dia_Hora ,Operacao ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,

Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao )
select
Suser_Name() ,Host_Name() ,GetDate() ,´E´ ,
Inscricao_imob ,Chave_ident ,Ano_Divida ,Cod_Divida ,
Sub_Divida ,Cod_Tipo_Moeda ,Parcela ,Vencimento ,
Valor ,Cod_Situacao_Divida ,Num_Termo_Origem ,Ano_Termo_Origem ,
Num_Termo_Destino ,Ano_Termo_Destino ,Qtde_Parc_Agrup ,Tem_Composicao
from deleted

End
GO


Responder