asd

建立ddl_log表
CREATE TABLE "public"."ddl_log" (
  "id" SERIAL PRIMARY KEY,
  "event_type" varchar(50),
  "classid" varchar(255),
  "objid" varchar(255),
  "objsubid" varchar(255),
  "command_tag" varchar(255),
  "object_type" varchar(255),
  "object_name" varchar(255),
  "schema_name" varchar(255),
  "object_identity" varchar(255),
  "state" varchar(20) --表示该记录的处理状态 初始值init
);
For CREATE/ALTER/DROP
CREATE OR REPLACE FUNCTION ddl_log()
        RETURNS event_trigger 
LANGUAGE plpgsql AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_ddl_commands()
    LOOP
        INSERT INTO ddl_log("event_type","classid","objid","objsubid","command_tag","object_type","schema_name","object_identity","state") 
            VALUES( 'ddl_command_end',
                    obj.classid,
                    obj.objid,
                    obj.objsubid,
                    obj.command_tag,
                    obj.object_type,
                    obj.schema_name,
                    obj.object_identity,
                    'init');
    END LOOP;
END
$$;

CREATE EVENT TRIGGER ddl_log_event
   ON ddl_command_end 
   EXECUTE FUNCTION ddl_log();
For DROP
CREATE OR REPLACE FUNCTION ddl_drop_log()
        RETURNS event_trigger LANGUAGE plpgsql AS $$
DECLARE
    obj record;
BEGIN
    FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
    LOOP
        INSERT INTO ddl_log("event_type","command_tag","classid","objid","objsubid","object_type","schema_name","object_name","object_identity","state") 
            VALUES( 'sql_drop',
                                        '',
                                        obj.classid,
                    obj.objid,
                    obj.objsubid,
                    obj.object_type,
                    obj.schema_name,
                                        obj.object_name,
                    obj.object_identity,
                    'init');
    END LOOP;
END
$$;


CREATE EVENT TRIGGER ddl_drop
   ON sql_drop
   EXECUTE FUNCTION ddl_drop_log();

test sql

CREATE TABLE test1(
    name TEXT
);
ALTER TABLE test1 add column name2 TEXT;

DROP TABLE test1;

get ddl record

SELECT * FROM ddl_log;

Event Trigger Functions 参考文档
https://www.postgresql.org/docs/12/functions-event-triggers.html

Event Trigger 触发事件(command_tag)详细列表
https://www.postgresql.org/docs/11/event-trigger-matrix.html

results matching ""

    No results matching ""