我目前正在使用最新版本的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 选项。有解决方法吗?
任何帮助都可以得到赞赏。
答案 0 :(得分:5)
MySQL并不支持CREATE VIEW
的WITH 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
视图权限。然后,如果SELECT
为SQL SECURITY
,则DEFINER
用户的权限将应用于视图定义中使用的表和视图。
答案 1 :(得分:0)
创建视图后,请在INFORMATION_SCHEMA.VIEWS表中清除IS_UPDATABLE(请参见information-schema-views-table.html)
答案 2 :(得分:0)
如果视图中有一个联接,则MYSQL将使该视图为只读(因为它无法更新复合视图),但这有点极端。