Created
March 26, 2019 00:38
-
-
Save edgarrmondragon/ce22a5642aa36a3f6bc7539c368865ae to your computer and use it in GitHub Desktop.
PostgreSQL triggers for data change audits
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
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