web-dev-qa-db-ja.com

REFERENCES特権は、外部キー制約の作成のみに関するものですか?実用的なユースケース?

今日、GRANT REFERENCESについて学びました。長年のSQL管理者と開発者の仕事では、それについて聞いたことがなく、問題がありませんでした。

MySQL 5.7リファレンスマニュアル/ GRANT構文 からの引用

リファレンス外部キーの作成を有効にします。レベル:グローバル、データベース、テーブル、列。

PostgreSQL 9.6/GRANT からの引用

参照外部キー制約を作成するには、参照する列と参照される列の両方に対するこの特権が必要です。特権は、テーブルのすべての列、または特定の列にのみ付与できます。

GRANT REFERENCESは、外部キー制約の作成についてのみですか?外部キー制約の作成を禁止する(ただし、テーブルの作成は許可する)のはどのビジネスケースで意味がありますか?実例を教えてもらえますか?

4
Ivanov

外部キー制約を作成する機能がある場合、実際には、テーブルの特定の列(または列のセット)に特定の値が存在するかどうかを確認する権限を取得しています。あなたはnotにこの列の値のリスト全体をSELECTする権限を持っているかもしれませんが、あなたはすでにそれらについて何かを知っていることができます。 参照テーブルに値を挿入しようとすることができます。許可されているものは、すでに参照テーブルに存在することがわかっています。

これらの値について絶対に何も知らないが必要な場合、列にforeign key constraintを作成する特権を付与することはできません。

さらに、@ Erwin、WRTがpreventを削除できるようにするためにWRTが指摘した考慮事項により、referencedテーブルから削除されます。

4
joanolo

Joanoloが説明しているのは有効な考慮事項です。ユーザーは、FK参照の作成を許可されている場合、参照先のテーブルでSELECT特権を部分的に取得できます。

さらに重要なことに、テーブルへのFK参照を作成できるユーザーは、効果的に行の削除とキー列の更新を防止するもできます。 FK参照を含む行はそのように保護されます(CASCADEDELETEUPDATEが定義されていない限り) Postgresマニュアル:

削除の制限とカスケードは、最も一般的な2つのオプションです。 RESTRICTは、参照された行の削除を防ぎます。 NO ACTIONは、制約のチェック時に参照行がまだ存在する場合、エラーが発生することを意味します。何も指定しない場合のデフォルトの動作です。

3