我在使用 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