MySQL不支持WITH READ ONLY
爲CREATE VIEW
。
它可以創建以間接的方式只讀視圖:創建具有對所有表和CREATE VIEW
特權SELECT
權限的用戶,然後用這個用戶創建視圖和CREATE VIEW
語句中指定SQL SECURITY DEFINER
:
CREATE
DEFINER = CURRENT_USER
SQL SECURITY DEFINER
VIEW Emp_Salary3 AS
SELECT Empid, Ename, Date_Joined, Salary, Dcode
FROM Employees
WHERE Salary < 35000
如果您使用受限用戶創建視圖,則不需要該行DEFINER = CURRENT_USER
。
或者你可以使用管理員用戶創建的視圖,並在這種情況下,行DEFINER =
必須包含將擁有視圖的用戶的名稱。
的文檔解釋:
MySQL的檢查,查看權限是這樣的:
在視圖定義時,視圖創建者必須使用由視圖訪問的頂級對象所需要的權限。例如,如果視圖定義是指表列,創建者必須具有一些特權在定義的選擇列表中的每一列,並且SELECT
特權在定義其它地方使用的每一列。如果定義指的是存儲功能,只調用函數所需的權限,可以進行檢查。對於不同的調用,在函數內不同的執行路徑可能採取的:在函數調用時所需的權限,只能在執行時進行檢查。
誰引用視圖,必須具有相應的訪問權限的用戶(SELECT
從中選擇,INSERT
插入到它,等等。)
當視圖已經被引用的對象權限訪問由視圖是針對由視圖DEFINER
帳戶或調用,這取決於SQL SECURITY
特性是否是分別DEFINER
或INVOKER
,保持的特權檢查。
這意味着視圖的用戶必須至少具有SELECT
視圖的權限。然後,如果SQL SECURITY
是DEFINER
,那麼DEFINER
用戶的權限將應用於視圖定義中使用的表和視圖。