Simplifique de manera similar a lo que tenía en 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$;
(Basado en la respuesta de @a_horse_with_no_name y mejorado con el comentario de @Gregory).
A diferencia, por ejemplo, con CREATE TABLE
no hay IF NOT EXISTS
cláusula para CREATE ROLE
(hasta al menos la página 12). Y tu no puedes ejecutar sentencias DDL dinámicas en SQL simple.
Su solicitud para "evitar PL/pgSQL" es imposible excepto mediante el uso de otro PL. El DO
declaración utiliza plpgsql como lenguaje de procedimiento predeterminado. La sintaxis permite omitir la declaración explícita:
DO [ LANGUAGE
lang_name
] code
...lang_name
El nombre del lenguaje de procedimiento en el que está escrito el código. Si se omite, el valor predeterminado es plpgsql
.