-- TRIGGER CREATE TABLE test_tbl (i integer, s text); ERROR: relation "test_tbl" already exists CREATE FUNCTION test_trigger() RETURNS trigger AS $$ pljs.elog(NOTICE, "NEW = ", JSON.stringify(NEW)); pljs.elog(NOTICE, "OLD = ", JSON.stringify(OLD)); pljs.elog(NOTICE, "TG_OP = ", TG_OP); pljs.elog(NOTICE, "TG_ARGV = ", TG_ARGV); if (TG_OP == "UPDATE") { NEW.i = 102; return NEW; } return NEW; $$ LANGUAGE pljs; CREATE TRIGGER test_trigger BEFORE INSERT OR UPDATE OR DELETE ON test_tbl FOR EACH ROW EXECUTE PROCEDURE test_trigger(); INSERT INTO test_tbl VALUES(100, 'ABC'); NOTICE: NEW = {"i":100,"s":"ABC"} NOTICE: OLD = undefined NOTICE: TG_OP = INSERT NOTICE: TG_ARGV = UPDATE test_tbl SET i = 101, s = 'DEF' WHERE i = 1; NOTICE: NEW = {"i":101,"s":"DEF"} NOTICE: OLD = {"i":1,"s":"s1"} NOTICE: TG_OP = UPDATE NOTICE: TG_ARGV = DELETE FROM test_tbl WHERE i >= 100; NOTICE: NEW = undefined NOTICE: OLD = {"i":100,"s":"ABC"} NOTICE: TG_OP = DELETE NOTICE: TG_ARGV = NOTICE: NEW = undefined NOTICE: OLD = {"i":102,"s":"DEF"} NOTICE: TG_OP = DELETE NOTICE: TG_ARGV = SELECT * FROM test_tbl; i | s ---+---- 2 | s2 3 | s3 4 | s4 (3 rows) -- One more trigger CREATE FUNCTION test_trigger2() RETURNS trigger AS $$ var tuple; switch (TG_OP) { case "INSERT": tuple = NEW; break; case "UPDATE": tuple = OLD; break; case "DELETE": tuple = OLD; break; default: return; } if (tuple.subject == "skip") { return null; } if (tuple.subject == "modify" && NEW) { NEW.val = tuple.val * 2; return NEW; } $$ LANGUAGE pljs; CREATE TABLE trig_table (subject text, val int); INSERT INTO trig_table VALUES('skip', 1); CREATE TRIGGER test_trigger2 BEFORE INSERT OR UPDATE OR DELETE ON trig_table FOR EACH ROW EXECUTE PROCEDURE test_trigger2(); INSERT INTO trig_table VALUES ('skip', 1), ('modify', 2), ('noop', 3); SELECT * FROM trig_table; subject | val ---------+----- skip | 1 modify | 4 noop | 3 (3 rows) UPDATE trig_table SET val = 10; SELECT * FROM trig_table; subject | val ---------+----- skip | 1 modify | 8 noop | 10 (3 rows) DELETE FROM trig_table; SELECT * FROM trig_table; subject | val ---------+----- skip | 1 (1 row)