Logo
防篡改表转换

语法清单 #

语法描述类型
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

参数说明

参数解释 #

名称数据类型说明
ruleNameIDENTIFIER规则名称
digestColumnNameIDENTIFIER摘要列名称
dataTypeSTRING摘要列类型
columnNameIDENTIFIER参与计算的列名称
algorithmTypeNameSTRING摘要算法名称
skipDDLBOOLEAN是否跳过 DDL 执行
startJobBOOLEAN是否启动摘要值生成任务

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

参数说明

参数解释 #

名称数据类型说明
ruleNameIDENTIFIER规则名称
digestColumnNameIDENTIFIER摘要列名称
dataTypeSTRING摘要列类型
columnNameIDENTIFIER参与计算的列名称
algorithmTypeNameSTRING摘要算法名称
skipDDLBOOLEAN是否跳过 DDL 执行
startJobBOOLEAN是否启动摘要值生成任务

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

参数说明

参数解释 #

名称数据类型说明
ruleNameIDENTIFIER规则名称
digestColumnNameIDENTIFIER摘要列名称
skipDDLBOOLEAN是否跳过 DDL 执行, 删除摘要列

示例

CONVERT TABLE `t_user` DROP DIGEST COLUMNS (`name_digest`, `id_digest`), SKIP_DDL=true;