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

小亮520cl發表於2016-11-14

一、檢視的建立

  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)

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

      

    [root@test ~]# 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是指在查詢時驗證使用者是否有許可權執行操作,當然建立時也會判斷,如果建立的使用者沒有檢視所引用表物件的訪問許可權,那建立都會失敗。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29096438/viewspace-2128397/,如需轉載,請註明出處,否則將追究法律責任。

相關文章