William,
> From: "Mozart Hasse" <[EMAIL PROTECTED]>
>
> Bom, quando eu usei rules em views que eram simplesmente copias da
> tabela original, as mesmas eram :
>
> CREATE RULE [nome] AS ON INSERT TO [nome view] DO INSTEAD INSERT INTO
> [tabela original](COALESCE(new.[campo1],
> DEFAULT),COALESCE(new.[campo2],DEFAULT),...);
>
> E funcionavam certinho. Item para ocaso do update. Havia a facilidade
> de um ID de registro nunca poder ser alterado. Assim "... DO INSTEAD UPDATE
> [tabela original] SET [campo1] = new.[campo1] ... WHERE ID = new.[ID]
sempre
> funcionava.
Eu tentei isso:
create or replace view public.MVTOESTQ as
SELECT * FROM GESTAO.MVTOESTQ;
-- coloquei tudo o que foi possível (NEW.x := y) nas triggers before insert
CREATE TRIGGER tr_mvtoestq_bupde
BEFORE DELETE OR UPDATE
ON gestao.mvtoestq
FOR EACH ROW
EXECUTE PROCEDURE fbupdelMvtoEstq();
CREATE TRIGGER tr_mvtoestq_upde
AFTER DELETE OR UPDATE
ON gestao.mvtoestq
FOR EACH ROW
EXECUTE PROCEDURE fupdelMvtoEstq();
CREATE TRIGGER tr_mvtoestq_bins
BEFORE INSERT
ON gestao.mvtoestq
FOR EACH ROW
EXECUTE PROCEDURE fbinMvtoEstq();
CREATE TRIGGER tr_mvtoestq_ins
AFTER INSERT
ON gestao.mvtoestq
FOR EACH ROW
EXECUTE PROCEDURE finMvtoEstq();
CREATE OR REPLACE RULE RL_MvtoEstq_Ins AS ON INSERT TO public.mvtoestq DO
INSTEAD
INSERT INTO gestao.MVTOESTQ ( EMPRESA, FILIAL, MOVIMENTO, SEQESTOQUE,
50 campos... )
CREATE OR REPLACE RULE RL_MvtoEstq_Upd AS ON UPDATE TO public.mvtoestq DO
INSTEAD
UPDATE gestao.MvtoEstq
SET
EMPPRODUT = NEW.EMPPRODUT,
... 50 campos
WHERE Movimento = OLD.Movimento
AND SeqEstoque = OLD.SeqEstoque
AND Filial = OLD.Filial
AND Empresa = OLD.Empresa;
CREATE OR REPLACE RULE RL_MvtoEstq_Del AS ON DELETE TO public.mvtoestq DO
INSTEAD
DELETE FROM gestao.MvtoEstq
WHERE Movimento = OLD.Movimento
AND SeqEstoque = OLD.SeqEstoque
AND Filial = OLD.Filial
AND Empresa = OLD.Empresa;
Troquei todas as referências a minha tabela dentro das functions por
"public.mvtoestq" ou "gestao.mvtoestq". O problema é que, quando eu chego num
comando DELETE dentro de uma function chamada pela trigger, o Postgres reporta
o erro "ERROR: record 'new' is not assigned yet The tuple structure of a
not-yet-assigned record is indeterminate. ...".
O erro acontece exatamente no comando DELETE FROM public.mvtoestq WHERE ... ,
ou seja, quando eu trabalho recursivamente sobre a view. Este comando
garantidamente não age sobre o registro atualizado originalmente. Pelo que
entendi, se a trigger estiver na tabela (ao invés da View como no caso do
Oracle), o Postgres vai continuar empacando no mesmo problema.
Valeu pela tentativa, mas... tem algum jeito de conseguir a mesma
funcionalidade sem colocar triggers na tabela original?
Mozart Hasse
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral