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仅在不存在时创建用户[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 仅在不存在时创建索引

仅在不存在时添加到域列表

Fluent NHibernate - 仅在不存在时创建数据库模式

仅在不存在时将脚本添加到头部

Gremlin - 仅在不存在时添加顶点

Mongodb如何仅在不存在时插入(如果存在则不更新)?