动态列名postgresql触发器

Dynamic column name postgresql trigger

我正在尝试创建一个动态审计触发器,它从信息模式中读取 column_name 并插入到审计 table 中,其中的列已更改。到目前为止,我有以下代码:

     CREATE OR REPLACE FUNCTION dynamic_column_audit()
        RETURNS trigger
        LANGUAGE 'plpgsql'
        COST 100
        VOLATILE NOT LEAKPROOF AS $BODY$
        <<main_function>>
    
    declare
    table_name_tr text;
    table_schema_tr text;
    
    column_name_trigger text;
    old_column_name_trigger record;
    new_column_name_trigger record;
    begin
    -- variables
    table_name_tr := TG_TABLE_NAME;
    table_schema_tr := TG_TABLE_SCHEMA;
    
    <<loop_sql>>
        FOR column_name_trigger IN (SELECT c.column_name FROM information_schema.columns c WHERE c.table_schema = table_schema_tr and c.table_name = table_name_tr ORDER BY ordinal_position asc)
            LOOP
            
            RAISE INFO E'\n Column name: %, table_name: %', column_name_trigger , table_schema_tr||'.'||table_name_tr;
            IF (TG_OP = 'UPDATE') THEN
            
            INSERT INTO my_loggingtable (operation, table_schema, table_name, column_name, old_value, new_value) 
            VALUES (TG_OP, table_name_tr, table_schema_tr, column_name_trigger, OLD.||column_name_trigger, NEW.||column_name_trigger);
end if;
    END LOOP loop_sql;
    return new;
    end main_function;
    $BODY$;

我正在尝试看看是否可以做类似 NEW 的事情。 + column_name 或 OLD> + column_name 来自循环而不是硬编码每个 table.

的列名称值

这背后的想法是在不一直添加名称的情况下执行大约 20 table 秒的审计触发器。

您可以使用这样的结构:

DECLARE
   newval text;
BEGIN
   EXECUTE format(
              'SELECT (::%I).%I',
              table_name,
              column_name
           )
      INTO newval
      USING NEW;
END;