-- these triggers are dedicated to HPHC of RI who -- decided that my kid's name was william not willem, and -- vigorously resisted all efforts at correction. they have -- since gone bankrupt... CREATE FUNCTION users_insert() returns trigger AS 'if TD["new"]["fname"] == None or TD["new"]["lname"] == None: return "SKIP" if TD["new"]["username"] == None: TD["new"]["username"] = TD["new"]["fname"][:1] + "_" + TD["new"]["lname"] rv = "MODIFY" else: rv = None if TD["new"]["fname"] == "william": TD["new"]["fname"] = TD["args"][0] rv = "MODIFY" return rv' LANGUAGE plpythonu; CREATE FUNCTION users_update() returns trigger AS 'if TD["event"] == "UPDATE": if TD["old"]["fname"] != TD["new"]["fname"] and TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' LANGUAGE plpythonu; CREATE FUNCTION users_delete() RETURNS trigger AS 'if TD["old"]["fname"] == TD["args"][0]: return "SKIP" return None' LANGUAGE plpythonu; CREATE TRIGGER users_insert_trig BEFORE INSERT ON users FOR EACH ROW EXECUTE PROCEDURE users_insert ('willem'); CREATE TRIGGER users_update_trig BEFORE UPDATE ON users FOR EACH ROW EXECUTE PROCEDURE users_update ('willem'); CREATE TRIGGER users_delete_trig BEFORE DELETE ON users FOR EACH ROW EXECUTE PROCEDURE users_delete ('willem'); -- quick peek at the table -- SELECT * FROM users; fname | lname | username | userid --------+-------+----------+-------- jane | doe | j_doe | 1 john | doe | johnd | 2 willem | doe | w_doe | 3 rick | smith | slash | 4 (4 rows) -- should fail -- UPDATE users SET fname = 'william' WHERE fname = 'willem'; -- should modify william to willem and create username -- INSERT INTO users (fname, lname) VALUES ('william', 'smith'); INSERT INTO users (fname, lname, username) VALUES ('charles', 'darwin', 'beagle'); SELECT * FROM users; fname | lname | username | userid ---------+--------+----------+-------- jane | doe | j_doe | 1 john | doe | johnd | 2 willem | doe | w_doe | 3 rick | smith | slash | 4 willem | smith | w_smith | 5 charles | darwin | beagle | 6 (6 rows) -- dump trigger data CREATE TABLE trigger_test (i int, v text ); CREATE FUNCTION trigger_data() returns trigger language plpythonu as $$ if TD.has_key('relid'): TD['relid'] = "bogus:12345" skeys = TD.keys() skeys.sort() for key in skeys: val = TD[key] plpy.notice("TD[" + key + "] => " + str(val)) return None $$; CREATE TRIGGER show_trigger_data_trig BEFORE INSERT OR UPDATE OR DELETE ON trigger_test FOR EACH ROW EXECUTE PROCEDURE trigger_data(23,'skidoo'); insert into trigger_test values(1,'insert'); NOTICE: ("TD[args] => ['23', 'skidoo']",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[event] => INSERT',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[level] => ROW',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[name] => show_trigger_data_trig',) CONTEXT: PL/Python function "trigger_data" NOTICE: ("TD[new] => {'i': 1, 'v': 'insert'}",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[old] => None',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[relid] => bogus:12345',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_name] => trigger_test',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_schema] => public',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[when] => BEFORE',) CONTEXT: PL/Python function "trigger_data" update trigger_test set v = 'update' where i = 1; NOTICE: ("TD[args] => ['23', 'skidoo']",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[event] => UPDATE',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[level] => ROW',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[name] => show_trigger_data_trig',) CONTEXT: PL/Python function "trigger_data" NOTICE: ("TD[new] => {'i': 1, 'v': 'update'}",) CONTEXT: PL/Python function "trigger_data" NOTICE: ("TD[old] => {'i': 1, 'v': 'insert'}",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[relid] => bogus:12345',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_name] => trigger_test',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_schema] => public',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[when] => BEFORE',) CONTEXT: PL/Python function "trigger_data" delete from trigger_test; NOTICE: ("TD[args] => ['23', 'skidoo']",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[event] => DELETE',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[level] => ROW',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[name] => show_trigger_data_trig',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[new] => None',) CONTEXT: PL/Python function "trigger_data" NOTICE: ("TD[old] => {'i': 1, 'v': 'update'}",) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[relid] => bogus:12345',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_name] => trigger_test',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[table_schema] => public',) CONTEXT: PL/Python function "trigger_data" NOTICE: ('TD[when] => BEFORE',) CONTEXT: PL/Python function "trigger_data" DROP TRIGGER show_trigger_data_trig on trigger_test; DROP FUNCTION trigger_data();