如何编写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语句。
IF NOT EXISTSfor
CREATE ROLE
您无法“避免PL / pgSQL”的请求,除非使用另一个PL。该DO语句使用plpgsql作为默认过程语言。该语法允许省略显式声明:
PL / pgSQL”
DO [ LANGUAGE lang_name ] code
… 编写代码所用的过程语言的名称。如果省略,则默认值为。 lang_name plpgsql