如何写一个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;
我有一个批处理文件,创建一个Postgresql 9.1数据库,角色和一些其他的东西。它调用psql.exe,传入要运行的sql脚本的名称。到目前为止所有这些脚本都是纯sql,我想避免PL / pgsql等,如果可能的话。
基于
@a_horse_with_no_name的答案,我将简化与你已经想到的类似的方式:
原文链接:https://www.f2er.com/postgresql/193720.htmlDO $body$ BEGIN IF NOT EXISTS ( SELECT * FROM pg_catalog.pg_user WHERE usename = 'my_user') THEN CREATE ROLE my_user LOGIN PASSWORD 'my_password'; END IF; END $body$;
与例如CREATE TABLE
不同,没有针对CREATE ROLE
的IF NOT EXISTS子句。您不能在纯sql中执行动态DDL语句。
您的“避免PL / pgsql”的请求是不可能的(除非使用另一个PL)。 DO
statement也使用PL / pgsql。语法允许省略显式声明:
DO [ LANGUAGE
lang_name
] code
…
lang_name
The name of the procedural language the code is written in. If
omitted,the default isplpgsql
.