Sederhanakan dengan cara yang mirip dengan apa yang Anda pikirkan:
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$;
(Membangun jawaban @a_horse_with_no_name dan ditingkatkan dengan komentar @Gregory.)
Tidak seperti, misalnya, dengan CREATE TABLE
tidak ada IF NOT EXISTS
klausa untuk CREATE ROLE
(sampai setidaknya hal 12). Dan Anda tidak bisa mengeksekusi pernyataan DDL dinamis dalam SQL biasa.
Permintaan Anda untuk "menghindari PL/pgSQL" tidak mungkin dilakukan kecuali dengan menggunakan PL lain. DO
pernyataan menggunakan plpgsql sebagai bahasa prosedural default. Sintaksnya memungkinkan untuk menghilangkan deklarasi eksplisit:
DO [ LANGUAGE
lang_name
] code
...lang_name
Nama bahasa prosedur yang digunakan untuk menulis kode. Jika dihilangkan, defaultnya adalahplpgsql
.