记一次数据库导入的过程

Title

欢迎交换友链: Laker’s Blog–进击的程序媛
Github:https://github.com/younglaker
V信: lakerHQ (请注明‘来自博客’)

背景

系统运行两年,员工信息变动大,但是系统未与HR系统对接,导致本系统人员信息滞后。现需要导入新的员工信息,并为其创建账号。

创建临时表导入最新员工信息

从HR得到一个最新全司员工信息的 Excel 表格,包含工号、姓名、部门。

导入临时表

新建临时表 tmp,新建字段(取 employee 表的必填字段即可),按正式的员工数据表的字段设置类型。导入 Excel,选择 Excel 列对应相应字段。

tmp 字段:

  • serial_id:工号
  • user_name:姓名
  • dep_name:部门名
  • dep_id:部门id
  • employee_id:对应 employee 表的自增序列 sequence

去重

把 tmp 里已存在于 employee 表里的员工删除

1
2
3
4
delete from tmp
where serial_id in (
select serial_id from employee
)

剩下的就是新增的员工

更新部门id

Excel 表里只有部门名称,要把 tmp 表里的部门名找到对应的部门id

1
2
3
4
5
update tmp a
set a.dep_id = (
select b.section_id from sectioninfo b
where a.dep_name = b.section_name
)

处理部门数据

会出现 HR 给的 Excel 表里部门名称与系统对应的名称不一致,导致无法匹配部门id,只能手动修改。

在 SQL developer 里操作不方便,可以把 tmp 数据导出 Excel 表进行操作,手动补充部门id。

清空 tmp 数据,导入新 Excel。

把 tmp 插入 employee

把 tmp 插入 employee,对应好字段,注意必填字段必须导入或设置自非空定义值(可以参考 employee 里已有的数据格式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
insert into employee(
employee_id,
serial_id,
user_name,
domain_name,
created_by
)
select saaf_employee_s.nextval,
# employee 表的 sequence,取系一个值。sequence 在数据库 > 序列 里查找
serial_id,
user_name,
user_name,
-1
from tmp
where serial_id not in (
select serial_id from employee
)

建立部门和员工的关系

本系统中,部门和员工关系在 sectioninfo_employee 表里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
insert into sectioninfo_employee(
se_id,
employee_id,
isval,
section_id,
creation_date)
select sectioninfo_employee_s.nextval,
employee_id,
1,
dep_id,
to_date('14-4月-17','dd-mon-rr')
from tmp
where serial_id in (
select serial_id from tmp
)

新建账号

查找 epmloyee 表里工号不在账户表 users 的人员,新建账号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
insert into saaf_users(
user_id,
user_name,
user_full_name,
encrypted_password
)
select users_s.nextval, # users 表的 sequence
serial_id,
user_name,
'*********', # 加密密码。从已有的数据里选一个做默认密码
from saaf_employee
where serial_id not in (
select user_name from saaf_users
)

按理说就能用新账号登录了,但是一直并无法登录。往回查错。

所有的必填字段都已经有相应的值,按道理说应该能运行了。

我就导出 users 表 ,用原有数据和新插入的数据进行对比,发现新插入的数据比旧数据唯一哦的差别在于一个值 start_date_active,生效时间的字段。此字段非必填,但是程序里做了控制,登录时系统要判断账号是否生效,没有生效日期就不能使用。在系统界面里新建是账号的时候默认是 新建当日,而刚刚SQL操作的时候被忽略了。

查找出今日操作的数据,更新生效日期:

1
2
3
update saaf_users
set start_date_active = to_date('14-6月-6','dd-mon-rr')
where creation_date = to_date('14-6月-6','dd-mon-rr')

完成


记一次数据库导入的过程

本文原创自Laker's Blog,转载请注明出处,欢迎交换友链

如果本文对您有帮助,微信扫一扫,请我喝杯咖啡吧

comment