【问题标题】:postgres create user only if not exists [duplicate]postgres仅在不存在时创建用户[重复]
【发布时间】: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 类型的帮助。

那么如何添加检查以仅在不存在时创建用户。

【问题讨论】:

标签: sql postgresql


【解决方案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 之间切换时涉足。
猜你喜欢
  • 2013-03-13
  • 2015-08-16
  • 1970-01-01
  • 2013-03-26
  • 2013-05-11
  • 2017-10-14
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多