gpt4 book ai didi

sql - 从匿名 block 中的变量创建带密码的用户

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

我想创建一个脚本,该脚本将包含 _user_pass 变量,以在 Postgres 数据库中创建用户如果这样的登录尚不存在。我原以为这会起作用,但我不知道是什么问题:

DO
$DO$
DECLARE
_user TEXT := 'myuser';
_pass TEXT := 'user!pass';
BEGIN
IF NOT EXISTS ( SELECT 1 FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
RAISE NOTICE 'Creating user % ...',_user;
CREATE USER _user WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD _pass;

RAISE NOTICE 'Created user %',_user;
ELSE
RAISE NOTICE 'User % already exists, not creating it',_user;
END IF;
END
$DO$

如何用变量的内容强制替换变量?

$DO$$$ 有什么区别?

最佳答案

要参数化标识符或语法元素,您通常需要使用带有 EXECUTE 的动态 SQL - 最好与 format() 结合使用以便于使用。

但实用命令(包括所有 SQL DDL 语句)根本不允许传递值或参数替换。您需要在执行之前连接完整的语句。见:

你的代码会像这样工作:

DO
$do$
DECLARE
_user text := 'myuser';
_pass text := 'user!pass';
BEGIN
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = _user) THEN
EXECUTE format(
'CREATE USER %I WITH
LOGIN
NOSUPERUSER
CREATEDB
CREATEROLE
NOREPLICATION
PASSWORD %L'
, _user
, _pass
);
RAISE NOTICE 'Created user "%"', _user;
ELSE
RAISE NOTICE 'User "%" already exists, not creating it', _user;
END IF;
END
$do$

但是尽管 _user_pass 无论如何都是硬编码的,但您可以像此处演示的那样进行简化:

Also what is the difference between $DO$ and $$?

参见:

关于sql - 从匿名 block 中的变量创建带密码的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49169566/

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