2013-07-26 13 views
6

基本的にはREVOKEコマンドを使用してUPDATEDELETEを無効にしたいと考えていますが、引き続きテーブルのトリガーで行を更新する必要があります。更新プログラムや削除を無効にする方法はありますか?

私のトリガーは、新しく挿入された行に対して実行し、特定のフィールドを更新します。だから、私はまだこの動作が欲しいですが、REVOKEまたはRULEで無効にすることはできません。 (I saw an SO post

TRIGGERSUPDATE/INSERTコマンドを使用しますが、残りを無効にすることを維持する方法はありますか?

+0

トリガーが挿入されている行を更新する場合は、それは誤ったデザインの兆候です。トリガーの一部として表示したり、教えてください。彼らとは何をしていますか? –

+0

挿入されたレコードの '特定のフィールドを更新する '必要がある場合 - あなたは' NEW.specific_field'に必要な値を割り当てることができます。別の更新は必要ありません。 –

+0

私はそれをデザインしていませんでしたが、私が正直で何か良いことをしたのかどうかはわかりません。私はまだトリガーを見ていない。たぶん私はこれを使うことができた、私は知らない。知らせます。おかげで – Paco

答えて

11

はい、可能です。

トリガーは、トリガー機能の特権で実行されます。デフォルトはSECURITY INVOKERです。つまり、トリガー機能は、current_userの特権で有効に実行されます。

現在のユーザーに、トリガー機能が動作するテーブルに必要な権限がない場合は、元のテーブルの元の操作がエラーになります。

ただし、あなたは、機能のOWNERの権限で実行し、この機能を持たせるトリガー機能のためSECURITY DEFINERを使用することができます。潜在的なセキュリティ上の危険になります -

スーパーユーザー自身にトリガ機能を持っている場合、それはすべてを行うことができます。マニュアル内の指示を約Writing SECURITY DEFINER Functions Safelyと考えてください。

しかし、トリガー機能の必要な特権OWNERだけでプレーンな役割を果たすことが賢明です。このような操作のための特権バンドルとして動作する、ログインせずに "デーモン"ロールを作成することさえできます。このデーモンの役割に必要な権限(スキーマ、表、順序など)のみを付与します。より洗練された設計のためには、特権を "グループロール"(再びログインなし)にバンドルし、必要なロール(この例ではデーモンロール)にこれらのグループロールを付与し、効果的にグループのメンバーにする必要があります。私はそれをたくさんしています。

また、機能自体の特権についてはthis related question on dba.SEと考えてください。

+0

ありがとう、それは本当に良いですね。あなたが提供した説明は素晴らしいです。私はチャンスがあるときにそれを確認する必要があります。再度、感謝します :) – Paco

関連する問題