我正在尝试在数据库的每个表上修剪INSERT / UPDATE通用记录,以删除每个文本值前后的空白(即,在“值”中更改“值”)。
我看了Generic string trimming trigger for Postgresql,但这仅适用于INSERT记录,因为ARGV仅在该事件期间存在。
我想做的是将NEW转换为jsonb,现在我假设其格式为{“ key1”:“ value1”,“ key2”:“ value2”},但我不知道如何循环通过其字段来修剪其值。
我打算使用一个
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = TG_TABLE_NAME AND table_schema = TG_TABLE_SCHEMA AND (data_type = 'text' OR data_type = 'character varying' )
仅获得具有字符串类型的“ key1”(列),因此脚本类似于]
CREATE OR REPLACE FUNCTION a_trigger() RETURNS trigger AS $trim_trigger$
DECLARE
j jsonb = to_jsonb(NEW);
current_column text;
BEGIN
FOR current_column IN
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = TG_TABLE_NAME AND table_schema = TG_TABLE_SCHEMA AND (data_type = 'text' OR data_type = 'character varying' )
LOOP
IF j ->> current_column IS NOT NULL THEN
j = jsonb_set(j, j ->> current_column, to_jsonb(regexp_replace(j ->> current_column, '^\s*|\s*$', '', 'g')),false);
END IF;
END LOOP;
NEW = jsonb_populate_record(NEW, j);
RETURN NEW;
END;
$trim_trigger$ LANGUAGE plpgsql;
我在使用jsonb_set时遇到问题;它的签名是“ jsonb,text [],jsonb,bool”,但是j->> current_column是文本,也许我还没有完全理解'path'参数。
我在这里想念什么?
最后我用一个键管理了>
j = jsonb_set(j, concat('{',current_column,'}')::text[], to_jsonb(regexp_replace(j ->> current_column, '^\s*|\s*$', '', 'g')),false);
(我在文字上添加了演员表[]]
但是对我来说似乎有点脏
我正在尝试在数据库上的每个表上修剪INSERT / UPDATE通用记录,以删除每个文本值前后的空白(即,在“值”中更改“值”)。我看了一眼通用...
您的语句“由于ARGV仅在该事件期间存在,因此仅对INSERT记录有效”是false