以下討論作為這些版本令牌元素的參考
版本令牌外掛程式程式庫包含數個函式。其中一組函式允許操作和檢查伺服器的版本令牌清單。另一組函式允許鎖定和解除鎖定版本令牌。呼叫任何版本令牌函式需要 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=value
系統變數 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
此變數供內部使用。