语法清单 #
| 语法 | 描述 | 类型 |
|---|---|---|
| CONVERT TABLE ruleName BY DATA_INTEGRITY RULE | 为表添加防篡改规则和添加摘要列 | RAL |
| CONVERT TABLE ruleName ADD DIGEST COLUMNS | 指定防篡改规则添加摘要列配置和添加摘要列 | RAL |
| CONVERT TABLE ruleName DROP DIGEST COLUMNS | 指定防篡改规则删除摘要列配置和摘要列 | RAL |
1. 为表添加防篡改列和规则 #
convertDataIntegrityTable ::=
'CONVERT' 'TABLE' ruleName 'BY' 'DATA_INTEGRITY' 'RULE' '(' digestGroupsDefinition ')' (',' skipDDL)? (',' startJob)?
digestGroupsDefinition ::=
digestGroupDefinition (',' digestGroupDefinition)*
digestGroupDefinition ::=
'(' 'DIGEST_COLUMN' '=' digestColumnName (',' digestColumnDataType)? ',' columnNames ',' algorithmDefinition ')'
digestColumnDataType ::=
'DATA_TYPE' '=' dataType
columnNames ::=
'COLUMNS' '(' columnName (',' columnName)* ')'
ruleName ::=
identifier
digestColumnName ::=
identifier
columnName ::=
identifier
dataType ::=
string
skipDDL ::=
'SKIP_DDL' '=' booleanLiterals
startJob ::=
'START_JOB' '=' booleanLiterals
booleanLiterals ::=
true | false
algorithmDefinition ::=
'TYPE' '(' 'NAME' '=' algorithmTypeName (',' propertiesDefinition)? ')'
algorithmTypeName ::=
string
propertiesDefinition ::=
'PROPERTIES' '(' key '=' value (',' key '=' value)* ')'
key ::=
string
value ::=
literal
参数说明
参数解释 #
| 名称 | 数据类型 | 说明 |
|---|---|---|
| ruleName | IDENTIFIER | 规则名称 |
| digestColumnName | IDENTIFIER | 摘要列名称 |
| dataType | STRING | 摘要列类型 |
| columnName | IDENTIFIER | 参与计算的列名称 |
| algorithmTypeName | STRING | 摘要算法名称 |
| skipDDL | BOOLEAN | 是否跳过 DDL 执行 |
| startJob | BOOLEAN | 是否启动摘要值生成任务 |
当 SKIP_DDL=false 或未指定 SKIP_DDL 时,系统会执行添加摘要列的 DDL,必须为新增摘要列指定 DATA_TYPE;当 SKIP_DDL=true 时,摘要列需要已经存在于物理表中,DATA_TYPE 可省略。生产环境建议先通过低锁 DDL 工具或人工 DDL 完成物理表变更,再使用 SKIP_DDL=true 执行转换。
示例
CONVERT TABLE `t_user` BY DATA_INTEGRITY RULE (
(DIGEST_COLUMN=`name_digest`, DATA_TYPE='varchar(200)', COLUMNS(`name`, `address`), TYPE(NAME='MD5', PROPERTIES('salt'='123456'))),
(DIGEST_COLUMN=`password_digest`, DATA_TYPE='varchar(200)', COLUMNS(`name`, `password`), TYPE(NAME='MD5', PROPERTIES('salt'='123456')))
), SKIP_DDL=true, START_JOB=false;
2. 指定规则添加摘要列和规则 #
convertDataIntegrityTableAddDigestColumns ::=
'CONVERT' 'TABLE' ruleName 'ADD' 'DIGEST' 'COLUMNS' digestGroupsDefinition (',' skipDDL)? (',' startJob)?
digestGroupsDefinition ::=
digestGroupDefinition (',' digestGroupDefinition)*
digestGroupDefinition ::=
'(' 'DIGEST_COLUMN' '=' digestColumnName (',' digestColumnDataType)? ',' columnNames ',' algorithmDefinition ')'
digestColumnDataType ::=
'DATA_TYPE' '=' dataType
columnNames ::=
'COLUMNS' '(' columnName (',' columnName)* ')'
ruleName ::=
identifier
digestColumnName ::=
identifier
columnName ::=
identifier
dataType ::=
string
skipDDL ::=
'SKIP_DDL' '=' booleanLiterals
startJob ::=
'START_JOB' '=' booleanLiterals
booleanLiterals ::=
true | false
algorithmDefinition ::=
'TYPE' '(' 'NAME' '=' algorithmTypeName (',' propertiesDefinition)? ')'
algorithmTypeName ::=
string
propertiesDefinition ::=
'PROPERTIES' '(' key '=' value (',' key '=' value)* ')'
key ::=
string
value ::=
literal
参数说明
参数解释 #
| 名称 | 数据类型 | 说明 |
|---|---|---|
| ruleName | IDENTIFIER | 规则名称 |
| digestColumnName | IDENTIFIER | 摘要列名称 |
| dataType | STRING | 摘要列类型 |
| columnName | IDENTIFIER | 参与计算的列名称 |
| algorithmTypeName | STRING | 摘要算法名称 |
| skipDDL | BOOLEAN | 是否跳过 DDL 执行 |
| startJob | BOOLEAN | 是否启动摘要值生成任务 |
当 SKIP_DDL=false 或未指定 SKIP_DDL 时,系统会执行添加摘要列的 DDL,必须为新增摘要列指定 DATA_TYPE;当 SKIP_DDL=true 时,摘要列需要已经存在于物理表中,DATA_TYPE 可省略。生产环境建议先通过低锁 DDL 工具或人工 DDL 完成物理表变更,再使用 SKIP_DDL=true 执行转换。
示例
CONVERT TABLE `t_user` ADD DIGEST COLUMNS (
(DIGEST_COLUMN=`address_digest`, DATA_TYPE='varchar(200)', COLUMNS(`name`,`address`), TYPE(NAME='MD5', PROPERTIES('salt'='123456')))
), SKIP_DDL=true, START_JOB=false;
3. 指定规则删除摘要列配置和摘要列 #
convertDataIntegrityTableDropDigestColumns ::=
'CONVERT' 'TABLE' ruleName 'DROP' 'DIGEST COLUMNS' '(' digestColumnName (',' digestColumnName)* ')' (',' skipDDL)?
ruleName ::=
identifier
digestColumnName ::=
identifier
skipDDL ::=
'SKIP_DDL' '=' booleanLiterals
booleanLiterals ::=
true | false
参数说明
参数解释 #
| 名称 | 数据类型 | 说明 |
|---|---|---|
| ruleName | IDENTIFIER | 规则名称 |
| digestColumnName | IDENTIFIER | 摘要列名称 |
| skipDDL | BOOLEAN | 是否跳过 DDL 执行, 删除摘要列 |
示例
CONVERT TABLE `t_user` DROP DIGEST COLUMNS (`name_digest`, `id_digest`), SKIP_DDL=true;