文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


7.6.6.4 版本符記參考

以下討論作為這些版本符記元素的參考

版本符記函式

版本符記外掛程式庫包含數個函式。一組函式允許操作和檢查伺服器的版本符記清單。另一組函式允許鎖定和解除鎖定版本符記。呼叫任何版本符記函式需要 VERSION_TOKEN_ADMIN 權限(或已棄用的 SUPER 權限)。

以下函式允許建立、變更、移除和檢查伺服器的版本符記清單。對 name_listtoken_list 引數的解譯(包括空白處理)會按照第 7.6.6.3 節, 「使用版本符記」 中所述進行,其中提供有關指定符記語法的詳細資訊,以及其他範例。

  • version_tokens_delete(name_list)

    使用 name_list 引數從伺服器的版本符記清單中刪除符記,並傳回指示作業結果的二進位字串。name_list 是要刪除的版本符記名稱的以分號分隔的清單。

    mysql> SELECT version_tokens_delete('tok1;tok3');
    +------------------------------------+
    | version_tokens_delete('tok1;tok3') |
    +------------------------------------+
    | 2 version tokens deleted.          |
    +------------------------------------+

    引數 NULL 會被視為空字串,對符記清單沒有影響。

    version_tokens_delete() 刪除其引數中命名的符記(如果存在)。(刪除非現有符記並非錯誤。)若要完全清除符記清單而不知道清單中有哪些符記,請將 NULL 或不包含任何符記的字串傳遞給 version_tokens_set()

    mysql> SELECT version_tokens_set(NULL);
    +------------------------------+
    | version_tokens_set(NULL)     |
    +------------------------------+
    | Version tokens list cleared. |
    +------------------------------+
    mysql> SELECT version_tokens_set('');
    +------------------------------+
    | version_tokens_set('')       |
    +------------------------------+
    | Version tokens list cleared. |
    +------------------------------+
  • version_tokens_edit(token_list)

    使用 token_list 引數修改伺服器的版本符記清單,並傳回指示作業結果的二進位字串。token_list 是以分號分隔的 name=value 配對清單,指定要定義的每個符記的名稱及其值。如果符記存在,其值會以給定的值更新。如果符記不存在,則會使用給定的值建立。如果引數為 NULL 或不包含任何符記的字串,則符記清單保持不變。

    mysql> SELECT version_tokens_set('tok1=value1;tok2=value2');
    +-----------------------------------------------+
    | version_tokens_set('tok1=value1;tok2=value2') |
    +-----------------------------------------------+
    | 2 version tokens set.                         |
    +-----------------------------------------------+
    mysql> SELECT version_tokens_edit('tok2=new_value2;tok3=new_value3');
    +--------------------------------------------------------+
    | version_tokens_edit('tok2=new_value2;tok3=new_value3') |
    +--------------------------------------------------------+
    | 2 version tokens updated.                              |
    +--------------------------------------------------------+
  • version_tokens_set(token_list)

    token_list 引數中定義的符記取代伺服器的版本符記清單,並傳回指示作業結果的二進位字串。token_list 是以分號分隔的 name=value 配對清單,指定要定義的每個符記的名稱及其值。如果引數為 NULL 或不包含任何符記的字串,則會清除符記清單。

    mysql> SELECT version_tokens_set('tok1=value1;tok2=value2');
    +-----------------------------------------------+
    | version_tokens_set('tok1=value1;tok2=value2') |
    +-----------------------------------------------+
    | 2 version tokens set.                         |
    +-----------------------------------------------+
  • version_tokens_show()

    以二進位字串傳回伺服器的版本符記清單,其中包含以分號分隔的 name=value 配對清單。

    mysql> SELECT version_tokens_show();
    +--------------------------+
    | version_tokens_show()    |
    +--------------------------+
    | tok2=value2;tok1=value1; |
    +--------------------------+

以下函式允許鎖定和解除鎖定版本符記

  • version_tokens_lock_exclusive(token_name[, token_name] ..., timeout)

    取得一個或多個版本權杖的獨佔鎖定。權杖名稱以字串指定,若在指定的逾時值內無法取得鎖定,則會產生錯誤。

    mysql> SELECT version_tokens_lock_exclusive('lock1', 'lock2', 10);
    +-----------------------------------------------------+
    | version_tokens_lock_exclusive('lock1', 'lock2', 10) |
    +-----------------------------------------------------+
    |                                                   1 |
    +-----------------------------------------------------+
  • version_tokens_lock_shared(token_name[, token_name] ..., timeout)

    取得一個或多個版本權杖的共用鎖定。權杖名稱以字串指定,若在指定的逾時值內無法取得鎖定,則會產生錯誤。

    mysql> SELECT version_tokens_lock_shared('lock1', 'lock2', 10);
    +--------------------------------------------------+
    | version_tokens_lock_shared('lock1', 'lock2', 10) |
    +--------------------------------------------------+
    |                                                1 |
    +--------------------------------------------------+
  • version_tokens_unlock()

    釋放在目前工作階段中,使用 version_tokens_lock_exclusive()version_tokens_lock_shared() 所取得的所有鎖定。

    mysql> SELECT version_tokens_unlock();
    +-------------------------+
    | version_tokens_unlock() |
    +-------------------------+
    |                       1 |
    +-------------------------+

鎖定函數具有以下共同特性:

  • 成功時傳回非零值。否則,會發生錯誤。

  • 權杖名稱為字串。

  • 與操作伺服器權杖列表的函數之參數處理方式不同,權杖名稱參數周圍的空白不會被忽略,且允許使用 =; 字元。

  • 可以鎖定不存在的權杖名稱。這並不會建立權杖。

  • 逾時值為非負整數,表示在因逾時而產生錯誤之前,等待取得鎖定的時間(以秒為單位)。如果逾時值為 0,則不會等待,且如果無法立即取得鎖定,函數會產生錯誤。

  • 版本權杖鎖定函數基於第 7.6.9.1 節「鎖定服務」中描述的鎖定服務。

版本權杖系統變數

版本權杖支援下列系統變數。除非安裝了版本權杖外掛程式,否則這些變數無法使用(請參閱第 7.6.6.2 節「安裝或解除安裝版本權杖」)。

系統變數

  • version_tokens_session

    命令列格式 --version-tokens-session=值
    系統變數 version_tokens_session
    範圍 全域、工作階段
    動態
    SET_VAR 提示適用
    類型 字串
    預設值 NULL

    此變數的工作階段值指定用戶端版本權杖列表,並指示用戶端工作階段要求伺服器版本權杖列表具有的權杖。

    如果 version_tokens_session 變數為 NULL (預設值) 或具有空值,則任何伺服器版本權杖列表都符合。(實際上,空值會停用比對要求。)

    如果 version_tokens_session 變數具有非空值,則其值與伺服器版本權杖列表之間的任何不符,都會導致工作階段傳送至伺服器的任何陳述式發生錯誤。在下列情況下會發生不符:

    伺服器版本權杖列表包含未在 version_tokens_session 值中命名的權杖,並非不符。

    假設管理應用程式已設定伺服器權杖列表如下:

    mysql> SELECT version_tokens_set('tok1=a;tok2=b;tok3=c');
    +--------------------------------------------+
    | version_tokens_set('tok1=a;tok2=b;tok3=c') |
    +--------------------------------------------+
    | 3 version tokens set.                      |
    +--------------------------------------------+

    用戶端會透過設定其 version_tokens_session 值,來註冊其要求伺服器比對的權杖。然後,對於用戶端傳送的每個後續陳述式,伺服器會根據用戶端 version_tokens_session 值檢查其權杖列表,如果發生不符,則會產生錯誤。

    mysql> SET @@SESSION.version_tokens_session = 'tok1=a;tok2=b';
    mysql> SELECT 1;
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
    
    mysql> SET @@SESSION.version_tokens_session = 'tok1=b';
    mysql> SELECT 1;
    ERROR 3136 (42000): Version token mismatch for tok1. Correct value a

    第一個 SELECT 成功,因為用戶端權杖 tok1tok2 存在於伺服器權杖列表中,且每個權杖在伺服器列表中都具有相同的值。第二個 SELECT 失敗,因為雖然 tok1 存在於伺服器權杖列表中,但其值與用戶端指定的值不同。

    此時,用戶端傳送的任何陳述式都會失敗,除非伺服器權杖列表變更為再次符合。假設管理應用程式將伺服器權杖列表變更如下:

    mysql> SELECT version_tokens_edit('tok1=b');
    +-------------------------------+
    | version_tokens_edit('tok1=b') |
    +-------------------------------+
    | 1 version tokens updated.     |
    +-------------------------------+
    mysql> SELECT version_tokens_show();
    +-----------------------+
    | version_tokens_show() |
    +-----------------------+
    | tok3=c;tok1=b;tok2=b; |
    +-----------------------+

    現在,用戶端 version_tokens_session 值符合伺服器權杖列表,且用戶端可以再次成功執行陳述式。

    mysql> SELECT 1;
    +---+
    | 1 |
    +---+
    | 1 |
    +---+
  • version_tokens_session_number

    命令列格式 --version-tokens-session-number=#
    系統變數 version_tokens_session_number
    範圍 全域、工作階段
    動態
    SET_VAR 提示適用
    類型 整數
    預設值 0

    此變數供內部使用。