Đơn giản hóa theo cách tương tự như những gì bạn đã nghĩ:
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$;
(Dựa trên câu trả lời của @ a_horse_with_no_name và được cải thiện với nhận xét của @ Gregory.)
Chẳng hạn, không giống như với CREATE TABLE
không có IF NOT EXISTS
mệnh đề cho CREATE ROLE
(tối thiểu là pg 12). Và bạn không thể thực thi các câu lệnh DDL động trong SQL thuần túy.
Yêu cầu của bạn để "tránh PL / pgSQL" là không thể ngoại trừ bằng cách sử dụng PL khác. DO
câu lệnh sử dụng plpgsql làm ngôn ngữ thủ tục mặc định. Cú pháp cho phép bỏ qua khai báo rõ ràng:
DO [ LANGUAGE
lang_name
] code
...
lang_name
Tên của ngôn ngữ thủ tục mà mã được viết. Nếu được mã hóa, giá trị mặc định làplpgsql
.