From 7cbc1103dec12bc49938ce73d94273ce21789786 Mon Sep 17 00:00:00 2001 From: jsmith Date: Thu, 15 Apr 2021 10:42:40 +0000 Subject: [PATCH] auditskis.sql --- PostgreSQL/audittrigger.sql | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 PostgreSQL/audittrigger.sql diff --git a/PostgreSQL/audittrigger.sql b/PostgreSQL/audittrigger.sql new file mode 100644 index 0000000..7aa6c17 --- /dev/null +++ b/PostgreSQL/audittrigger.sql @@ -0,0 +1,28 @@ +CREATE TABLE generic_log ( + mtime timestamptz not null default now(), + action char not null check (action in ('I', 'U', 'D')), + username text not null, + table_name text not null, + row_data jsonb not null +); + +CREATE INDEX ON generic_log USING brin (mtime); +CREATE INDEX ON generic_log ((row_data->>'my_pk’)) WHERE row_data->>'my_pk' IS NOT NULL; // note the cast to text as JSONB can’t be indexed with B-tree +CREATE EXTENSION IF NOT EXISTS btree_gin; +CREATE INDEX ON generic_log USING gin (table_name); // GiN is better for lots of repeating values + + +CREATE OR REPLACE FUNCTION public.generic_log_trigger() + RETURNS trigger LANGUAGE plpgsql +AS $function$ +BEGIN + IF TG_OP = 'DELETE' THEN + INSERT INTO generic_log VALUES (now(), 'D', session_user, TG_TABLE_NAME, to_json(OLD)); + ELSE + INSERT INTO generic_log VALUES (now(), TG_OP::char , session_user, TG_TABLE_NAME, to_json(NEW)); + END IF; + RETURN NULL; +END; +$function$; + +CREATE TRIGGER log_generic AFTER INSERT OR UPDATE OR DELETE ON some_table FOR EACH ROW EXECUTE FUNCTION generic_log_trigger(); \ No newline at end of file