文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
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=value
    系統變數 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

    此變數供內部使用。