mirror of https://github.com/postgres/postgres
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
154 lines
5.3 KiB
154 lines
5.3 KiB
|
17 years ago
|
-- 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();
|