使用MDSModelDeploy deployupdate时遇「名称已存在」错误求助
问题描述
- 已通过
MDSModelDeploy工具从Dev环境(MDS1)克隆MASTER_DATA_EDW模型到Test环境(MDS2),执行命令:MDSModelDeploy createpackage -model MASTER_DATA_EDW -service MDS1 -package MasterDataEDW_NoData_D_231204.pkg MDSModelDeploy deployclone -package MasterDataEDW_NoData_D_231204.pkg -service MDS2 - 在Dev环境修改某实体的属性数据类型后,使用
deployupdate同步到Test环境时失败,报错「名称已存在,请输入不同名称」 - 通过链接服务器排查发现,Dev和Test环境中同一属性的MUID不匹配;手动修改Test环境属性的MUID无效,撤销Dev的修改后同步仍失败
- 当前仅能通过删除Test环境对应属性再完成同步,但无法定位未知更新属性,且不能删除/重新克隆模型
解决方案
1. 批量对齐属性MUID及结构差异
MDS的deployupdate依赖MUID识别实体/属性,手动修改单个MUID无效是因为内部关联表(如mdm.tblAttributeValue、mdm.tblAttributeGroupAttribute)的关联关系未同步。可在Test环境执行以下脚本,批量对齐Dev环境的属性配置:
-- 需确保已配置指向Dev环境的链接服务器MDS_DEV UPDATE t2att SET t2att.MUID = datt.MUID, t2att.DataType_ID = datt.DataType_ID, t2att.DataTypeInformation = datt.DataTypeInformation, t2att.AttributeType_ID = datt.AttributeType_ID, t2att.DisplayName = datt.DisplayName, t2att.Description = datt.Description FROM mdm.tblAttribute t2att JOIN mdm.tblEntity t2ent ON t2ent.ID = t2att.Entity_ID JOIN mdm.tblModel model ON model.ID = t2ent.Model_ID AND model.Name = 'MASTER_DATA_EDW' JOIN MDS_DEV.MDS.mdm.tblEntity dent ON dent.MUID = t2ent.MUID JOIN MDS_DEV.MDS.mdm.tblAttribute datt ON dent.ID = datt.Entity_ID AND t2att.Name = datt.Name WHERE t2att.MUID != datt.MUID AND (t2att.TableColumn LIKE 'uda%' OR t2att.TableColumn IN ('Name', 'Code'))
执行前务必备份Test环境的MDS数据库,避免数据损坏。
2. 强制同步模型结构
如果MUID对齐后仍无法同步,可使用deployupdate的强制覆盖参数跳过名称冲突校验:
MDSModelDeploy deployupdate -package MasterDataEDW_NoData_D_231204.pkg -service MDS2 -force
-force参数会强制用Dev的模型结构覆盖Test环境中不匹配的部分,不会覆盖业务数据。
3. 优化差异定位脚本
修改排查脚本,直接生成可执行的修复语句,方便批量处理未知差异:
SELECT t2ent.Name AS TEST_ENTITY, t2att.Name AS TEST_ATT_NAME, t2att.MUID AS TEST_ATT_MUID, datt.MUID AS DEV_ATT_MUID, -- 生成一键修复SQL 'UPDATE mdm.tblAttribute SET MUID = ''' + CAST(datt.MUID AS VARCHAR(100)) + ''', DataType_ID = ' + CAST(datt.DataType_ID AS VARCHAR(10)) + ', DataTypeInformation = ''' + datt.DataTypeInformation + ''' WHERE ID = ' + CAST(t2att.ID AS VARCHAR(10)) + ';' AS FIX_SQL FROM mdm.tblEntity t2ent INNER JOIN mdm.tblModel model ON model.ID = t2ent.Model_ID AND model.Name = 'MASTER_DATA_EDW' LEFT JOIN mdm.tblAttribute t2att ON t2ent.ID = t2att.Entity_ID FULL OUTER JOIN MDS_DEV.MDS.mdm.tblEntity dent ON dent.MUID = t2ent.MUID FULL OUTER JOIN MDS_DEV.MDS.mdm.tblAttribute datt ON dent.ID = datt.Entity_ID AND t2att.Name = datt.Name WHERE (t2att.TableColumn LIKE 'uda%' OR t2att.TableColumn IN ('Name', 'Code')) AND ( t2att.DataTypeInformation != datt.DataTypeInformation OR t2att.DataType_ID != datt.DataType_ID OR t2att.AttributeType_ID != datt.AttributeType_ID OR t2att.DisplayName != datt.DisplayName OR t2att.Name != datt.Name OR t2att.Description != datt.Description OR t2att.MUID != datt.MUID OR datt.MUID IS NULL )
执行后复制FIX_SQL列的语句在Test环境运行即可批量修复差异。
4. 长期预防方案
- 每次修改Dev模型后,重新生成包含最新结构的包:
MDSModelDeploy createpackage -model MASTER_DATA_EDW -service MDS1 -package MasterDataEDW_Updated_D_YYYYMMDD.pkg - 同步时优先使用
deployupdate -force,避免手动修改MUID引发的关联问题 - 定期用排查脚本对比Dev和Test的模型结构,提前发现MUID或属性差异
内容的提问来源于stack exchange,提问作者efysis
相关产品推荐
相关产品推荐

