突破MySQL視圖限制:擷取建立視圖的SQL語句

來源:互聯網
上載者:User
     視圖本質上只是一條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 -alhtotal 128Kdrwxr-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語句:SELECTREPLACE(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=2client_cs_name=utf8connection_cl_name=utf8_general_ciview_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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.