起因
昨天同事和我说,要在一个表单里加一组可选项。于是我去了公共选择框维护。这时候才发了这么个问题,前几天我在本机的测试环境里做的流程,导入到我们的生产环境里,表单里所用到的共公选择框的选项都在,在表单里是可用的,但是在公共选择框维护里却没有涉及到的公共选择框。回到流程的表单管理里,相应的字段只显示公共选择框,不显示选择框的类型了。
先把为什么所用到的公共选择框,在公共选择框维护里已经没有了,然而表单里还可用的问题放一边,不去研究它,看来有必要先把遗漏的公共选择框维护补齐。
经过
目标
想把公共选择框维护里的信息补齐,首先想到的方法是到公共选择框里把遗漏的类型都补齐了。考虑到在操作的过程中,很大的可能会发生由于录入顺序不一样,导致ID不一致引发关联出错的问题。
方案
那么,是不是在两个环境中,公共选择框维护里,数据不冲突的情况下,直接到数据表里导数据过来应该会安全一些。
执行
知识点一、需要处理哪些表
然而,在网上流传的E8表结构里找了一下,没有找到提及公共选择框的表。于是,用SQL Server Profiler做跟踪,发现了这么几张表。
mode_selectitempage
mode_selectitempagedetail
selectItemLog
从表名上来看,mode_selectitempage、mode_selectitempagedetail应该是记录的公共选择框的信息,是必须的,selectItemLog应该是记录的调整信息。先不去分析表结构都是干嘛的,先把本机测试环境和生产环境的数据做一下同步。
知识点二、数据怎么去同步
直接在SQL Server Management Studio里导入数据,但要注意,要先把测试环境的表,导入到生产环境里,并且不能用原表名,先不说遇到相同的数据,导入程序会怎么处理,首先导入程序会在验证步骤报错如下
- 正在验证 (错误) 消息 错误 0xc0202049: 数据流任务 1: 无法在只读列“id”中插入数据。 (SQL Server 导入和导出向导) 错误 0xc0202045: 数据流任务 1: 验证列元数据失败。 (SQL Server 导入和导出向导) 错误 0xc004706b: 数据流任务 1: “组件“目标 - mode_selectitempage”(46)”验证失败,返回的验证状态为“VS_ISBROKEN”。 (SQL Server 导入和导出向导) 错误 0xc004700c: 数据流任务 1: 一个或多个组件未能通过验证。 (SQL Server 导入和导出向导) 错误 0xc0024107: 数据流任务 1: 任务验证期间出错。 (SQL Server 导入和导出向导) |
大意上就是mode_selectitempage表的id列是只读的,不允许写入值。解决办法是把测试环境的表导入到生产环境数据库里的时候,重命个名。然后再写SQL语句去导入。但同样要处理这个ID字段不允许插入值的问题。
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'mode_selectitempage'中的标识列指定显式值。
拿其中一个表举例,写一下语句
-- 设置mode_selectitempage的IDENTITY_INSERT的值是ON set IDENTITY_INSERT mode_selectitempage ON -- 把导过来的表里,ID不在生产环境的表里的的,导到生产环境表里。 -- 这里必须写列名。不写列名,设置了IDENTITY_INSERT为ON也不好使。 insert into mode_selectitempage -- 把mode_selectitempage表的IDENTITY_INSERT的值改回OFF。 set IDENTITY_INSERT mode_selectitempage OFF |
把数据同步之后,生产环境里的公共选择框补齐了。
结果
处理本次问题收获以下知识点:
1、在E8里,从一个系统导出流程,导入到另一个系统里的时候,相关的资源不会一并导入,需要手工去维护。
2、认识了几张和公共选择框有关的表。
3、在向有自增字段的数据表里导入数据前,要先处理该表的IDENTITY_INSERT属性后再导入,并不是拿它们束手无策的。