授予视图权限,拒绝选择表

Met*_*iel 9 mysql permissions view

我有一个 MySQL 用户,我希望它只查看我想要的视图,而不是数据库中的任何其他表。我仅授予此用户对某些视图的权限,如下所示:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'
Run Code Online (Sandbox Code Playgroud)

如果我做一个show grants;声明,我只能按预期看到这个权限。但是我希望这个用户只查询视图而不是与这些视图相关的表,但我找不到办法做到这一点。似乎是如果我希望用户对视图进行选择,则还必须为表授予选择权,还是我错了?

如果我拒绝select其余表中的语句,并且在命令行中我尝试进行选择,我会得到以下信息:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'
Run Code Online (Sandbox Code Playgroud)

这确实是我想要的,但如果我选择视图数据,我也会被拒绝。

有没有一种方法可以让用户只看到视图而不是表格?

Rol*_*DBA 6

您必须将视图视为表格。information_schema 已经做了

如果你跑

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;
Run Code Online (Sandbox Code Playgroud)

你得到所有的意见。

只需将视图上的 SELECT 授予用户,如下所示

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;
Run Code Online (Sandbox Code Playgroud)

完成此操作后,您应该具有对该表的 SELECT 访问权限。

为了确保,运行 SHOW GRANTS FOR 'thisUser'@'localhost';

您还应该能够看到授予了哪些表级访问权限 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G
Run Code Online (Sandbox Code Playgroud)

您还可以查看哪些用户具有表级访问权限 myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G
Run Code Online (Sandbox Code Playgroud)

试一试 !!!


小智 5

我知道这现在已经过时了,但这就是为我解决这个问题的方法......

答案是“SQL SECURITY”语法。

我的原始视图定义将 SQL SECURITY 设置为“INVOKER”。这意味着用户被迫同时拥有视图和表的选择权限。

当我将 SQL SECURITY 更改为“DEFINER”时,我只能授予用户对视图的选择权限。