以下討論作為這些版本符記元素的參考
版本符記外掛程式庫包含數個函式。一組函式允許操作和檢查伺服器的版本符記清單。另一組函式允許鎖定和解除鎖定版本符記。呼叫任何版本符記函式需要 VERSION_TOKEN_ADMIN
權限(或已棄用的 SUPER
權限)。
以下函式允許建立、變更、移除和檢查伺服器的版本符記清單。對 name_list
和 token_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. | +-----------------------------------------------+
以二進位字串傳回伺服器的版本符記清單,其中包含以分號分隔的
配對清單。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_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
範圍 全域、工作階段 動態 是 SET_VAR
提示適用否 類型 字串 預設值 NULL
此變數的工作階段值指定用戶端版本權杖列表,並指示用戶端工作階段要求伺服器版本權杖列表具有的權杖。
如果
version_tokens_session
變數為NULL
(預設值) 或具有空值,則任何伺服器版本權杖列表都符合。(實際上,空值會停用比對要求。)如果
version_tokens_session
變數具有非空值,則其值與伺服器版本權杖列表之間的任何不符,都會導致工作階段傳送至伺服器的任何陳述式發生錯誤。在下列情況下會發生不符:version_tokens_session
值中的權杖名稱不存在於伺服器權杖列表中。在此情況下,會發生ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND
錯誤。version_tokens_session
值中的權杖值與伺服器權杖列表中對應權杖的值不同。在此情況下,會發生ER_VTOKEN_PLUGIN_TOKEN_MISMATCH
錯誤。
伺服器版本權杖列表包含未在
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
成功,因為用戶端權杖tok1
和tok2
存在於伺服器權杖列表中,且每個權杖在伺服器列表中都具有相同的值。第二個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
範圍 全域、工作階段 動態 否 SET_VAR
提示適用否 類型 整數 預設值 0
此變數供內部使用。