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


9

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

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

如果我show grants;发表声明,我只能按预期看到此权限。但是,我希望该用户仅查询视图,而不查询与这些视图相关的表,但是我找不到解决方法。似乎是如果我希望用户在视图上进行选择,则还必须为表授予选择权,否则我错了吗?

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

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

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

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

Answers:


6

您将不得不将视图视为表格。information_schema已经完成

如果你跑

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

您得到所有​​的意见。

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

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

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

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

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

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

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

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

试试看 !!!


嘿,你做到了!谢谢!我找不到自己的解决方案!非常感谢!
Metafaniel 2014年

5

我知道这已经很老了,但这是为我解决了这个问题的原因...

答案是使用“ SQL SECURITY”语法。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.