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
用户的权限将应用于视图定义中使用的表和视图。