Search Postgresql Archives

Re: Row visibility issue with consecutive triggers, one being DEFERRED

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



recall!

this self containing case works well if I call the correct functions in the triggers :)

Marc


> -----Original Message-----
> From: pgsql-general-owner@xxxxxxxxxxxxxx [mailto:pgsql-general-
> owner@xxxxxxxxxxxxxx] On Behalf Of Marc Mamin
> Sent: Donnerstag, 4. Juni 2015 10:47
> To: pgsql-general@xxxxxxxxxxxxxx
> Subject:  Row visibility issue with consecutive triggers, one
> being DEFERRED
> 
> Hello,
> 
> The test below is running fine
> but if you add the trigger push_foo_tr (uncomment) then the exception
> is raised.
> 
> It seems that this additional trigger to be called at the first place
> changes the deferrable status of the second one.
> 
> Is this an expected behaviour ?
> 
> regards,
> 
> Marc Mamin
> 
> 
> 
> DROP TABLE IF EXISTS foo;
> DROP FUNCTION IF EXISTS push_foo_trf();
> DROP FUNCTION IF EXISTS check_foo_trf();
> 
> CREATE TABLE foo (id int, v int);
> INSERT INTO foo select 1,3;
> INSERT INTO foo select 2,6;
> 
> 
> CREATE OR REPLACE FUNCTION push_foo_trf () returns trigger AS $$ BEGIN
>   UPDATE foo SET (id,v) = (NEW.id,NEW.v) WHERE id=NEW.id; RETURN NEW;
> END; $$ language plpgsql;
> 
> CREATE OR REPLACE FUNCTION check_foo_trf () returns trigger AS $$
> DECLARE
>   visible_sum int;
>   table_view text;
> BEGIN
>   SELECT sum(v) from foo into visible_sum;
>   IF 9 <> visible_sum THEN
>      SELECT string_agg (id||', '||v ,E' | ') FROM foo INTO table_view;
>      raise exception 'Check failed. Visible:  %',table_view;
>   END IF;
> RETURN NULL;
> END; $$ language plpgsql;
> 
> --CREATE TRIGGER push_foo_tr
> --  AFTER UPDATE ON foo
> --      FOR EACH ROW EXECUTE PROCEDURE check_foo_trf();
> 
> CREATE CONSTRAINT TRIGGER check_foo_tr
>   AFTER UPDATE ON foo
>     DEFERRABLE INITIALLY DEFERRED
>       FOR EACH ROW EXECUTE PROCEDURE check_foo_trf();
> 
> BEGIN;
>   update foo set v=6 WHERE id = 1;
>   update foo set v=3 WHERE id = 2;
> END;
> 
> --cleanup
> DROP TABLE IF EXISTS foo;
> DROP FUNCTION IF EXISTS push_foo_trf();
> DROP FUNCTION IF EXISTS check_foo_trf();
> 
> 
> --
> Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-general


-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux