CREATE EXTENSION lo; CREATE TABLE image (title text, raster lo); CREATE TRIGGER t_raster BEFORE UPDATE OR DELETE ON image FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); SELECT lo_create(43213); lo_create ----------- 43213 (1 row) SELECT lo_create(43214); lo_create ----------- 43214 (1 row) INSERT INTO image (title, raster) VALUES ('beautiful image', 43213); SELECT lo_get(43213); lo_get -------- \x (1 row) SELECT lo_get(43214); lo_get -------- \x (1 row) UPDATE image SET raster = 43214 WHERE title = 'beautiful image'; SELECT lo_get(43213); ERROR: large object 43213 does not exist SELECT lo_get(43214); lo_get -------- \x (1 row) -- test updating of unrelated column UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; SELECT lo_get(43214); lo_get -------- \x (1 row) DELETE FROM image; SELECT lo_get(43214); ERROR: large object 43214 does not exist -- Now let's try it with an AFTER trigger DROP TRIGGER t_raster ON image; CREATE CONSTRAINT TRIGGER t_raster AFTER UPDATE OR DELETE ON image DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE PROCEDURE lo_manage(raster); SELECT lo_create(43223); lo_create ----------- 43223 (1 row) SELECT lo_create(43224); lo_create ----------- 43224 (1 row) SELECT lo_create(43225); lo_create ----------- 43225 (1 row) INSERT INTO image (title, raster) VALUES ('beautiful image', 43223); SELECT lo_get(43223); lo_get -------- \x (1 row) UPDATE image SET raster = 43224 WHERE title = 'beautiful image'; SELECT lo_get(43223); -- gone ERROR: large object 43223 does not exist SELECT lo_get(43224); lo_get -------- \x (1 row) -- test updating of unrelated column UPDATE image SET title = 'beautiful picture' WHERE title = 'beautiful image'; SELECT lo_get(43224); lo_get -------- \x (1 row) -- this case used to be buggy BEGIN; UPDATE image SET title = 'beautiful image' WHERE title = 'beautiful picture'; UPDATE image SET raster = 43225 WHERE title = 'beautiful image'; SELECT lo_get(43224); lo_get -------- \x (1 row) COMMIT; SELECT lo_get(43224); -- gone ERROR: large object 43224 does not exist SELECT lo_get(43225); lo_get -------- \x (1 row) DELETE FROM image; SELECT lo_get(43225); -- gone ERROR: large object 43225 does not exist SELECT lo_oid(1::lo); lo_oid -------- 1 (1 row) DROP TABLE image;