基表新增列的最佳实践咨询及自定义包列丢失问题
哥们,我太懂你时隔多年碰老项目踩坑的崩溃感了!针对你在2017R2版本里遇到的Carrier表新增列发布后被删除的问题,咱们一步步拆解原因、搞定它:
为啥会出现这种情况?
首先得明确:Dynamics AX(现在叫Dynamics 365 Finance & Operations)是元数据驱动的系统——发布或同步数据库时,它会严格以AOT(应用对象树)里定义的表结构为基准,对比数据库实际结构。你当年直接用SQL脚本给Carrier表加的列,根本没在AOT的Carrier表元数据里留下记录,所以系统会把这些列判定为“多余的垃圾数据”,一发布就给你删了。
具体解决步骤
1. 先紧急恢复丢失的列
别慌,先把数据找回来:
- 立刻暂停相关的发布操作,避免二次删除;
- 用SQL脚本重新把Carrier表的新增列加回去(一定要先备份数据!):
ALTER TABLE [dbo].[Carrier] ADD [你的列名1] NVARCHAR(100) NULL, [你的列名2] INT NULL; -- 按需调整列的数据类型、长度、是否允许为空等属性,和之前的结构完全一致
2. 把新增列同步到AOT元数据(关键中的关键)
这一步是让系统“承认”这些列的合法性,以后发布就不会乱删了:
- 打开AX的开发环境(Visual Studio + Dynamics 365扩展);
- 在AOT里找到
Data Models > Tables > Carrier表; - 右键点击
Fields节点,根据实际列的类型选择New > String/Int/Date等,创建和数据库里完全匹配的列(列名、数据类型、长度、必填规则都要一模一样); - 保存修改后,右键Carrier表选择
Synchronize,或者通过发布项目同步数据库——这时候系统会发现AOT和数据库结构一致,不会再删列,反而会把元数据和数据库绑定起来。
3. 清理遗留的旧配置
- 彻底移除所有之前用来加列的SQL脚本,别让它们留在发布项目里搞事情;
- 检查有没有通过
Post Synchronization Scripts这类配置自动执行SQL的地方,把相关内容也删掉,避免冲突。
4. 验证效果
- 建个小测试发布项目,只包含Carrier表的修改;
- 执行发布后去数据库里看Carrier表,确认新增列没被删;
- 插条测试数据,验证列能正常读写。
给你提个醒
以后绝对别直接用SQL改AX的系统表结构!所有表结构变更都得在AOT里操作,再通过系统的同步/发布流程更新数据库——这是AX的核心规矩,遵守它能少踩无数坑。另外,建议你把老项目里所有当年用SQL直接加的列都挨个核对,补到对应表的AOT元数据里,免得以后再出类似问题。
内容的提问来源于stack exchange,提问作者Jerry Welliver
相关产品推荐
相关产品推荐

