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也要對應。