首页 > 数据库 > MySQL > 正文

Mysql查询视图:ERROR 1449 (HY000)解决办法

2024-07-24 12:38:00
字体:
来源:转载
供稿:网友

问题重现:前几天因为有人删除了数据库中的记录,今天关闭了数据库的远程访问功能,今天接到开发报告,说出现 The user specified as a definer (‘air’@'%’) does not exist错误,他们定位是一张视图不能访问,利用实验重现了他们的情况.

原因分析:因为创建视图使用的是xff@%用户(目前已经不存在),然后登录用户使用的是xff@localhost用户,导致mysql认为现在的用户无权限访问该视图,解决方法就是在当前用户下重建该视图.

我使用的代码,代码如下:

  1. [root@ECP-UC-DB1 ~]# mysql -uxff -pxifenfei  
  2. Welcome to the MySQL monitor.  Commands end with ; or g.  
  3. Your MySQL connection id is 8846  
  4. Server version: 5.5.14-log MySQL Community Server (GPL)  
  5.    
  6. Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.  
  7.    
  8. Oracle is a registered trademark of Oracle Corporation and/or its  
  9. affiliates. Other names may be trademarks of their respective  
  10. owners.  
  11.    
  12. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.  
  13.    
  14. mysql> select user,host from mysql.user;  
  15. +------+---------------+  
  16. user | host          |  
  17. +------+---------------+  
  18. | xff  | %             |  
  19. | root | 127.0.0.1     |  
  20. | repl | 192.168.11.10 |  
  21. | root | ::1           |  
  22. |      | ECP-UC-DB1    |  
  23. | root | ECP-UC-DB1    |  
  24. | root | localhost     |  
  25. +------+---------------+  
  26. rows in set (0.08 sec)  
  27.    
  28. mysql> use xifenfei;  
  29. Reading table information for completion of table and column names  
  30. You can turn off this feature to get a quicker startup with -A  
  31.    
  32. Database changed  
  33.    
  34. mysql> create view v_users as select * from wp_users;  
  35. Query OK, 0 rows affected (0.14 sec)  
  36.    
  37. mysql> select count(*) from xifenfei.v_users;  
  38. +----------+  
  39. count(*) |  
  40. +----------+  
  41. |        2 |  
  42. +----------+  
  43. 1 row in set (0.03 sec)  
  44.    
  45. mysql> update mysql.user set host='localhost' where user='xff' and host='%';  
  46. Query OK, 1 row affected (0.05 sec)  
  47. Rows matched: 1  Changed: 1  Warnings: 0  
  48.    
  49. mysql> FLUSH PRIVILEGES;                     
  50. Query OK, 0 rows affected (0.12 sec)  
  51.    
  52. mysql> exit  
  53. Bye  
  54. [root@ECP-UC-DB1 ~]# mysql -uxff -pxifenfei  
  55. Welcome to the MySQL monitor.  Commands end with ; or g.  
  56. Your MySQL connection id is 8847  
  57. Server version: 5.5.14-log MySQL Community Server (GPL)  
  58.    
  59. Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.  
  60.    
  61. Oracle is a registered trademark of Oracle Corporation and/or its  
  62. affiliates. Other names may be trademarks of their respective  
  63. owners.  
  64.    
  65. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.  
  66.    
  67. mysql> use xff;  
  68. ERROR 1049 (42000): Unknown database 'xff' 
  69. mysql> use xifenfei;  
  70. Reading table information for completion of table and column names  
  71. You can turn off this feature to get a quicker startup with -A  
  72. --Vevb.com 
  73. Database changed  
  74. mysql> select * from v_users ;  
  75. ERROR 1449 (HY000): The user specified as a definer ('xff'@'%') does not exist 

2、解决方法,代码如下:

  1. mysql> show databases;  
  2. +--------------------+  
  3. Database           |  
  4. +--------------------+  
  5. | information_schema |  
  6. | mysql              |  
  7. | performance_schema |  
  8. | test               |  
  9. | xifenfei           |  
  10. +--------------------+  
  11. rows in set (0.00 sec)  
  12.    
  13. mysql> use information_schema;  
  14. Reading table information for completion of table and column names  
  15. You can turn off this feature to get a quicker startup with -A  
  16.    
  17. Database changed  
  18.    
  19. mysql> desc VIEWS;  
  20. +----------------------+--------------+------+-----+---------+-------+  
  21. | Field                | Type         | Null | Key | Default | Extra |  
  22. +----------------------+--------------+------+-----+---------+-------+  
  23. | TABLE_CATALOG        | varchar(512) | NO   |     |         |       |  
  24. | TABLE_SCHEMA         | varchar(64)  | NO   |     |         |       |  
  25. | TABLE_NAME           | varchar(64)  | NO   |     |         |       |  
  26. | VIEW_DEFINITION      | longtext     | NO   |     | NULL    |       |  
  27. | CHECK_OPTION         | varchar(8)   | NO   |     |         |       |  
  28. | IS_UPDATABLE         | varchar(3)   | NO   |     |         |       |  
  29. | DEFINER              | varchar(77)  | NO   |     |         |       |  
  30. | SECURITY_TYPE        | varchar(7)   | NO   |     |         |       |  
  31. | CHARACTER_SET_CLIENT | varchar(32)  | NO   |     |         |       |  
  32. | COLLATION_CONNECTION | varchar(32)  | NO   |     |         |       |  
  33. +----------------------+--------------+------+-----+---------+-------+  
  34. 10 rows in set (0.02 sec)  
  35.    
  36. mysql> select TABLE_SCHEMA,TABLE_NAME,DEFINER from views;  
  37. +--------------+------------+---------+  
  38. | TABLE_SCHEMA | TABLE_NAME | DEFINER |  
  39. +--------------+------------+---------+  
  40. | xifenfei     | v_users    | xff@%   |  
  41. +--------------+------------+---------+  
  42. 1 row in set (0.16 sec)  
  43.    
  44. mysql> create or replace view v_users as select * from wp_users;  
  45. ERROR 1044 (42000): Access denied for user 'xff'@'localhost' to database 'information_schema' 
  46. mysql> create or replace view xifenfei.v_users as select * from xifenfei.wp_users;  
  47. Query OK, 0 rows affected (0.02 sec)  
  48.    
  49. mysql> select TABLE_SCHEMA,TABLE_NAME,DEFINER from views;  
  50. +--------------+------------+---------------+  
  51. | TABLE_SCHEMA | TABLE_NAME | DEFINER       |  
  52. +--------------+------------+---------------+  
  53. | xifenfei     | v_users    | xff@localhost |  
  54. +--------------+------------+---------------+  
  55. 1 row in set (0.01 sec)  
  56.    
  57. mysql> select count(*) from xifenfei.v_users;  
  58. +----------+  
  59. count(*) |  
  60. +----------+  
  61. |        2 |  
  62. +----------+  
  63. 1 row in set (0.03 sec) 

1.注意事项

创建视图存在如下注意事项:

(1) 运行创建视图的语句需要用户具有创建视图(CRATE VIEW)的权限,若加了[OR REPLACE]时,还需要用户具有删除视图(DROP VIEW)的权限;

(2) SELECT语句不能包含FROM子句中的子查询;

(3) SELECT语句不能引用系统或用户变量;

(4) SELECT语句不能引用预处理语句参数;

(5) 在存储子程序内,定义不能引用子程序参数或局部变量;

(6) 在定义中引用的表或视图必须存在。但是,创建了视图后,能够舍弃定义引用的表或视图。要想检查视图定义是否存在这类问题,可使用CHECK TABLE语句;

(7) 在定义中不能引用TEMPORARY表,不能创建TEMPORARY视图;

(8) 在视图定义中命名的表必须已存在;

(9) 不能将触发程序与视图关联在一起;

(10) 在视图定义中允许使用ORDER BY,但是,如果从特定视图进行了选择,而该视图使用了具有自己ORDER BY的语句,它将被忽略。

补充一下mysql视图基本知识

创建视图——CREATE VIEW

1.语法,代码如下:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [db_name.]view_name [(column_list)] AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]

通过该语句可以创建视图,若给定了[OR REPLACE],则表示当已具有同名的视图时,将覆盖原视图。select_statement是一个查询语句,这个查询语句可从表或其它的视图中查询。视图属于数据库,因此需要指定数据库的名称,若未指定时,表示在当前的数据库创建新视图。

表和数据库共享数据库中相同的名称空间,因此,数据库不能包含相同名称的表和视图,并且,视图的列名也不能重复.

1.使用举例

Eg.本例创建一个产品表(product)和一个购买记录表(purchase),再通过视图purchase_detail查询出购买的详细信息,代码如下:

  1. CREATE TABLE product 
  2. product_id INT NOT NULL
  3. name VARCHAR(50) NOT NULL
  4. price DOUBLE NOT NULL 
  5. ); 
  6. INSERT INTO product VALUES(1, 'apple ', 5.5); 
  7. CREATE TABLE purchase 
  8. id INT NOT NULL
  9. product_id INT NOT NULL
  10. qty INT NOT NULL DEFAULT 0, 
  11. gen_time DATETIME NOT NULL 
  12. ); 
  13. INSERT INTO purchase VALUES(1, 1, 10, NOW()); 
  14. CREATE VIEW purchase_detail AS SELECT product.name as name, product .price as price, purchase.qty as qty, product .price * purchase.qty as total_value from product, purchase where product.product_id = purchase.product_id; 

创建成功后,输入,SELECT * FROM purchase_detail;

运行效果如下:

  1. +-------+-------+-----+-------------+ 
  2. name | price | qty | total_value | 
  3. +-------+-------+-----+-------------+ 
  4. | apple | 5.5 | 10 | 55 | 
  5. +-------+-------+-----+-------------+ 
  6. 1 row in set (0.01 sec)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表