仅当 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
如果您是 psql 新手并且不熟悉语法,还有另一种方法可以使用 pg admin 在 psql 数据库中创建用户名。
您的第一次尝试完全没问题 - 只是
"
不是在那里使用的正确引号,并且 '
可能与您围绕查询的引号匹配。如果您需要在文本文字中使用 '
,请将外部单引号替换为 双美元引号: 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
。