Forenkle på samme måde, som du havde i tankerne:
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$;
(Bygger på @a_horse_with_no_names svar og forbedret med @Gregorys kommentar.)
I modsætning til for eksempel med CREATE TABLE
der er ingen IF NOT EXISTS
klausul for CREATE ROLE
(op til mindst side 12). Og du kan ikke udføre dynamiske DDL-sætninger i almindelig SQL.
Din anmodning om at "undgå PL/pgSQL" er umulig undtagen ved at bruge en anden PL. DO
statement bruger plpgsql som standard proceduresprog. Syntaksen tillader at udelade den eksplicitte erklæring:
DO [ LANGUAGE
lang_name
] code
...lang_name
Navnet på det proceduresprog, koden er skrevet på. Hvis udeladt, er standarden plpgsql
.