MySQL中創建視圖以及存儲過程中或視圖SQL SECURITY含義

1. 語法

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

在創建view或者producer,function中都有 SQL SECURITY認證。

 

2. DEFINER 指定對象所有者

如創建視圖,默認是當前誰創建視圖歸誰。

默認是當前用戶,也可以手動指定所有者

3. SQL SECURITY 指定視圖(存儲過程)查詢時的驗證方式

有2種方式:

- definer 默認,創建視圖時驗證是否有權限訪問視圖所引用的數據;

- invoker 指查詢視圖時,驗證查詢的用戶是否擁有權限訪問視圖及視圖所引用的對象;

說明:假設當前root用戶創建了一個test用戶,

同時創建一個視圖d_view 指向表 d_table,然後授權:

grant select ,show view on db.d_view to test

此時並沒有給test授予訪問d_table的權限,而只授予test訪問view的權限。

- 如果視圖指定的是definer,則可以訪問d_view 中數據

- 如果視圖本身指定invoker,那麼因爲test沒有訪問d_table表中數據,那麼訪問d_view就會報錯:

View d_view' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

總結:

直接使用默認definer(不指定SQL SECURITY)

4. ALGORITHM:指定視圖的處理方式

有三種選項:

- MERGE:將視圖的定義和查詢視圖的語句合併處理,。

- TEMPTABLE:視圖查詢的結果保存到臨時表,而後在該臨時表基礎上執行查詢視圖的語句;

- UNDEFINED:(默認)由MySQL選擇使用哪種算法,一般會首選MERGE,因爲MERGE更有效率,再說TEMPTABLE也不支持更新操作。

 

常用報錯解決

視圖本來有效,後面遷移後報錯,優先檢查view的definer是否在本地有對應的用戶,注意user@ip,ip也要對應。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章