Portál AbcLinuxu, 8. května 2025 20:59
Řešení dotazu:
CREATE SEQUENCE commit_seq; CREATE TABLE t ( id serial NOT NULL PRIMARY KEY , tsInsert timestamp NOT NULL DEFAULT clock_timestamp() , seqCommit int , tsCommit timestamp ); CREATE OR REPLACE FUNCTION ai_d_commit() RETURNS trigger AS $$ BEGIN UPDATE t SET seqCommit = nextval('commit_seq'::regclass) , tsCommit = clock_timestamp() WHERE id = NEW.id ; RETURN NEW; END; $$ LANGUAGE plpgsql VOLATILE; CREATE CONSTRAINT TRIGGER ai_d_commit AFTER INSERT ON t DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE ai_d_commit() ; BEGIN; INSERT INTO t DEFAULT VALUES; SELECT pg_sleep(2); COMMIT; SELECT * FROM t;CLI test:
psql -Upostgres -c"BEGIN; INSERT INTO t DEFAULT VALUES; SELECT pg_sleep(2); COMMIT; SELECT * FROM t ORDER BY id;" &\ sleep 1;\ psql -Upostgres -c"BEGIN; INSERT INTO t DEFAULT VALUES; COMMIT; SELECT * FROM t ORDER BY id;"Este skusam vymysliet naco by to komu bolo. Navyse to poradie bude iba priblizne - kedze to pochopitelne bezi pred commitom, tak moment skutocneho commitu moze byt v inom poradi, nez aky ukazuje sequencer. Ak by to bolo naozaj dolezite, rozmyslal by som skor nad serializaciou.
It is the trigger programmer's responsibility to avoid infinite recursionZo skusenosti, pre zamedzenie rekurzie triggerov je rozumne pouzit klauzulu WHEN.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.