0

ロールが既に存在することを検出するスクリプトを作成しようとしており、存在する場合はすべての特権を取り消す必要があります。これは次のようにするとうまくいきます:

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 ステートメントは問題なく機能します。私の質問は、スクリプトにパラメータを渡してスクリプトを動的に変更するにはどうすればよいですか?

4

1 に答える 1

4

EXECUTE動的 SQLに使用する必要があります。また、DOステートメントはパラメーターを取ることができません。plpgsql 関数を作成します。

CREATE OR REPLACE FUNCTION f_revoke_all_from_role(_role text)
  RETURNS void AS
$BODY$
BEGIN

IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = _role) THEN
    EXECUTE 'REVOKE ALL PRIVILEGES ON TABLE x FROM ' || quote_ident(_role);
END IF;

END;
$BODY$ LANGUAGE plpgsql;

電話:

SELECT f_revoke_all_from_role('superman');
  • IFブロックは で簡単EXISTSです。

  • 私はquote_ident()SQLiを避けるために使用します。

  • テーブル名は、関数の 2 番目のパラメーターである可能性があります ...

于 2012-07-10T19:05:35.243 に答える