当前位置: 首页 > 面试题库 >

创建PostgreSQL ROLE(user)(如果不存在)

乜坚成
2023-03-14
问题内容

如何编写SQL脚本以在PostgreSQL 9.1中创建ROLE,但如果已经存在则不引发错误?

当前脚本仅具有:

CREATE ROLE my_user LOGIN PASSWORD 'my_password';

如果用户已经存在,则此操作将失败。我想要类似的东西:

IF NOT EXISTS (SELECT * FROM pg_user WHERE username = 'my_user')
BEGIN
    CREATE ROLE my_user LOGIN PASSWORD 'my_password';
END;

…但是那行不通-IF普通的SQL似乎不支持该功能。

我有一个批处理文件,它创建了PostgreSQL 9.1数据库,角色和其他一些东西。它调用psql.exe,并传入要运行的SQL脚本的名称。到目前为止,所有这些脚本都是纯SQL,如果可能的话,我想避免使用PL / pgSQL等。


问题答案:

以与您所想到的类似的方式进行简化:

DO
$do$
BEGIN
   IF NOT EXISTS (
      SELECT FROM pg_catalog.pg_roles  -- SELECT list can be empty for this
      WHERE  rolname = 'my_user') THEN

      CREATE ROLE my_user LOGIN PASSWORD 'my_password';
   END IF;
END
$do$;

例如,与之不同的CREATE TABLE是,没有IF NOT EXISTSfor子句CREATE ROLE(至少第12页)。而且,您无法在普通SQL中执行动态DDL语句。

您无法“避免PL / pgSQL”请求,除非使用另一个PL。该DO语句使用plpgsql作为默认过程语言。该语法允许省略显式声明

DO [ LANGUAGE lang_name ] code

… 编写代码所用的过程语言的名称。如果省略,则默认值为。
lang_name
plpgsql



 类似资料:
  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 问题内容: 我正在尝试创建表(如果尚不存在)。我目前正在检查它是否首先存在,并且该查询是否不返回任何内容,然后插入。有没有一种方法可以只检查同一条语句,因此我不必将其分解为单独的查询? 这就是我目前所拥有的。 这是我要的东西。 问题是,您不能在语句中添加一个。 问题答案: 是的,Oracle没有该功能真是可惜。我敢肯定会有一天。在此之前,如果您想编写一个PL / SQL包装器,为什么不那样做:

  • 问题内容: 任何人都可以指出我仅在数据库中当前不存在表时才能使用的正确语法吗? 我目前正在编程Java GUI,以便连接到Oracle并在数据库上执行语句,我想知道是否将其实现为Java约束还是SQLPlus约束。 问题答案: 通常,检查表是否存在没有多大意义,因为不应在运行时创建对象,而应用程序应知道在安装时创建了哪些对象。如果这是安装的一部分,那么您应该知道过程中任何时候存在哪些对象,因此您无

  • 问题内容: 我的JPA / Hibernate应用程序中有几个映射的对象。在网络上,我收到的数据包代表这些对象的更新,或者实际上可能完全代表新的对象。 我想写一个像 如果数据库中存在一个带有pk primaryKey的对象,则该对象将返回所提供类的一个对象,否则将创建该类的新对象,并将其持久化并返回。 接下来我将要处理的对象是在事务中更新其所有字段。 在JPA中是否有惯用的方法来执行此操作,还是有

  • 问题内容: 您可以给MS Access等同于MySQL“如果不存在则创建表…”吗? 更新 像这样 也将是合适的 问题答案: 对于SQL DDL代码,答案是否定的。ACE / Jet SQL没有任何流控制语法,并且ACE / Jet只能执行一个SQL语句。是的,没错:ACE / Jet不支持程序代码:(

  • 我想像这样更新文档: 但是,如果doc user\u id不存在,上述代码将抛出错误。因此,如果不存在,如何告诉Firestore创建学生,换句话说,行为如下: