小编典典

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

sql

如何编写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等。


阅读 313

收藏
2021-04-16

共1个答案

小编典典

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

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

2021-04-16