Uprość w podobny sposób, jak miałeś na myśli:
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$;
(Budowanie na podstawie odpowiedzi @a_horse_with_no_name i ulepszone komentarzem @Gregory.)
W przeciwieństwie na przykład do CREATE TABLE
nie ma IF NOT EXISTS
klauzula CREATE ROLE
(do co najmniej s. 12). A ty nie wykonywać dynamiczne instrukcje DDL w zwykłym SQL.
Twoja prośba o "unikanie PL/pgSQL" jest niemożliwa z wyjątkiem użycia innego PL. DO
instrukcja używa plpgsql jako domyślnego języka proceduralnego. Składnia pozwala pominąć jawną deklarację:
DO [ LANGUAGE
lang_name
] code
...lang_name
Nazwa języka proceduralnego, w którym napisany jest kod. Jeśli pominięto, domyślnie jest to plpgsql
.