Simplifiez de la même manière que ce que vous aviez en tête :
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$;
(S'appuyant sur la réponse de @a_horse_with_no_name et amélioré avec le commentaire de @Gregory.)
Contrairement, par exemple, à CREATE TABLE
il n'y a pas de IF NOT EXISTS
clause pour CREATE ROLE
(jusqu'à au moins la page 12). Et vous ne pouvez pas exécuter des instructions DDL dynamiques en SQL brut.
Votre demande "d'éviter PL/pgSQL" est impossible sauf en utilisant un autre PL. Le DO
L'instruction utilise plpgsql comme langage procédural par défaut. La syntaxe permet d'omettre la déclaration explicite :
DO [ LANGUAGE
lang_name
] code
lang_name
Le nom du langage procédural dans lequel le code est écrit. Si omis, la valeur par défaut estplpgsql
.