PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか?
ロールに設定された権限は、トリガー機能を実行する上で重要ではないようです。トリガー関数を実行するために必要な特権はEXECUTE特権であるが、トリガー関数を呼び出すトリガーを起動するアクションを実行する実際のロールではなく、テーブルの所有者にとってある日を見たことがあります。
その点を説明するドキュメント部分が見つかりません、何か助けはありますか?
PostgreSQL 8.4でトリガー関数を実行するために必要な権限は何ですか?
ロールに設定された権限は、トリガー機能を実行する上で重要ではないようです。トリガー関数を実行するために必要な特権はEXECUTE特権であるが、トリガー関数を呼び出すトリガーを起動するアクションを実行する実際のロールではなく、テーブルの所有者にとってある日を見たことがあります。
その点を説明するドキュメント部分が見つかりません、何か助けはありますか?
回答:
トリガー関数は、権限に関する限り、他の関数と同じように動作します。小さな例外を除いて:
表にトリガーを作成するには、ユーザー
TRIGGER
は表に対する権限を持っている必要があります。ユーザーにはEXECUTE
、トリガー機能に対する特権も必要です。
更新 コメントのフィードバックの後、私はいくつかの調査を行いました。Postgres WikiにはオープンなTODOアイテムがあります:
トリガーの権限チェックを強化
Postgresハッカーのこのスレッドにリンクされています。現在、EXECUTE
トリガー関数の権限はトリガーの作成時にのみチェックされ、実行時にはチェックされません。したがって、トリガー関数でEXECUTEを取り消しても、作成されたトリガーには影響しません。あなたの観察は正しいようです。
これにより、オブジェクトを操作するための追加の権限は付与されません。呼び出し元のロールに関数本体(の一部)を実行するために必要な特権がない場合、通常の例外が発生します。道を開くにOWNER
は、関数の特権ユーザーを作成し、
SECURITY DEFINER
このマニュアルに記載されている節。これにより、呼び出し元ではなく所有者の権限で関数が実行されます(デフォルト)。
所有者がスーパーユーザーである場合は、誰にEXECUTE
特権を付与するか、乱用を防ぐために関数が何をできるかを特に注意する必要があります。あなたがしたいかもしれません
REVOKE ALL ON FUNCTION foo() FROM public;
SET search_path
関数から始めて使用します。
上の章を必ずお読みください書き方SECURITY DEFINER
安全機能を。
SOのこの関連する回答でコード例を見つけてください。
NOTICE
。関数の所有者との間でALL
特権を削除しましたPUBLIC
。次に、所有者またはその機能に対する特権を持たないその他のロールを使用すると、特権の不足によるエラーが予想されますが、すべて正常に実行されます。
SECURITY DEFINER
、私はしたいですSECURITY INVOKER
。ただし、(通常の関数ではなく、トリガー関数の場合)デフォルトのオプション(SECURITY INVOKER
)を使用すると、そのように動作しないようです。