--- /dev/null
+SET search_path TO public;
+
+CREATE OR REPLACE FUNCTION table_log_pl_init(level int, orig_schema text, orig_name text, log_schema text, log_name text)
+RETURNS void AS
+$BODY$
+DECLARE
+ do_log_user int = 0;
+ level_create text = E'''';
+ orig_qq text;
+ log_qq text;
+BEGIN
+ -- Quoted qualified names
+ orig_qq := quote_ident(orig_schema)||'.'||quote_ident(orig_name);
+ log_qq := quote_ident(log_schema)||'.'||quote_ident(log_name);
+
+ IF level <> 3 THEN
+ level_create := level_create
+ ||', trigger_id BIGSERIAL NOT NULL PRIMARY KEY';
+ IF level <> 4 THEN
+ level_create := level_create
+ ||', trigger_user VARCHAR(32) NOT NULL';
+ do_log_user := 1;
+ IF level <> 5 THEN
+ RAISE EXCEPTION
+ 'table_log_pl_init: First arg has to be 3, 4 or 5.';
+ END IF;
+ END IF;
+ END IF;
+
+ EXECUTE 'CREATE TABLE '||log_qq
+ ||'(LIKE '||orig_qq
+ ||', trigger_mode VARCHAR(10) NOT NULL'
+ ||', trigger_tuple VARCHAR(5) NOT NULL'
+ ||', trigger_changed TIMESTAMPTZ NOT NULL'
+ ||level_create
+ ||')';
+
+ EXECUTE 'CREATE TRIGGER "table_log_trigger_pl" AFTER UPDATE OR INSERT OR DELETE ON '
+ ||orig_qq||' FOR EACH ROW EXECUTE PROCEDURE table_log_pl('
+ ||quote_literal(log_name)||','
+ ||do_log_user||','
+ ||quote_literal(log_schema)||')';
+
+ RETURN;
+END;
+$BODY$
+LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION table_log_pl_init(level int, orig_name text)
+RETURNS void AS
+
+$BODY$
+BEGIN
+ PERFORM table_log_pl_init(level, orig_name, current_schema());
+ RETURN;
+END;
+$BODY$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION table_log_pl_init(level int, orig_name text, log_schema text)
+RETURNS void AS
+$BODY$
+BEGIN
+ PERFORM table_log_pl_init(level, current_schema(), orig_name, log_schema);
+ RETURN;
+END;
+$BODY$
+LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION table_log_pl_init(level int, orig_schema text, orig_name text, log_schema text)
+RETURNS void AS
+$BODY$
+BEGIN
+ PERFORM table_log_pl_init(level, orig_schema, orig_name, log_schema,
+ CASE WHEN orig_schema=log_schema
+ THEN orig_name||'_log' ELSE orig_name END);
+ RETURN;
+END;
+$BODY$
+LANGUAGE plpgsql;