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

     视图本质上只是一条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\'),
\'\nsource=\',-1),
\'\\_\',\'\_\'), \'\\%\',\'\%\'), \'\\\\\',\'\\\'), \'\\Z\',\'\Z\'), \'\\t\',\'\t\'),
\'\\r\',\'\r\'), \'\\n\',\'\n\'), \'\\b\',\'\b\'), \'\\\"\',\'\"\'), \'\\\\'\',\'\\'\'),
\'\\0\',\'\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



By DBA_WaterBin

2013-07-28

GOOD Luck

转载于:http://blog.itpub.net/26515977/viewspace-1208205/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值