前端之家收集整理的这篇文章主要介绍了
如果不存在,则创建PostgreSQL ROLE(user),
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
@H_
404_0@
如何写一个
sql脚本在Postgre
sql 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等,如果可能的话。
基于
@a_horse_with_no_name的答案,我将简化与你已经想到的类似的方式:
DO
$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 is plpgsql
.