-
-
Save potapuff/8125db2ebfa57dec9178 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CREATE FUNCTION audit_create_log_tables(_relname text) RETURNS void | |
AS $_$ | |
BEGIN | |
-- TODO log primary key changes | |
EXECUTE | |
'CREATE TABLE ' || _RELNAME || '_version_log' || | |
'( change_id int not null primary key references action_log on delete restrict, | |
LIKE ' || _RELNAME || ')'; | |
EXECUTE 'CREATE FUNCTION ' || _RELNAME || '_track_changes() RETURNS TRIGGER AS $ac$ | |
BEGIN | |
IF TG_OP = \'INSERT\' THEN | |
INSERT INTO ' || _RELNAME || '_version_log' || | |
' SELECT audit_log_action(\'' || _RELNAME || '\', \'I\'), NEW.*; | |
RETURN NEW; | |
ELSIF TG_OP = \'UPDATE\' THEN | |
INSERT INTO ' || _RELNAME || '_version_log' || | |
' SELECT audit_log_action(\'' || _RELNAME || '\', \'U\'), NEW.*; | |
RETURN NEW; | |
ELSIF TG_OP = \'DELETE\' THEN | |
INSERT INTO ' || _RELNAME || '_version_log' || | |
' SELECT audit_log_action(\'' || _RELNAME || '\', \'D\'), OLD.*; | |
RETURN OLD; | |
END IF; | |
RETURN NEW; | |
END$ac$ LANGUAGE \'plpgsql\' '; | |
RETURN; | |
END$_$ | |
LANGUAGE plpgsql; | |
CREATE FUNCTION audit_drop_log_data(_relname text) RETURNS void | |
AS $$ | |
BEGIN | |
EXECUTE 'DROP TABLE ' || _RELNAME || '_version_log CASCADE'; | |
EXECUTE 'DROP FUNCTION ' || _RELNAME || '_track_changes() CASCADE' ; | |
RETURN; | |
END$$ | |
LANGUAGE plpgsql; | |
CREATE FUNCTION audit_log_action(_relname text, _opname text) RETURNS integer | |
AS $$ | |
DECLARE _change_id INT; | |
_user_rec RECORD; | |
BEGIN | |
_change_id := nextval('action_log_seq'); | |
SELECT INTO _user_rec * FROM audited_user; | |
INSERT INTO action_log (change_id, party_id, req_host, change_date, rel_name, op_type) | |
VALUES (_change_id, _user_rec.party_id, _user_rec.req_host, now(), _relname, _opname); | |
RETURN _change_id; | |
END $$ | |
LANGUAGE plpgsql; | |
CREATE FUNCTION audit_start_log_data(_relname text) RETURNS void | |
AS $$ | |
BEGIN | |
EXECUTE 'CREATE TRIGGER ' || REPLACE(_relname,'.','_') || '_chg_trck_trg AFTER INSERT OR UPDATE OR DELETE ' || | |
' ON ' || _relname || ' FOR EACH ROW EXECUTE PROCEDURE ' || _relname || '_track_changes()'; | |
RETURN; | |
END$$ | |
LANGUAGE plpgsql; | |
CREATE FUNCTION audit_stop_log_data(_relname text) RETURNS void | |
AS $$ | |
BEGIN | |
EXECUTE 'DROP TRIGGER ' || REPLACE(_relname,'.','_') || '_chg_trck_trg ON ' || _relname ; | |
RETURN; | |
END$$ | |
LANGUAGE plpgsql; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment