create_journal_table() metodu şöyledir. Bu metod EVENT TRIGGER HANDLER içindir.
CREATE OR REPLACE FUNCTION create_journal_table()RETURNS event_triggerLANGUAGE plpgsqlAS $$DECLAREobj record;schema_name text;table_name text;journal_table_name text;BEGINFOR obj INSELECT * FROM pg_event_trigger_ddl_commands()LOOPIF obj.command_tag = 'CREATE TABLE' AND obj.object_type = 'table' THENschema_name := split_part(obj.object_identity, '.', 1);table_name := split_part(obj.object_identity, '.', 2);schema_name := trim(both '"' from schema_name);table_name := trim(both '"' from table_name);-- Skip journal tables to avoid recursionIF right(table_name, 8) = '_journal' THENCONTINUE;END IF;journal_table_name := format('%I.%I_journal', schema_name, table_name);EXECUTE format('CREATE TABLE IF NOT EXISTS %s (id bigserial PRIMARY KEY,action text NOT NULL,changed_at timestamptz DEFAULT now(),old_data jsonb,new_data jsonb)', journal_table_name);EXECUTE format('CREATE TRIGGER %I_to_journalAFTER INSERT OR UPDATE OR DELETE ON %I.%IFOR EACH ROWEXECUTE FUNCTION log_to_journal()',table_name, schema_name, table_name);END IF;END LOOP;END;$$;
Bu metodu register ederiz. Metod şöyledir. Bu metod CREATE EVENT TRIGGER içindir.
CREATE EVENT TRIGGER create_journal_after_table ON ddl_command_end WHEN TAG IN ('CREATE TABLE') EXECUTE FUNCTION create_journal_table();
log_to_journal() metodu şöyledir. Bu metod row level logging yapar
CREATE OR REPLACE FUNCTION log_to_journal()RETURNS triggerLANGUAGE plpgsqlAS $$DECLAREjournal_table text;BEGINjournal_table := format('%I.%I_journal', TG_TABLE_SCHEMA, TG_TABLE_NAME);IF TG_OP = 'INSERT' THENEXECUTE format('INSERT INTO %s (action, old_data, new_data) VALUES ($1, $2::jsonb, $3::jsonb)',journal_table)USING TG_OP, NULL, to_jsonb(NEW);ELSIF TG_OP = 'UPDATE' THENEXECUTE format('INSERT INTO %s (action, old_data, new_data) VALUES ($1, $2::jsonb, $3::jsonb)',journal_table)USING TG_OP, to_jsonb(OLD), to_jsonb(NEW);ELSIF TG_OP = 'DELETE' THENEXECUTE format('INSERT INTO %s (action, old_data, new_data) VALUES ($1, $2::jsonb, $3::jsonb)',journal_table)USING TG_OP, to_jsonb(OLD), NULL;END IF;RETURN NULL; -- AFTER triggerEND;$$;
Hiç yorum yok:
Yorum Gönder