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

小浪SEO博客 专注SEO优化思维、SEO技术的实战分享类博客~

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

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

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

  1. [root@ECP-UC-DB1~]#mysql-uxff-pxifenfei
  2. WelcometotheMySQLmonitor.Commandsendwith;org.
  3. YourMySQLconnectionidis8846
  4. Serverversion:5.5.14-logMySQLCommunityServer(GPL)
  5. Copyright(c)2000,2010,Oracleand/oritsaffiliates.Allrightsreserved.
  6. OracleisaregisteredtrademarkofOracleCorporationand/orits
  7. affiliates.Othernamesmaybetrademarksoftheirrespective
  8. owners.
  9. Type'help;'or'h'forhelp.Type'c'toclearthecurrentinputstatement.
  10. mysql>selectuser,hostfrommysql.user;
  11. +------+---------------+
  12. |user|host|
  13. +------+---------------+
  14. |xff|%|
  15. |root|127.0.0.1|
  16. |repl|192.168.11.10|
  17. |root|::1|
  18. ||ECP-UC-DB1|
  19. |root|ECP-UC-DB1|
  20. |root|localhost|
  21. +------+---------------+
  22. 7rowsinset(0.08sec)
  23. mysql>usexifenfei;
  24. Readingtableinformationforcompletionoftableandcolumnnames
  25. Youcanturnoffthisfeaturetogetaquickerstartupwith-A
  26. Databasechanged
  27. mysql>createviewv_usersasselect*fromwp_users;
  28. QueryOK,0rowsaffected(0.14sec)
  29. mysql>selectcount(*)fromxifenfei.v_users;
  30. +----------+
  31. |count(*)|
  32. +----------+
  33. |2|
  34. +----------+
  35. 1rowinset(0.03sec)
  36. mysql>updatemysql.usersethost='localhost'whereuser='xff'andhost='%';
  37. QueryOK,1rowaffected(0.05sec)
  38. Rowsmatched:1Changed:1Warnings:0
  39. mysql>FLUSHPRIVILEGES;
  40. QueryOK,0rowsaffected(0.12sec)
  41. mysql>exit
  42. Bye
  43. [root@ECP-UC-DB1~]#mysql-uxff-pxifenfei
  44. WelcometotheMySQLmonitor.Commandsendwith;org.
  45. YourMySQLconnectionidis8847
  46. Serverversion:5.5.14-logMySQLCommunityServer(GPL)
  47. Copyright(c)2000,2010,Oracleand/oritsaffiliates.Allrightsreserved.
  48. OracleisaregisteredtrademarkofOracleCorporationand/orits
  49. affiliates.Othernamesmaybetrademarksoftheirrespective
  50. owners.
  51. Type'help;'or'h'forhelp.Type'c'toclearthecurrentinputstatement.
  52. mysql>usexff;
  53. ERROR1049(42000):Unknowndatabase'xff'
  54. mysql>usexifenfei;
  55. Readingtableinformationforcompletionoftableandcolumnnames
  56. Youcanturnoffthisfeaturetogetaquickerstartupwith-A
  57. --phpfensi.com
  58. Databasechanged
  59. mysql>select*fromv_users;
  60. ERROR1449(HY000):Theuserspecifiedasadefiner('xff'@'%')doesnotexist

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

  1. mysql>showdatabases;
  2. +--------------------+
  3. |Database|
  4. +--------------------+
  5. |information_schema|
  6. |mysql|
  7. |performance_schema|
  8. |test|
  9. |xifenfei|
  10. +--------------------+
  11. 5rowsinset(0.00sec)
  12. mysql>useinformation_schema;
  13. Readingtableinformationforcompletionoftableandcolumnnames
  14. Youcanturnoffthisfeaturetogetaquickerstartupwith-A
  15. Databasechanged
  16. mysql>descVIEWS;
  17. +----------------------+--------------+------+-----+---------+-------+
  18. |Field|Type|Null|Key|Default|Extra|
  19. +----------------------+--------------+------+-----+---------+-------+
  20. |TABLE_CATALOG|varchar(512)|NO||||
  21. |TABLE_SCHEMA|varchar(64)|NO||||
  22. |TABLE_NAME|varchar(64)|NO||||
  23. |VIEW_DEFINITION|longtext|NO||NULL||
  24. |CHECK_OPTION|varchar(8)|NO||||
  25. |IS_UPDATABLE|varchar(3)|NO||||
  26. |DEFINER|varchar(77)|NO||||
  27. |SECURITY_TYPE|varchar(7)|NO||||
  28. |CHARACTER_SET_CLIENT|varchar(32)|NO||||
  29. |COLLATION_CONNECTION|varchar(32)|NO||||
  30. +----------------------+--------------+------+-----+---------+-------+
  31. 10rowsinset(0.02sec)
  32. mysql>selectTABLE_SCHEMA,TABLE_NAME,DEFINERfromviews;
  33. +--------------+------------+---------+
  34. |TABLE_SCHEMA|TABLE_NAME|DEFINER|
  35. +--------------+------------+---------+
  36. |xifenfei|v_users|xff@%|
  37. +--------------+------------+---------+
  38. 1rowinset(0.16sec)
  39. mysql>createorreplaceviewv_usersasselect*fromwp_users;
  40. ERROR1044(42000):Accessdeniedforuser'xff'@'localhost'todatabase'information_schema'
  41. mysql>createorreplaceviewxifenfei.v_usersasselect*fromxifenfei.wp_users;
  42. QueryOK,0rowsaffected(0.02sec)
  43. mysql>selectTABLE_SCHEMA,TABLE_NAME,DEFINERfromviews;
  44. +--------------+------------+---------------+
  45. |TABLE_SCHEMA|TABLE_NAME|DEFINER|
  46. +--------------+------------+---------------+
  47. |xifenfei|v_users|xff@localhost|
  48. +--------------+------------+---------------+
  49. 1rowinset(0.01sec)
  50. mysql>selectcount(*)fromxifenfei.v_users;
  51. +----------+
  52. |count(*)|
  53. +----------+
  54. |2|
  55. +----------+
  56. 1rowinset(0.03sec)

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. CREATETABLEproduct
  2. (
  3. product_idINTNOTNULL,
  4. nameVARCHAR(50)NOTNULL,
  5. priceDOUBLENOTNULL
  6. );
  7. INSERTINTOproductVALUES(1,'apple',5.5);
  8. CREATETABLEpurchase
  9. (
  10. idINTNOTNULL,
  11. product_idINTNOTNULL,
  12. qtyINTNOTNULLDEFAULT0,
  13. gen_timeDATETIMENOTNULL
  14. );
  15. INSERTINTOpurchaseVALUES(1,1,10,NOW());
  16. CREATEVIEWpurchase_detailASSELECTproduct.nameasname,product.priceasprice,purchase.qtyasqty,product.price*purchase.qtyastotal_valuefromproduct,purchasewhereproduct.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. 1rowinset(0.01sec)

相关广告
  • Mysql查询视图:ERROR 1449 (HY000)解决办法 Mysql查询视图:ERROR 1449 (HY000)解决办法 Mysql查询视图:ERROR 1449 (HY000)解决办法
相关阅读

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

2019/10/10 17:35:20 | 谷歌SEO算法 | 小明SEO博客