为什么需要在*。*上使用视图select特权?

我有一个问题,使用MySQL服务器5.0(5.0.92)

我不能使用像这样的用户使用视图:

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

mysql数据库表中logging:

 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@ | +-------------------------+-----------------+ 

我可以创build视图,但是当我尝试select时,我有这样的信息:

 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'@''使select工作的视图。

为什么?

你知道一个解决scheme使用没有select特权的视图

非常感谢您的答复。

这完全取决于你如何validation

你应该运行以下

 SELECT USER(),CURRENT_USER(); 
  • USER()报告你如何尝试在MySQL中进行身份validation
  • CURRENT_USER()报告你如何被允许在MySQL中进行身份validation

很可能,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中的表WHERE引擎列是NULL。 因此,请确保访问testuser数据库中的基础表的正确权限是可访问的。

许多人需要调整View的SECURITY_TYPE级别。

要查看视图的内容与查看常规表的内容没有什么不同 – 您需要对其运行select查询。 因此,必须在用户可以对视图运行select之前授予用户select权。

testusert本身是一个视图,引用另一个数据库中的用户将无法访问的表?

你可能有这样的事情:

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

向我们SHOW CREATE TABLE testuser.t \G