Grupo,
tenho uma trigger que é disparada no 'after delete' da tabela 'filho'.
Esta tabela 'filho' tem relação com a tabela 'pai', sendo que a
referencia é 'on delete cascade'.

Quando eu excluo um registro da tabela 'pai', este chama a deleção de
cada registro da tabela 'filho', que respectivamente vai executar sua
trigger, o problema é que nesta trigger eu *preciso* dos dados do
registro da tabela 'pai', mas eles já não estão mais lá! Ou seja, o
registro da tabela 'pai' já está excluído antes mesmo dos registros da
tabela 'filho' estarem deletados.

O PostgreSQL não estaria quebrando a integridade referencial tendo este
comportamento?
Alguém já passou por algo semelhante? Existe algum parâmetro para isto
não acontecer?

Segue abaixo script de exemplo.
Obs: trocando o 'after delete' por 'before delete' o resultado eh o mesmo.

Obrigado,
Everton


begin;
create procedural language plpgsql;
create table pai (idpai integer primary key, descricao varchar(20));
create table filho (idpai integer references pai on delete cascade, nome
varchar(30));
--
insert into pai values (1, 'Controle de versão');
insert into pai values (2, 'Linguagem');
insert into filho values (1, 'CVS');
insert into filho values (1, 'SubVersion');
insert into filho values (2, 'PHP');
--
select * from pai;
select * from filho;
--trigger
create or replace function f_filho_a1() returns trigger as $_$
declare
l_desc pai.descricao%TYPE;
begin
raise notice 'old idpai (ok): %', OLD.idpai;
raise notice 'old nome (ok): %', OLD.nome;
select into l_desc descricao
from pai
where idpai = OLD.idpai;
raise notice 'pai descricao (problema! está mostrando <NULL>):
%', l_desc;
return OLD;
end $_$
language plpgsql;
create trigger tr_filho_a1
after delete on filho
for each row
execute procedure f_filho_a1();
--aqui vai exibir dados de dentro da trigger
delete from pai where idpai = 1;
--
rollback;
_______________________________________________
Grupo de Usuários do PostgreSQL no Brasil
Antes de perguntar consulte o manual
http://pgdocptbr.sourceforge.net/

Para editar suas opções ou sair da lista acesse a página da lista em:
http://pgfoundry.org/mailman/listinfo/brasil-usuarios

Responder a