仅当 PostgreSQL 中不存在时尝试创建用户时出现语法错误[重复]

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

仅当 PostgreSQL 数据库不存在时,我才尝试使用以下命令在该数据库中创建用户:

SELECT 'CREATE USER konguser WITH ENCRYPTED PASSWORD kongpassword' 
WHERE NOT EXISTS (SELECT FROM pg_user WHERE usename = 'kongdb')\gexec
ERROR:  syntax error at or near "kongpassword"
LINE 1: CREATE USER konguser WITH ENCRYPTED PASSWORD kongpassword

使用“ ”或“”之间的密码仍然失败 我还尝试使用以下代码:

DO
$$
BEGIN
   IF NOT EXISTS ( SELECT FROM pg_user
                   WHERE  usename = 'konguser') THEN

      CREATE USER konguser WITH ENCRYPTED PASSWORD 'kongpassword';
      GRANT ALL PRIVILEGES ON DATABASE kongdb TO konguser;
      echo "test database & user successfully created"
   END IF;
END
$$;

结果如下:

ERROR:  syntax error at or near "168"
LINE 2: 168
postgresql syntax-error createuser
2个回答
0
投票

如果您是 psql 新手并且不熟悉语法,还有另一种方法可以使用 pg admin 在 psql 数据库中创建用户名。


0
投票

您的第一次尝试完全没问题 - 只是

"
不是在那里使用的正确引号,并且
'
可能与您围绕查询的引号匹配。如果您需要在文本文字中使用
'
,请将外部单引号替换为 双美元引号demo at db<>fiddle

SELECT $q$CREATE USER konguser WITH ENCRYPTED PASSWORD 'kongpassword'; $q$ 
WHERE NOT EXISTS (SELECT FROM pg_user WHERE usename = 'konguser'))\gexec

或者通过复制它来逃避它。请注意,

\gexec
仅适用于
psql
客户端作为内部元命令,在其他地方不起作用。过程 PL/pgSQL 块中的
EXECUTE
可以在任何客户端中执行相同的操作: :

DO $f$ BEGIN
EXECUTE (SELECT 'CREATE USER konguser WITH ENCRYPTED PASSWORD ''kongpassword'';'
         WHERE NOT EXISTS (SELECT FROM pg_user WHERE usename = 'konguser'));
END $f$;

此外,您尝试在

konguser
用户不存在(这是另一个用户)的情况下创建
kongdb


您的第二次尝试也完全有效,除了

echo

DO
$$
BEGIN
   IF NOT EXISTS ( SELECT FROM pg_user
                   WHERE  usename = 'konguser') THEN

      CREATE USER konguser WITH ENCRYPTED PASSWORD 'kongpassword';
      GRANT ALL PRIVILEGES ON DATABASE kongdb TO konguser;
      --echo "test database & user successfully created"
      RAISE NOTICE 'test user successfully created';
   ELSE
      RAISE NOTICE 'test user already exists';
   END IF;
END
$$;

取决于何时执行此操作以及为什么要尝试为 if not exists

 模拟 
create user
 子句,可以执行相反的操作 - 确保它们不会:

DROP USER IF EXISTS konguser;
CREATE USER konguser WITH ENCRYPTED PASSWORD 'kongpassword';

如果您正在(重新)初始化某些内容并且您可以完全控制用户以及属于他们的所有内容,那么这是有意义的。请注意,它要求您首先

REVOKE
这些特权而不是
kongdb

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