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


11

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

ロールに設定された権限は、トリガー機能を実行する上で重要ではないようです。トリガー関数を実行するために必要な特権はEXECUTE特権であるが、トリガー関数を呼び出すトリガーを起動するアクションを実行する実際のロールではなく、テーブルの所有者にとってある日を見たことがあります。

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

回答:


10

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

表にトリガーを作成するには、ユーザー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のこの関連する回答でコード例を見つけてください


いいえ、私はしたくないSECURITY DEFINER、私はしたいですSECURITY INVOKER。ただし、(通常の関数ではなく、トリガー関数の場合)デフォルトのオプション(SECURITY INVOKER)を使用すると、そのように動作しないようです。

1
@EtienneRouxel:トリガー関数は、特権に関する限り、他の関数と同様の関数です。そうでなければどう思いますか?
Erwin Brandstetter 2013

@EtienneRouxel:小さな例外を文書化するために、マニュアルから引用を追加しました。
Erwin Brandstetter 2013

1
テスト:を発生させる単純なトリガー関数を作成しましたNOTICE。関数の所有者との間でALL特権を削除しましたPUBLIC。次に、所有者またはその機能に対する特権を持たないその他のロールを使用すると、特権の不足によるエラーが予想されますが、すべて正常に実行されます。

2
@EtienneRouxel:興味深い。私もテストしました。トリガー関数の実行権限がないと、トリガーを作成できません。ただし、トリガーを作成した後でもその実行権限を取り消すことができ、トリガーは機能を停止しません。調査をしました。質問へのリンクの追加...
Erwin Brandstetter 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.