突破MySQL视图限制:获取创建视图的SQL语句

php中文网
发布: 2016-06-07 17:31:10
原创
1490人浏览过

创建视图的SQL包含了一个load_file()函数、为了使用该函数、必须满足下面所有条件:

视图本质上只是一条sql语句而已、但令人蛋疼的是mysql并没有把该sql语句存储下来
而是像对待表一样、把视图的定义用文件的形式保存、以 .frm 存在
那么用show create view 显示的sql将非常不友好

下面介绍一种方法来突破这种限制

创建视图:

mysql> create view v_t as select id from t where id=2;
Query OK, 0 rows affected (0.03 sec)

到相应目录查找视图定义文件:

[mysql@obe11g test]$ pwd
/home/mysql/mysql/data/test
[mysql@obe11g test]$ ls -alh
total 128K
drwxr-xr-x  2 mysql dba 4.0K Jul 27 19:45 .
drwxr-xr-x  5 mysql dba 4.0K Jul 27 19:13 ..
-rw-r--r--  1 mysql dba  65 Jun 19 10:20 db.opt
-rw-rw----  1 mysql dba 8.4K Jul 24 19:58 t.frm
-rw-rw----  1 mysql dba  96K Jul 27 19:44 t.ibd
-rwxrwxrwx  1 mysql dba  451 Jul 27 19:45 v_t.frm


先用 show create view查询:

mysql> show create view v_t;
+------+----------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View      | character_set_client | collation_connection |
+------+----------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v_t  | CREATE ALGORITHM=UNDEFINED DEFINER=`waterbin`@`localhost` SQL SECURITY DEFINER VIEW `v_t` AS select `t`.`id` AS `id` from `t` where (`t`.`id` = 2) | utf8                | utf8_general_ci      |
+------+----------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

会发现包含大量转义符、引号、没有代码格式化、没有注释、没有缩进等等、可读性很差、无法快速拷贝进行重建视图

查询创建视图的SQL语句:

SELECT
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
SUBSTRING_INDEX(LOAD_FILE('/home/mysql/mysql/data/test/v_t.frm'),
' source=',-1),
'\_','_'), '\%','%'), '\\','\'), '\Z','Z'), '\t',' '),
'\r',' '), '\n',' '), '\b',''), '\"','"'), '\'','''),
'\0','')
AS source;

输出结果、第一行便是该SQL:

+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| source                  |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| select id from t where id=2
client_cs_name=utf8
connection_cl_name=utf8_general_ci
view_body_utf8=select `test`.`t`.`id` AS `id` from `test`.`t` where (`test`.`t`.`id` = 2)
 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

创建视图的SQL包含了一个load_file()函数、为了使用该函数、必须满足下面所有条件:

① the file must be located on the server host

② you must specify the full path name to the file

③ you must have the FILE privilege

验证:select user,file_priv from mysql.user;

④ The file must be readable by all

提醒:这里的all、不仅是OWNER、GROUP;还特指OTHERE!!

⑤ its size less than max_allowed_packet bytes

⑥ If the secure_file_priv system variable is set to a nonempty directory name

the file to be loaded must be located in that directory

相关阅读:

MySQL视图表创建与修改

MySQL视图(view)

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号