Zjednodušte podobným způsobem, jako jste měli na mysli:
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$;
(Vychází z odpovědi @a_horse_with_no_name a je vylepšeno komentářem @Gregory.)
Na rozdíl například od CREATE TABLE
neexistuje žádný IF NOT EXISTS
klauzule pro CREATE ROLE
(nejméně do str. 12). A vy nemůžete provádět dynamické příkazy DDL v prostém SQL.
Váš požadavek na "vyhnutí se PL/pgSQL" je nemožný kromě použití jiného PL. DO
příkaz používá plpgsql jako výchozí procedurální jazyk. Syntaxe umožňuje vynechat explicitní deklaraci:
DO [ LANGUAGE
lang_name
] code
...lang_name
Název procedurálního jazyka, ve kterém je kód napsán. Pokud není vynechán, výchozí jeplpgsql
.