Skip to content

Instantly share code, notes, and snippets.

@potapuff
Created August 13, 2010 05:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save potapuff/8125db2ebfa57dec9178 to your computer and use it in GitHub Desktop.
Save potapuff/8125db2ebfa57dec9178 to your computer and use it in GitHub Desktop.
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