联系:手机/微信(+86 17813235971) QQ(107644445)
标题:Mysql查询视图:ERROR 1449 (HY000)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
1、问题重现
前几天因为有人删除了数据库中的记录,今天关闭了数据库的远程访问功能,今天接到开发报告,说出现 The user specified as a definer (‘air’@’%’) does not exist错误,他们定位是一张视图不能访问。利用实验重现了他们的情况
[root@ECP-UC-DB1 ~]# mysql -uxff -pxifenfei Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8846 Server version: 5.5.14-log MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user,host from mysql.user; +------+---------------+ | user | host | +------+---------------+ | xff | % | | root | 127.0.0.1 | | repl | 192.168.11.10 | | root | ::1 | | | ECP-UC-DB1 | | root | ECP-UC-DB1 | | root | localhost | +------+---------------+ 7 rows in set (0.08 sec) mysql> use xifenfei; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> create view v_users as select * from wp_users; Query OK, 0 rows affected (0.14 sec) mysql> select count(*) from xifenfei.v_users; +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.03 sec) mysql> update mysql.user set host='localhost' where user='xff' and host='%'; Query OK, 1 row affected (0.05 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.12 sec) mysql> exit Bye [root@ECP-UC-DB1 ~]# mysql -uxff -pxifenfei Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8847 Server version: 5.5.14-log MySQL Community Server (GPL) Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use xff; ERROR 1049 (42000): Unknown database 'xff' mysql> use xifenfei; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from v_users ; ERROR 1449 (HY000): The user specified as a definer ('xff'@'%') does not exist
2、解决方法
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | xifenfei | +--------------------+ 5 rows in set (0.00 sec) mysql> use information_schema; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> desc VIEWS; +----------------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +----------------------+--------------+------+-----+---------+-------+ | TABLE_CATALOG | varchar(512) | NO | | | | | TABLE_SCHEMA | varchar(64) | NO | | | | | TABLE_NAME | varchar(64) | NO | | | | | VIEW_DEFINITION | longtext | NO | | NULL | | | CHECK_OPTION | varchar(8) | NO | | | | | IS_UPDATABLE | varchar(3) | NO | | | | | DEFINER | varchar(77) | NO | | | | | SECURITY_TYPE | varchar(7) | NO | | | | | CHARACTER_SET_CLIENT | varchar(32) | NO | | | | | COLLATION_CONNECTION | varchar(32) | NO | | | | +----------------------+--------------+------+-----+---------+-------+ 10 rows in set (0.02 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,DEFINER from views; +--------------+------------+---------+ | TABLE_SCHEMA | TABLE_NAME | DEFINER | +--------------+------------+---------+ | xifenfei | v_users | xff@% | +--------------+------------+---------+ 1 row in set (0.16 sec) mysql> create or replace view v_users as select * from wp_users; ERROR 1044 (42000): Access denied for user 'xff'@'localhost' to database 'information_schema' mysql> create or replace view xifenfei.v_users as select * from xifenfei.wp_users; Query OK, 0 rows affected (0.02 sec) mysql> select TABLE_SCHEMA,TABLE_NAME,DEFINER from views; +--------------+------------+---------------+ | TABLE_SCHEMA | TABLE_NAME | DEFINER | +--------------+------------+---------------+ | xifenfei | v_users | xff@localhost | +--------------+------------+---------------+ 1 row in set (0.01 sec) mysql> select count(*) from xifenfei.v_users; +----------+ | count(*) | +----------+ | 2 | +----------+ 1 row in set (0.03 sec)
3、原因分析
因为创建视图使用的是xff@%用户(目前已经不存在),然后登录用户使用的是xff@localhost用户,导致mysql认为现在的用户无权限访问该视图,解决方法就是在当前用户下重建该视图
也可以修改存储过程的Definer