Vereinfachen Sie auf ähnliche Weise wie Sie es sich vorgestellt haben:
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$;
(Baut auf der Antwort von @a_horse_with_no_name auf und wurde durch den Kommentar von @Gregory verbessert.)
Anders beispielsweise bei CREATE TABLE
es gibt kein IF NOT EXISTS
-Klausel für CREATE ROLE
(bis mindestens S. 12). Und das können Sie nicht Ausführen dynamischer DDL-Anweisungen in einfachem SQL.
Ihre Bitte, „PL/pgSQL zu vermeiden“, ist unmöglich, es sei denn, Sie verwenden einen anderen PL. Das DO
-Anweisung verwendet plpgsql als Standardprozedursprache. Die Syntax erlaubt es, die explizite Deklaration wegzulassen:
DO [ LANGUAGE
lang_name
] code
...lang_name
Der Name der prozeduralen Sprache, in der der Code geschrieben ist. Wenn weggelassen, ist der Standardwert plpgsql
.