PostgreSQL触发器通常会修剪INSERT / UPDATE记录的字段

问题描述 投票:0回答:1

我正在尝试在数据库的每个表上修剪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通用记录,以删除每个文本值前后的空白(即,在“值”中更改“值”)。我看了一眼通用...

postgresql trim database-trigger
1个回答
0
投票

您的语句“由于ARGV仅在该事件期间存在,因此仅对INSERT记录有效”是false

© www.soinside.com 2019 - 2024. All rights reserved.