1. 程式人生 > >全面學習MySQL中的檢視(1) 檢視安全驗證的方式

全面學習MySQL中的檢視(1) 檢視安全驗證的方式

全面學習MySQL中的檢視(1) 檢視安全驗證的方式

一、檢視的建立

  MySQL資料庫中的View在標準SQL的基礎之上做了些擴充套件,這主要體現在幾個方式:

  •   
  • DEFINER:指定檢視的建立者(或者說屬主,雖然MySQL中的物件其實不注重屬主,這點與ORACLE資料庫極為不同),預設當然就是執行CREATE VIEW語句的CURRENT_USER,但是建立時也可以指定不同的使用者做為建立者(或者叫檢視所有人);
  •   
  • SQL SECURITY:檢視查詢資料時的安全驗證方式,有兩處選項:     
    •       
    • DEFINER:這個不是指建立者了,而是說在建立檢視時驗證是否有許可權訪問檢視所引用的資料;
    •       
    • INVOKER:指查詢檢視時,驗證查詢的使用者是否擁有許可權訪問檢視及檢視所引用的物件;
    •     
      
  •   
  • ALGORITHM:指定檢視的處理方式,有三種選項:     
    •       
    • MERGE:將檢視的定義和查詢檢視的語句合併處理,。
    •       
    • TEMPTABLE:檢視查詢的結果儲存到臨時表,而後在該臨時表基礎上執行查詢檢視的語句;
    •       
    • UNDEFINED:由MySQL選擇使用哪種演算法,一般會首選MERGE,因為MERGE更有效率,再說TEMPTABLE也不支援更新操作。
    •     
      

  下面分別通過例項來闡述上面這幾個選項。

  先列出MySQL資料庫中檢視的建立語法:

CREATE

    [OR REPLACE]

    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]

    [DEFINER = { user | CURRENT_USER }]

    [SQL SECURITY { DEFINER | INVOKER }]

    VIEW view_name [(column_list)]

    AS select_statement

  •     [WITH [CASCADED | LOCAL] CHECK OPTION]

 

1.1 指定檢視安全驗證的方式

  所謂安全驗證的方式,核心還是許可權 - 是否有足夠的許可權去訪問希望訪問到的資料。檢視相對其實更復制一些,這裡先介紹最簡單的情況:查詢檢視,對檢視所引用的基表的許可權驗證。

提示:

  • 三思個人感覺這個概念與ORACLE中的定義者許可權和呼叫者許可權過程非常類似。

  例如,引用同一個物件,按照不同的方式建立兩個檢視:

  •   

    mysql> create sql security definer view j1_v_d as select * from jssdb.j1;

      

    Query OK, 0 rows affected (0.00 sec)

      

     

      

    mysql> create sql security invoker view j1_v_i as select * from jssdb.j1;

    Query OK, 0 rows affected (0.00 sec)

  然後我們新建一個使用者tmpdb,僅授予增刪改查tmpdb庫的許可權(並沒有操作jssdb.j1的許可權):

  •   

    mysql> grant select,insert,update,delete on tmpdb.* to tmpdb identified by "tmpdb";

    Query OK, 0 rows affected (0.00 sec)

  然後,使用新建立的使用者登入執行操作:

  •   

    [[email protected] ~]# mysql -utmpdb -p'tmpdb' -h 192.168.11.212 -P 3306 -D tmpdb

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 10425056

    Server version: 5.0.56-log Source distribution

     

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

     

    mysql> show databases;

    +--------------------+

    | Database           |

    +--------------------+

    | information_schema | 

    | test               | 

    | tmpdb              | 

    +--------------------+

    3 rows in set (0.00 sec)

     

    mysql> show tables;

    +-----------------+

    | Tables_in_tmpdb |

    +-----------------+

    | j1_v_d          | 

    | j1_v_i          | 

    +-----------------+

    2 rows in set (0.00 sec)

  先來看看操作definer驗證方式下的檢視:

  •   

    mysql> select * from j1_v_d;

    +------+------+

    | id   | vl   |

    +------+------+

    |    1 | a0   | 

    |    2 | bb   | 

    +------+------+

    2 rows in set (0.00 sec)

     

    mysql> insert into j1_v_d values (3,'cc');

    Query OK, 1 row affected (0.01 sec)

  可以看到,查詢和更新都沒有問題,接下來再試試invoker許可權定義的檢視:

mysql> select * from j1_v_i;

  • ERROR 1356 (HY000): View 'tmpdb.j1_v_i' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them

  查詢時就報錯了,更新就更不用說了。上面的這種情況,是由於tmpdb使用者沒有操作jssdb下物件的許可權,因此讀取j1_v_i物件時就失敗了(雖然它有訪問j1_v_i物件的許可權)。

  這個簡單的測試足以表明:

  •   
  • definer是在定義物件是判斷是否有許可權,只要建立的使用者有許可權,那麼建立就可以成功,而且所有有許可權查詢該檢視的使用者也能夠成功執行查詢語句 - 不管是否擁有該檢視所引用物件的許可權;
  •   
  • invoker是指在查詢時驗證使用者是否有許可權執行操作,當然建立時也會判斷,如果建立的使用者沒有檢視所引用表物件的訪問許可權,那建立都會失敗。

轉載:http://blog.itpub.net/7607759/viewspace-706431/