为什么需要选择 *.* 上的权限才能使用视图?

为什么需要选择 *.* 上的权限才能使用视图?

我在使用 MySQL 服务器 5.0 (5.0.92) 的视图时遇到问题

我无法使用具有如下权限的用户进行查看:

GRANT USAGE ON *.* TO 'testuser'@'' IDENTIFIED BY PASSWORD '**********';
GRANT ALL PRIVILEGES ON `testuser`.* TO 'testuser'@'';

mysql db 表中的记录:

mysql> select * from db where user='testuser'\G;
*************************** 1. row ***************************
             Host: 
               Db: testuser
             User: testuser
      Select_priv: Y
      Insert_priv: Y
      Update_priv: Y
      Delete_priv: Y
      Create_priv: Y
        Drop_priv: Y
       Grant_priv: N
  References_priv: Y
       Index_priv: Y
       Alter_priv: Y
Create_tmp_table_priv: Y
 Lock_tables_priv: Y
 Create_view_priv: Y
   Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
     Execute_priv: Y
         max_size: 1024
  max_size_status: 0

我的连接方式如下:

mysql> SELECT USER(),CURRENT_USER();
+-------------------------+-----------------+
| USER()                  | CURRENT_USER()  |
+-------------------------+-----------------+
| [email protected]      | testuser@       | 
+-------------------------+-----------------+

我可以创建视图,但是当我尝试选择时,出现以下消息:

ERROR 1356 (HY000): View 'testuser.v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

我可以展示以下观点:

mysql> SHOW CREATE VIEW testuser.v;
| View | Create View
| v    | CREATE ALGORITHM=UNDEFINED DEFINER=`testuser`@`` SQL SECURITY DEFINER VIEW `testuser`.`v` AS select `testuser`.`t`.`qty` AS `qty`,`testuser`.`t`.`price` AS `price`,(`testuser`.`t`.`qty` * `testuser`.`t`.`price`) AS `value` from `testuser`.`t`

视图仅引用同一数据库中名为“t”的表:

show create table testuser.t;
| t     | CREATE TABLE `t` (
`qty` int(11) default NULL,
`price` int(11) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 

我需要GRANT SELECT ON *.* TO 'testuser'@''选择在视图上工作。

为什么 ?

您知道在没有选择权限的情况下使用VIEW的解决方案吗?

非常感谢您的回答。

答案1

这完全取决于你如何验证

你应该运行以下命令

SELECT USER(),CURRENT_USER();

最有可能的是,testuser@'' 不是您可以明确联系的用户。testuser@'' 的权限将授予匿名用户。

您可能需要尝试操作 mysql.db。运行此

SELECT COUNT(1) FROM mysql.db WHERE LEFT(db,4)='test' AND user='';;

如果得到非零答案,则运行SELECT * FROM mysql.db\G并更新所需的列。然后,运行FLUSH PRIVILEGES;

无论如何,最好记住,VIEW 是 information_schema.tables 中的一个表,其中 engine 列为 NULL。因此,请确保可以访问 testuser 数据库中的底层表所需的适当权限。

您可能需要调整视图的 SECURITY_TYPE 级别。

答案2

查看视图的内容与查看常规表的内容没有什么不同 - 您需要对其运行选择查询。因此,您必须先授予用户选择权限,然后用户才能对视图运行选择。

答案3

testuser.t本身是一个引用另一个数据库中用户无法访问的表的视图吗?

你可能会有这样的事情:

testuser.v -> testuser.t -> otherdatabase.table

向我们展示结果SHOW CREATE TABLE testuser.t \G

相关内容