- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 10 meses atrás por
nathanael.
-
AutorPosts
-
20 de janeiro de 2009 às 11:42 pm #84840
nathanael
ParticipantePessoal ,
Sou iniciante no PL-SQL, e estou tentando criar uma trigger de auditoria onde me retorna alguns erro:
Table:
desc logauditoria
Name Null Type
—————————— ——– ———————————————————————————————————————————————————————————————
CODIGO NOT NULL NUMBER
DADOS_ANTES NOT NULL VARCHAR2(300)
DADOS_DEPOIS NOT NULL VARCHAR2(300)
USUARIO VARCHAR2(300)
DATAALTERADO DATE
TABELA VARCHAR2(60)
OPERACAO VARCHAR2(60)codigo trigger :
create or replace trigger tr_cidade
before insert or update or delete on cidade
for each row
declare
usuario varchar2(60);
begin
select user into usuario from dual;
—-inserção
if(:old.codigo_cidade is null ) theninsert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao)
values(seqauditoria.nextval,’Novo registro’,to_char(:new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Inserção’);else
if (updating) theninsert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao) values(seqauditoria.nextval,to_char(old.codigo_cidade)||’, ‘||:old.nome_cidade ||’, ‘||:old.uf ||’, ‘||to_char(:old.taxa),to_char(new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Alteração’);
else
if (deleting) theninsert into logauditoria (codigo,dados_antes,dados_depois,usuario,dataalterado,tabela,operacao)
values(seqauditoria.nextval,to_char(old.codigo_cidade)||’, ‘||:old.nome_cidade ||’, ‘||:old.uf ||’, ‘||to_char(:old.taxa),to_char(new.codigo_cidade)||’, ‘||:new.nome_cidade ||’, ‘||:new.uf ||’, ‘||to_char(:new.taxa),usuario,sysdate,’cidade’,’Exclusão’);end if;
end if;
end if;
end tr_cidade;erros:
Error(19,9): PL/SQL: SQL Statement ignored
Error(19,186): PL/SQL: ORA-00984: coluna não permitida aqui
Error(24,9): PL/SQL: SQL Statement ignored
Error(25,161): PL/SQL: ORA-00984: coluna não permitida aqui21 de janeiro de 2009 às 4:00 am #84847Ishii
ParticipanteNathanael,
Acho que faltou o : em algumas declarações de colunas…
to_char(new.codigo_cidade)||',deveria ser
to_char(:new.codigo_cidade)||'Reveja se há mais casos que estejam faltando e complete…e como sugestão não precisa criar uma variável usuário, pode usar o USER direto no insert…
[]s Ishii
21 de janeiro de 2009 às 3:02 pm #84853Leonardo Litz
ParticipanteOlá Nathanael.
Estava dando uma olhada em seu código e vi que é possível melhora-lo.
Alterei sua trigger para que ela fique mais consisa e de mais fácil manutenção.A trigger:
create or replace trigger tr_cidade
before insert or update or delete on cidade
for each row
declare—procedure de inserção
procedure insere_log(p_modo in varchar2)
is
v_dados_antes varchar2(400);
v_dados_depois varchar2(400);
beginif(p_modo = ‘Inserção’)then
v_dados_antes := ‘Novo registro’;
else
v_dados_antes := to_char(:old.codigo_cidade) || ‘, ‘ || 😮 ld.nome_cidade || ‘, ‘ ||:old.uf || ‘, ‘ || to_char(:old.taxa);
end if;if(p_modo = ‘Exclusão’)then
v_dados_depois := ‘Execusão do Registro’;
else
v_dados_depois := to_char(:new.codigo_cidade) || ‘, ‘ || :new.nome_cidade || ‘, ‘ ||:new.uf || ‘, ‘ || to_char(:new.taxa);
end if;insert into logauditoria
(codigo,
dados_antes,
dados_depois,
usuario,
dataalterado,
tabela,
operacao)
values
(seqauditoria.nextval,
v_dados_antes,
v_dados_depois,
user,
sysdate,
‘cidade’,
p_modo);end insere_log;
begin
—-inserção
if (inserting) theninsere_log(p_modo => 'Inserção');–alteracao
elsif (updating) theninsere_log(p_modo => 'Alteração');—exclusao
elsif (deleting) theninsere_log(p_modo => 'Exclusão');end if;
end tr_cidade;As alterações:
1º Criei uma procedure privada dentro de sua trigger que fica responsável em inserir os dados na tabela de log.
2º Retirei o select from dual, e utilizei a função user diretamente no insert.
3º Ainda havia um erro que ao se inserir os dados no ato da exclusão não existe valores na variavel :new, substitui pela mensagem fixa.
4º Substitui seus ifs encadeados pelos elsif.Vlw Leonardo Litz
22 de janeiro de 2009 às 12:11 am #84872nathanael
Participante[quote=”Ishii”:1lyqal62]Nathanael,
Acho que faltou o : em algumas declarações de colunas…
to_char(new.codigo_cidade)||',deveria ser
to_char(:new.codigo_cidade)||'Reveja se há mais casos que estejam faltando e complete…e como sugestão não precisa criar uma variável usuário, pode usar o USER direto no insert…
[]s Ishii[/quote]
Obrigado amigo ,
Era exatamente o que estava causando o erro.
-
AutorPosts
- Você deve fazer login para responder a este tópico.