ロールが既に存在することを検出するスクリプトを作成しようとしており、存在する場合はすべての特権を取り消す必要があります。これは次のようにするとうまくいきます:
DO $$DECLARE count int;
BEGIN
SELECT count(*) INTO count FROM pg_roles WHERE rolname = 'superman';
IF count > 0 THEN
REVOKE ALL PRIVILEGES ON TABLE FROM superman;
END IF;
END$$;
しかし、環境ごとに異なるロール名を使用するため、これを環境ごとに動的にしたいと考えています。そこで、\set メカニズムを使用しようとしましたが、pl/sql を使用する場合は機能しないようです。そのため、次のようなことをすると、Postgresql は構文エラーで文句を言います:
/set environment _int
DO $$DECLARE count int;
BEGIN
SELECT count(*) INTO count FROM pg_roles WHERE rolname = 'superman';
IF count > 0 THEN
REVOKE ALL PRIVILEGES ON TABLE FROM superman:environment;
END IF;
END$$;
pl/sql でそれを行わない場合でも、revoke ステートメントは問題なく機能します。私の質問は、スクリプトにパラメータを渡してスクリプトを動的に変更するにはどうすればよいですか?