PostgreSQL函数中是否存在psql变量的转义语法?

PostgreSQL函数中是否存在psql变量的转义语法?,第1张

概述我编写PSQL脚本并使用变量(对于psql –variable key = value命令行语法). 这适用于顶级范围,如select * from:key,但我使用脚本创建函数,并在其中需要变量值. 所以,语法就好 create function foo() returns void as$$declarebegin grant select on my_table to grou 我编写Psql脚本并使用变量(对于psql –variable key = value命令行语法).

这适用于顶级范围,如select * from:key,但我使用脚本创建函数,并在其中需要变量值.

所以,语法就好

create function foo() returns voID as$$declarebegin    grant select on my_table to group :user;end;$$language plpgsql;

失败于:用户.

据我所知,psql变量是一个普通的宏替换功能,但它不处理函数体.
这种情况有没有逃避语法?周围:带有$$的用户有关替换的工作,但psql在$$时失败.

除了独立的宏处理(sed,awk等)之外还有其他方法吗?

Psql SET变量不在美元引用的字符串中插入.我肯定不知道这一点,但我认为在那里打开SET变量插值没有任何逃避或其他诡计.

有人可能会认为你可以在两个美元引用的PL / pgsql段之间楔入一个不带引号的用户来获得所需的效果.但这似乎不起作用……我认为语法需要单个字符串而不是连接字符串的表达式.可能会误解为此.

无论如何,那没关系.还有另一种方法(如Pasco所说):编写存储过程以接受PL / pgsql参数.这就是看起来的样子.

CREATE OR REPLACE FUNCTION foo("user" TEXT) RETURNS voID AS$$BEGIN        EXECUTE 'GRANT SELECT ON my_table TO GROUP ' || quote_IDent(user);END;    $$LANGUAGE plpgsql;

关于此功能的说明:

> EXECUTE使用我们的procedure参数在每次调用时生成一个适当的GRANT.名为“Executing Dynamic Commands”的PG手册部分详细解释了EXECUTE.
>必须对引用过程参数user的声明进行双引号.双引号强制它被解释为标识符.

一旦定义了这样的函数,就可以使用插值的Psql变量来调用它.这是一个大纲.

>运行psql –variable user =“’whoever’” – file = myscript.sql.用户名周围需要单引号!
>在myscript.sql中,定义如上所述的函数.
>在myscript.sql中,输入select foo(:user);.这就是我们依赖于我们在用户价值中添加的单引号的地方.

虽然这似乎有效,但它让我感到非常犀利.我认为SET变量是用于运行时配置的.在SET中携带数据似乎很奇怪.

编辑:这是不使用SET变量的具体原因.从联机帮助页:“这些分配是在启动的早期阶段完成的,因此为内部目的保留的变量可能会在以后被覆盖.”如果Postgres决定使用名为user的变量(或者你选择的任何东西),它可能会用你从未想过的东西覆盖你的脚本参数.实际上,psql已经为自己带来了USER – 这只能起作用,因为SET区分大小写.这从一开始就差点破坏了!

总结

以上是内存溢出为你收集整理的PostgreSQL函数中是否存在psql变量的转义语法?全部内容,希望文章能够帮你解决PostgreSQL函数中是否存在psql变量的转义语法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/1170144.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-02
下一篇2022-06-02

发表评论

登录后才能评论

评论列表(0条)

    保存