Skip to content

Instantly share code, notes, and snippets.

@edgarrmondragon
Created March 26, 2019 00:38
Show Gist options
  • Save edgarrmondragon/ce22a5642aa36a3f6bc7539c368865ae to your computer and use it in GitHub Desktop.
Save edgarrmondragon/ce22a5642aa36a3f6bc7539c368865ae to your computer and use it in GitHub Desktop.
PostgreSQL triggers for data change audits
DROP SCHEMA IF EXISTS edgar CASCADE;
CREATE SCHEMA edgar AUTHORIZATION spoton;
DROP TABLE IF EXISTS edgar.people;
CREATE TABLE edgar.people (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
DROP TABLE IF EXISTS edgar.dumb_audits;
CREATE TABLE edgar.dumb_audits (
op TEXT NOT NULL,
stamp TIMESTAMP NOT NULL,
tname TEXT NOT NULL,
rid INTEGER NOT NULL
);
CREATE OR REPLACE FUNCTION edgar.paudits() RETURNS TRIGGER AS $paudits$
BEGIN
IF (TG_OP = 'INSERT') THEN
INSERT INTO edgar.dumb_audits
VALUES (
'I',
now(),
TG_TABLE_NAME,
(CASE WHEN TG_TABLE_NAME = 'people' THEN NEW.id ELSE 0 END)
);
RETURN NEW;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO edgar.dumb_audits
VALUES (
'U',
now(),
TG_TABLE_NAME,
(CASE WHEN TG_TABLE_NAME = 'people' THEN NEW.id ELSE 0 END)
);
RETURN NEW;
ELSIF (TG_OP = 'DELETE') THEN
INSERT INTO edgar.dumb_audits
SELECT 'D', now(), TG_TABLE_NAME,
(CASE WHEN TG_TABLE_NAME = 'people' THEN OLD.id ELSE 0 END);
-- VALUES (
-- 'D',
-- now(),
-- TG_TABLE_NAME,
-- (CASE WHEN TG_TABLE_NAME = 'people' THEN NEW.id ELSE 0 END)
-- );
RETURN OLD;
END IF;
END;
$paudits$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS dumb_audit ON edgar.people;
CREATE TRIGGER dumb_audit
AFTER INSERT OR UPDATE OR DELETE ON edgar.people
FOR EACH ROW EXECUTE PROCEDURE edgar.paudits();
INSERT INTO edgar.people VALUES (1, 'Edgar Ramirez');
INSERT INTO edgar.people VALUES (2, 'Benito Juárez');
UPDATE edgar.people SET name = 'Edgar Ramirez Mondragon' WHERE id = 1;
DELETE FROM edgar.people WHERE id = 2;
UPDATE edgar.people SET name = 'Edgar Jaime Ramirez Mondragon' WHERE id = 1;
SELECT rid, MAX(stamp)
FROM edgar.dumb_audits
WHERE op = 'I' OR op = 'U'
GROUP BY rid;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment