新PaaS平台上线数据初始化经验

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoyw/article/details/50531435

最近,由于资源不足等原因,亲自参与新系统上线数据初始化工作,现在算来,上次完成此类似操作,已经过去十多年了。

本次特点是基于PaaS平台方案,按省公司及地市公司、中心为组织单元,共分15个租户,其中,用户2万多,部门1千多。对于这样的情况,仅凭人工来完成是不太现实的,需要程序化批量进行处理。

现把初始化2万用户信息的工作经验分享出来,与同行交流。

首先,初始化工作是按租户分别处理的,工作内容如下:

1、获取原始数据
此部分工作已经由原系统维护人员一个多月前提供。

2、初始化数据方案分析
1)分析原始数据
通过原始数据,能获取用户账号、用户名称、公司名称、部门名称、部门内排序。
2)、目标数据
(1)、用户账号信息
(2)、租户用户账号信息
(3)、用户通用角色(可以访问系统的普通部门员工)

3、原始数据处理

4、导入原始数据
1)、Cordys平台注册
2)、导入关系型数据

5、处理数据,形成目标数据
1)、人工创建部门
2)、处理形成目标数据

1. 分析并解析原始数据

这里写图片描述
如上图电子表格(此处用WPS)所示,保留原始数据中cn、description、busextension、order等4项数据,其中cn、description、order做为用户账号、用户名称、人员部门内部排序数据,可以直接使用,并从busextension数据中解析出部门编码、公司数据,以及按目标要求,把部门编码转换为按租户内部门编码(dept)。

通过电子表格函数功能,解析数据获取部门编码、目标系统部门编码、公司编码。

//解析部门编码
=MID(C2,SEARCH("@",C2)+1,SEARCH(",",C2)-SEARCH("@",C2)-1)
//转换为目标系统部门编码,其中“HRB_”为目标租户编码+“_”
="HRB_"&UPPER(E4)
//解析公司编码
=LEFT(C7,SEARCH("@",C7)-1)

2. 原始数据导入

2.1. 用户注册

系统/租户账号注册,最基本数据是用户账号、用户姓名和DN(从原Cordys C3平台取来),如下电子表格所示数据,并把文件保存文件名后缀为“.xls”格式文件。
这里写图片描述

使用新开发批量注册用户功能,进行用户基本信息注册,功能页面链接如下:
(此处略去IP地址)/home/system/chang/OrgAndUserImport/OrgAndUserImportMain.caf

这里写图片描述
如上图所示:

第一步:上传Excel
导入电子表格文件,上传到服务器

第二步:导入设置
录入租户DN,例如:’o=HRB,cn=cordys,cn=defaultInst,o=hlcuc.com’ ,以及部门ID、部门名称、部门CODE。
例如:部门ID=’ebf7e6cf-e1b1-11e5-f64f-5efa97ea1f73’,部门名称=’综合部’,部门CODE= ‘HL_ZHB’

“部门ID=’ebf7e6cf-e1b1-11e5-f64f-5efa97ea1f73’,部门名称=’综合部’,部门CODE= ‘HL_ZHB’”是必须使用系统存在的数据,可以稍后再处理。

1、初步分析
2、直接导入

第三步:初始化操作
输入租户DN,初始化此租户下所有用户的密码。

2.2. 导入原始数据到关系型数据库中

此处导入电子表格数据到Oracle数据库中(业务系统的数据库也是Oracle)。

1、创建临时表,存储导入数据,表结构详见如下内容:

//创建临时表,处理原始数据
create table TMP_USER
(
  CN           VARCHAR2(50) not null, --用户账号
  USERNAME     VARCHAR2(80),          --用户名称
  BUSEXTENSION VARCHAR2(200),         --DN信息(含公司、部门等)
  ORDERBY      VARCHAR2(10),          --人员部门内排序
  DEPT         VARCHAR2(50),          --部门编码
  DEPTID       VARCHAR2(50),          --部门ID
  ROLEID       VARCHAR2(50),
  DEPTNAME     VARCHAR2(100)          --部门名称
);
alter table TMP_USER  add constraint TMP_USER_PRI_KEY primary key (CN);

2、使用PL/SQL Developer工具导入电子表格数据

在PL/SQL Developer软件中,通过菜单选中“Tools->ODBC Importer”,如下图所示:
这里写图片描述

在“Data from ODBC”选项中,连接电子表格文件,其中,在User/System DSN选项中,选择“Excel Files”,User Name与Password为空,如下图所示:
这里写图片描述

弹出“选择工作簿”窗口,选择需要导入数据的.xls文件,如下图所示:
这里写图片描述

在“Data from ODBC”选项中,“import Table”中选择具体的Sheet,再转到“Data to Oracle”选项下,选择数据库Owner为“BOP_PDT”,对应的表是TMP_USER,并在Fields选项中,确定字段对应关系,如下图所示:
这里写图片描述

配置完成后,在“Data to Oracle”选项下,点击“Import”按钮,来完成导入操作,如下图所示:
这里写图片描述

导入4760记录。

2.3. 处理临时表中原始数据

--补充组织中部门ID(ORG_ID)
update tmp_user tt set tt.deptid =( select t1.org_id from sm_organization t1 where tt.dept = t1.org_code) where tt.deptid is null;
--补充组织中部门名称(ORG_NAME)
update tmp_user tt set tt.deptname =( select t1.org_name from sm_organization t1 where tt.dept = t1.org_code) where  tt.deptname is null ;
--补充租户编码,此编码来源于Cordys系统平台。
update tmp_user set tenant_code='HRB' where tenant_code is null;

3. 补充注册用户关键信息

在此对系统正式数据进行修改、插入操作,批量匹配人员所对应的部门、人员排序、租户等信息,以及默认角色等数据,以此减轻人工录入工作量,避免人工差错。

3.1. 备份系统相关数据

通过直接创建备份表的方式,备份源数据。

create table bak01_sm_account as select * from sm_account;
create table bak01_sm_tenant_account as select * from sm_tenant_account;
create table bak01_sm_orgaccount_role as select * from sm_orgaccount_role;

3.2. 处理相关数据,修改、插入生产表中

在此通过表关联、字符串组合处理相关数据,并通过修改、插入方式更新到生产表中。但是,这里注意表的外键关联,以及非空列的更新。

1、更改账户表中的组织部门ID和人员排序

update sm_account tt set (tt.own_org,tt.sort_no) = (select t.deptid,to_number(t.orderby) from tmp_user t where t.cn = tt.acc_name and t.deptid is not null and  t.tenant_code='HRB') where  exists (select 1  from tmp_user t where t.cn = tt.acc_name and t.deptid is not null and  t.tenant_code='HRB') ;

第一次操作时,未使用“where exist (select 1 from ……”,提示更新数据量超过源数据量,为什么呢?

2、更改租户账号表中的组织ID、租户账号、租户编码、租户名称、租户DN、组织编码、组织名称、用户DN

第一次修改租户帐号表:组织ID、租户账号、租户编码、租户名称、租户DN。

--租户编码(tenant_code),来自Cordys平台所创建的
update sm_tenant_account tt set (tt.org_id,tt.tenant_account,tt.tenant_code,tt.tenant_name,tt.tenant_dn) = 
(select t.own_org,t.acc_name,'HRB','哈尔滨市分公司','o=HRB,cn=cordys,cn=defaultInst,o=hlcuc.com' 
from sm_account t where t.acc_id = tt.acc_id and t.own_org is not null and t.acc_name in (select cn from tmp_user where deptid is not null and tenant_code='HRB'))

执行失败,报Ora-1407错误(“cannot update …… to NULL”),参照网络上的文章分析(“ORACLE多表关联UPDATE 语句 ”),是更新数据集不一致造成的,修改为如下语句,执行成功。

update sm_tenant_account tt set (tt.org_id,tt.tenant_account,tt.tenant_code,tt.tenant_name,tt.tenant_dn) = 
(select t.own_org,t.acc_name,'HRB','哈尔滨市分公司','o=HRB,cn=cordys,cn=defaultInst,o=hlcuc.com' 
from sm_account t where t.acc_id = tt.acc_id and t.own_org is not null and t.acc_name in (select cn from tmp_user where deptid is not null and tenant_code='HRB')) where exists (select 1 from sm_account t where t.acc_id = tt.acc_id and t.own_org is not null and t.acc_name in (select cn from tmp_user where deptid is not null and tenant_code='HRB')) ;

第二次修改租户帐号表:组织编码、组织名称、用户DN。

update sm_tenant_account tt set (tt.org_code,tt.org_name,tt.user_dn) = 
(select t.org_code,t.org_name,'cn='||tt.tenant_account||',cn=organizational users,o=HRB,cn=cordys,cn=defaultInst,o=hlcuc.com'
from sm_organization t where t.org_id=tt.org_id and tt.tenant_account in (select cn from tmp_user where deptid is not null and tenant_code='HRB'))
where exists (select 1 from sm_organization t where t.org_id=tt.org_id and tt.tenant_account in (select cn from tmp_user where deptid is not null and tenant_code='HRB'));

这里写图片描述

3、为所有用户赋予部门成员角色

把角色为部门成员的角色赋给所有人:“角色ID=afcc5e70-b0b9-11e5-f4c2-d2a79fe11d08”。

insert into sm_orgaccount_role (role_id,org_acc_id,status_sign)
select 'afcc5e70-b0b9-11e5-f4c2-d2a79fe11d08',t.org_acc_id,1 from sm_tenant_account t 
where not exists (select tt.org_acc_id from sm_orgaccount_role tt where t.org_acc_id=tt.org_acc_id ) and t.tenant_code='HRB';

commit;

这里写图片描述

到此,使用刚才导入的账号,登录系统,可以见到普通用户的界面。

展开阅读全文

没有更多推荐了,返回首页