动态列名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;
我正在尝试创建一个动态审计触发器,它从信息模式中读取 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;