postgres仅在不存在时创建用户[重复]
Posted
技术标签:
【中文标题】postgres仅在不存在时创建用户[重复]【英文标题】:postgres create user only if not exists [duplicate] 【发布时间】:2021-03-15 18:43:39 【问题描述】:作为 myquery.sql 文件的一部分,我几乎没有 CREATE 用户,它也包含很少的其他查询
我的文件是这样的
CREATE USER myuser NOLOGIN;
GRANT CONNECT on DATABSE myDataBase to myuser;
GRANT USAGE ON SCHEAMA myschema to myuser;
我在同一个文件中很少有这样的查询,由于某种原因,我需要向同一个文件添加新的查询,当再次执行同一个文件时,我遇到错误用户已经存在,并且没有到达新添加的查询.
我还检查了 postgres 中的 CREATE USER 没有 IF NOT EXISTS 类型的帮助。
那么如何添加检查以仅在不存在时创建用户。
【问题讨论】:
可以先删除用户吗? 这能回答你的问题吗? Create PostgreSQL ROLE (user) if it doesn't exist 【参考方案1】:我不知道您所说的“在 postgres 中没有 IF NOT EXISTS
对 CREATE USER 的帮助”是什么意思。快速搜索得到了这个,这将让您使用 plpgsql 进行检查:
DO
$do$
BEGIN
IF NOT EXISTS ( SELECT FROM pg_roles
WHERE rolname = 'my_user') THEN
CREATE USER myuser NOLOGIN;
GRANT CONNECT on DATABSE myDataBase to myuser;
GRANT USAGE ON SCHEMA myschema to myuser;
END IF;
END
$do$;
来自here。或者,您可以catch any exceptions 重复用户,以便查询的其余部分顺利运行,没有任何竞争条件;甚至还有一些 bash 替代方案,甚至更进一步。
注意:如果您使用 shell 脚本中的代码块。
【讨论】:
NOLOGIN
用户实际上是角色,所以他们不会在pg_shadow
中有一行。而是从pg_roles
中选择。正如您所暗示的,即使切换到pg_roles
,您的代码中也可能出现竞争条件。
知道了,感谢@JonathanJacobson 的提示;我不是 Postgres 人,只是在语法允许我在 rdbms 之间切换时涉足。以上是关于postgres仅在不存在时创建用户[重复]的主要内容,如果未能解决你的问题,请参考以下文章