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=valueNULL或一个不包含令牌的字符串,则令牌列表保持不变。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=valueNULL或一个不包含令牌的字符串,则清除令牌列表。mysql> SELECT version_tokens_set('tok1=value1;tok2=value2'); +-----------------------------------------------+ | version_tokens_set('tok1=value1;tok2=value2') | +-----------------------------------------------+ | 2 version tokens set. | +-----------------------------------------------+ -
返回服务器的版本令牌列表作为一个二进制字符串,包含一个分号分隔的列表,包括
对。name=valuemysql> 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=valueSystem Variable version_tokens_sessionScope 全局、会话 Dynamic 是 SET_VARHint 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_numberScope 全局、会话 Dynamic 否 SET_VARHint Applies否 Type 整数 Default Value 0这个变量用于内部使用。