gpt4 book ai didi

postgresql - 转义 PL/pgSQL 变量

转载 作者:行者123 更新时间:2023-11-29 11:33:52 25 4
gpt4 key购买 nike

我在 PostgreSQL 9 上有一个这样的触发器:

CREATE OR REPLACE FUNCTION clients_update_billingdata_trigger()
RETURNS trigger AS
$BODY$
DECLARE
columnsUpdate TEXT;
BEGIN
columnsUpdate := '';

IF (NEW.rsocial IS DISTINCT FROM OLD.rsocial) THEN
columnsUpdate := columnsUpdate || 'RSocial before: ' || OLD.rsocial || '. RSocial after: ' || NEW.rsocial || E'\n';
END IF;

IF (NEW.legalidentifier IS DISTINCT FROM OLD.legalidentifier) THEN
columnsUpdate := columnsUpdate || 'ILegal before: ' || OLD.legalidentifier || '. ILegal after: ' || NEW.legalidentifier || E'\n';
END IF;

[...]

IF (columnsUpdate != '') THEN
SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx',
'INSERT INTO BillingDataUpdate (client_id, columnsupdate)
VALUES (''' || NEW.idclient || ''', ''' || columnsUpdate || ''');');
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;

NEW.rsocial 的值可以是,例如:Tommy 的服务。如果我关闭触发器,记录会正确保存(在客户端的 other 表中),因为我使用 pg_escape_string 函数在 PHP 中转义了字符串。问题是,如何转义 NEW.rsocial 来运行触发器?

提前致谢。

最佳答案

函数 quote_literalquote_nullable 可能会有用。但请注意,这些是 PostgreSQL 函数,因此请确保 DBLINK 的另一端理解结果。

您还可以查看文档的这一部分:

http://www.postgresql.org/docs/9.1/interactive/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE

编辑

quote_xyz 不得应用于 rsocial 的用法,而应应用于 dblink_exec

  SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx',
'INSERT INTO BillingDataUpdate (client_id, columnsupdate) '
|| 'VALUES (' || quote_nullable(NEW.idclient) || ', '
|| quote_nullable(columnsUpdate) || ');');

请注意字符串连接中 ' 的更改数量。

关于postgresql - 转义 PL/pgSQL 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9377642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com