Semplifica in modo simile a quello che avevi in mente:
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$;
(Basato sulla risposta di @a_horse_with_no_name e migliorato con il commento di @Gregory.)
Diversamente, ad esempio, con CREATE TABLE
non esiste IF NOT EXISTS
clausola per CREATE ROLE
(fino ad almeno pag. 12). E tu non puoi eseguire istruzioni DDL dinamiche in semplice SQL.
La tua richiesta di "evitare PL/pgSQL" è impossibile se non utilizzando un altro PL. Il DO
istruzione usa plpgsql come linguaggio procedurale predefinito. La sintassi permette di omettere la dichiarazione esplicita:
DO [ LANGUAGE
lang_name
] code
...lang_name
Il nome del linguaggio procedurale in cui è scritto il codice. Se omesso, il valore predefinito è plpgsql
.