2017-07-24 74 views
2

我目前收到最新版本的MySQL(版本8.0.2),我正在尝试创建一个read-only查看是否有可能创建只读在MySQL选项查看?

这是我的查询看起来像:

CREATE VIEW Emp_Salary3 AS 
SELECT Empid, Ename, Date_Joined, Salary, Dcode 
FROM Employees 
WHERE Salary < 35000 
WITH READ ONLY; 

但后来我得到的回应是:

错误代码:1064您的SQL语法错误;检查对应于你的MySQL服务器版本正确的语法 第5行

因此,我检查了manual以及使用近“只读”的 手册,它没有一个只读选择任何责任。有没有解决这个问题的方法?

任何帮助,不胜感激。

回答

4

MySQL不支持WITH READ ONLYCREATE 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特性是否是分别DEFINERINVOKER,保持的特权检查。

这意味着视图的用户必须至少具有SELECT视图的权限。然后,如果SQL SECURITYDEFINER,那么DEFINER用户的权限将应用于视图定义中使用的表和视图。

相关问题