是否可以在MySQL中创建具有只读选项的视图?

时间:2017-07-24 21:01:40

标签: mysql

我目前正在使用最新版本的MySQL(版本8.0.2),而我正在尝试创建read-only 视图

这是我的查询的样子:

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

然后我得到的回应是:

  

错误代码:1064。您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   语法使用附近&#39; READ ONLY&#39;在第5行

因此我检查了manual,它没有任何 READ-ONLY 选项。有解决方法吗?

任何帮助都可以得到赞赏。

3 个答案:

答案 0 :(得分:5)

MySQL并不支持CREATE VIEWWITH READ ONLY

可以间接方式创建只读视图:创建对所有表具有SELECT权限的用户和CREATE VIEW权限然后使用此用户创建视图并指定SQL SECURITY DEFINER声明中的CREATE VIEW

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特征是否为{{1}或分别为DEFINER

这意味着视图的用户必须至少具有INVOKER视图权限。然后,如果SELECTSQL SECURITY,则DEFINER用户的权限将应用于视图定义中使用的表和视图。

答案 1 :(得分:0)

创建视图后,请在INFORMATION_SCHEMA.VIEWS表中清除IS_UPDATABLE(请参见information-schema-views-table.html

答案 2 :(得分:0)

如果视图中有一个联接,则MYSQL将使该视图为只读(因为它无法更新复合视图),但这有点极端。