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 .