今日、GRANT REFERENCES
について学びました。長年のSQL管理者と開発者の仕事では、それについて聞いたことがなく、問題がありませんでした。
MySQL 5.7リファレンスマニュアル/ GRANT構文 からの引用
リファレンス外部キーの作成を有効にします。レベル:グローバル、データベース、テーブル、列。
PostgreSQL 9.6/GRANT からの引用
参照外部キー制約を作成するには、参照する列と参照される列の両方に対するこの特権が必要です。特権は、テーブルのすべての列、または特定の列にのみ付与できます。
GRANT REFERENCES
は、外部キー制約の作成についてのみですか?外部キー制約の作成を禁止する(ただし、テーブルの作成は許可する)のはどのビジネスケースで意味がありますか?実例を教えてもらえますか?
外部キー制約を作成する機能がある場合、実際には、テーブルの特定の列(または列のセット)に特定の値が存在するかどうかを確認する権限を取得しています。あなたはnotにこの列の値のリスト全体をSELECT
する権限を持っているかもしれませんが、あなたはすでにそれらについて何かを知っていることができます。 参照テーブルに値を挿入しようとすることができます。許可されているものは、すでに参照テーブルに存在することがわかっています。
これらの値について絶対に何も知らないが必要な場合、列にforeign key constraint
を作成する特権を付与することはできません。
さらに、@ Erwin、WRTがpreventを削除できるようにするためにWRTが指摘した考慮事項により、referencedテーブルから削除されます。
Joanoloが説明しているのは有効な考慮事項です。ユーザーは、FK参照の作成を許可されている場合、参照先のテーブルでSELECT
特権を部分的に取得できます。
さらに重要なことに、テーブルへのFK参照を作成できるユーザーは、効果的に行の削除とキー列の更新を防止するもできます。 FK参照を含む行はそのように保護されます(CASCADE
とDELETE
にUPDATE
が定義されていない限り) Postgresマニュアル:
削除の制限とカスケードは、最も一般的な2つのオプションです。
RESTRICT
は、参照された行の削除を防ぎます。NO ACTION
は、制約のチェック時に参照行がまだ存在する場合、エラーが発生することを意味します。何も指定しない場合のデフォルトの動作です。