考えていたのと同じように単純化します。
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$;
(@a_horse_with_no_nameの回答に基づいて構築され、@ Gregoryのコメントで改善されました。)
たとえば、 CREATE TABLE
とは異なります IF NOT EXISTS
はありません CREATE ROLE
の句 (少なくとも12ページまで)。そして、あなたはできません プレーンSQLで動的DDLステートメントを実行します。
「PL/pgSQLを回避する」という要求は、別のPLを使用しない限り不可能です。 DO
ステートメントは、デフォルトの手続き言語としてplpgsqlを使用します。構文では、明示的な宣言を省略できます:
DO [LANGUAGE
lang_name
]コードコード>
...
lang_name
コードが記述されている手続き型言語の名前。省略された場合、デフォルトはplpgsql
です。 。