web-dev-qa-db-ja.com

ビューの作成にSQL Securityの定義者または呼び出し元を使用しますか?

CREATE VIEW構文は

CREATE
    [OR REPLACE]
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    [DEFINER = { user | CURRENT_USER }]
    [SQL SECURITY { DEFINER | INVOKER }]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

SECURITYの場合、DEFINERまたはINVOKERを設定できます。 「definer」を選択するのはいつ意味がありますか?私が理解している限り、これは、ビューを作成している人である自分のセキュリティ権限を確認することを意味します。データベース全体に対する完全な権限がある場合は、any呼び出し元に完全なアクセス権を与えるビューを作成しました。それは間違っているようです。常にセキュリティを実際にビューを使用している人にしたくないですか?

6
djechlin

ドキュメント から引用。

SUPER権限を持っている場合は、構文的に正当なアカウント名を指定できます。アカウントが実際に存在しない場合、警告が生成されます。

ビューの作成者以外のセキュリティアカウントを指定できることは、DEFINERを使用する上で重要な要素であり、見逃しているようです。

ビューが参照されると、ビューによってアクセスされるオブジェクトの特権が、ビューのDEFINERアカウントによって保持されている特権と照合されます...

つまり、基礎となるオブジェクトへのアクセス権を持つセキュリティアカウントを使用するようにDEFINERを設定できますが、それらのオブジェクトへのアクセスをユーザー全体に拒否することで、より厳密なセキュリティを維持できます。

たとえば、ユーザーが一般的にアクセスできないテーブルPrivateDataがあるが、このテーブルのメタデータを追跡する内部レポートを作成するとします。ユーザーに対するPrivateDataの権限を拒否しますが、テーブルへの読み取り専用アクセス権を持つアカウントPrivateDataReaderを作成します。次に、DEFANERとしてPrivateDataReaderを指定して、メタデータ情報を表示するビューを作成できます。

ビューにアクセスするユーザーのセキュリティを常に使用する場合は、INVOKERを指定する必要があります。