web-dev-qa-db-ja.com

PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか?

PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか?

ロールに設定された権限は、トリガー機能を実行する上で重要ではないようです。トリガー関数を実行するために必要な特権がEXECUTE特権であるということをいつか目にしたと思いますが、トリガー関数を呼び出すトリガーを起動するアクションを実行する実際のロールではありません。

その点を説明するドキュメント部分が見つかりません、何か助けはありますか?

11
user18077

トリガー関数は、特権に関する限り、他の関数と同じように動作します。小さな例外を除いて:

テーブルにトリガーを作成するには、ユーザーはテーブルに対するTRIGGER特権を持っている必要があります。ユーザーには、トリガー関数に対するEXECUTE特権も必要です。

[〜#〜] update [〜#〜]コメントのフィードバックの後、私はいくつかの調査を行いました。 Postgres Wikiに open TODOアイテムがあります:

トリガー許可チェックを強化

Postgresハッカーのこのスレッド にリンクされています。現在、トリガー関数に対するEXECUTE特権はトリガーcreate時にのみチェックされ、実行時にはチェックされません。したがって、トリガー関数でEXECUTEを取り消しても、作成されたトリガーには影響しません。あなたの観察は正しいようです。

これにより、オブジェクトを操作するための追加の権限は付与されません。呼び出し元のロールに関数本体(の一部)を実行するために必要な特権がない場合、通常の例外が発生します。道を開くには、関数の特権ユーザーOWNERを作成し、

SECURITY DEFINER

マニュアルのここに記載されている のようにこれにより、invoker(デフォルト)ではなく、ownerの権限で関数が実行されます。

所有者がスーパーユーザーである場合は、EXECUTE特権を誰に付与するか、および乱用を回避するために関数が何ができるかを特に注意する必要があります。あなたがしたいかもしれません

REVOKE ALL ON FUNCTION foo() FROM public;

まず、関数にSET search_pathを使用します。
Writing SECURITY DEFINER Functions Safely の章を必ずお読みください。

SOのこの関連する回答で codeの例を見つけてください。

10