7.6.6.4 版本令牌参考
以下讨论作为版本令牌元素的参考:
版本令牌函数
版本令牌插件库包括多个函数。有一组函数允许服务器的版本令牌列表被操作和检查。另一组函数允许版本令牌被锁定和解锁。需要 invoke 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节,“安装或卸载版本令牌”),否则不可用。
系统变量:
-
Command-Line Format --version-tokens-session=value
System Variable version_tokens_session
Scope 全局、会话 Dynamic 是 SET_VAR
Hint Applies否 Type 字符串 Default Value 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
值进行比较,并在出现冲突时产生错误: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 | +---+
-
-
Command-Line Format --version-tokens-session-number=#
System Variable version_tokens_session_number
Scope 全局、会话 Dynamic 否 SET_VAR
Hint Applies否 Type 整数 Default Value 0
这个变量用于内部使用。