用户数据同步说明文档

说明

本文档,主要为了让实施人员能够方便地将用户数据(包括组织机构、人员帐号)同步到用户服务相关业务表。

用户服务

业务数据表说明

字典

主要涉及用户数据 相关的 字典数据,详细『字典说明』

  • 字典类型 TB_B_DICTIONARY_TYPE

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | MULTI_LEVEL | 是否多层级 | INT | 1:是,0:否;默认是 | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 |

  • 字典项 TB_B_DICTIONARY

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | DICTIONARY_TYPE_ID | 字典类型 | VARCHAR(64), NN | TB_B_DICTIONARY_TYPE 表 ID | | PARENT_DICTIONARY_ID | 父级字典 | VARCHAR(64) | TB_B_DICTIONARY 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认否 |

身份

帐号身份类型,以及 身份 与 用户组下人员 的初始关联设置

  • 身份类型 TB_B_IDENTITY_TYPE

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(100), PK, NN | | | PARENT_IDENTITY_TYPE_ID | 父身份类型 | VARCHAR(64) | TB_B_IDENTITY_TYPE 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | |

  • 身份类型-用户组初始化关系 TB_B_IDENTITY_TYPE_GROUP_INITIAL

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(100), PK, NN | | | IDENTITY_TYPE_ID | 身份类型ID | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | | GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID |

组织机构

组织机构数据

  • 组织机构 TB_B_ORGANIZATION

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | IS_ROOT_ORGANIZATION | 是否根组织机构 | INT | 0:否,1:是;默认否 | | ROOT_ORGANIZATION_ID | 所属的根组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | | PARENT_ORGANIZATION_ID | 所属的父级组织机构 | VARCHAR(64) | TB_B_ORGANIZATION 表 ID | | CODE | 代码 | VARCHAR(120), NN | | | NAME | 名称 | VARCHAR(200), NN | | | DESCRIPTION | 描述 | VARCHAR(500) | | | TYPE_ID | 组织机构部门类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:ORGANIZATION_TYPE | | STATE | 状态 | INT | 0:正常,1:冻结,2:注销;默认正常 | | ENABLE | 是否启用 | INT | 1:启用,0:不启用;默认启用 | | SORT | 排序 | BIGINT | | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否,1:是;默认是 |

用户

用户的基本信息、安全设置的数据

  • 用户基础信息 TB_B_USER

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | UID | 唯一编号 | VARCHAR(64), NN | | | PASSWORD | 账号密码 | VARCHAR(255), NN | | | LDAP_USER_PASSWORD | 账号密码(LDAP同步用) | VARCHAR(255) | | | PASSWORD_STATE | 密码过期状态 | INT | 0:正常 未过期,-1:已过期,>0:n天后即将过期;默认0 | | NAME | 姓名 | VARCHAR(255), NN | | | NAME_SPELLING | 姓名简拼 | VARCHAR(120) | | | FULL_NAME_SPELLING | 姓名全拼 | VARCHAR(255) | | | CERTIFICATE_TYPE_ID | 证件类型 | VARCHAR(64), NN | TB_B_DICTIONARY 表 ID;字典类型:CERTIFICATE_TYPE | | CERTIFICATE_NUMBER | 证件号码 | VARCHAR(120), NN | | | PHONE_NUMBER | 手机号码 | VARCHAR(50) | | | EMAIL | 邮箱 | VARCHAR(50) | | | IMAGE_URL | 头像 | VARCHAR(255) | | | GENDER_ID | 性别 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:GENDER | | NATION_ID | 民族 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:NATION | | COUNTRY_ID | 国家 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:COUNTRY | | ADDRESS_ID | 地区 | VARCHAR(64) | TB_B_DICTIONARY 表 ID;字典类型:ADDRESS |

  • 用户安全设置 TB_B_SAFETY

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | | SCORE | 账号安全得分 | VARCHAR(5), NN | 默认0 | | PASSWORD_SCORE | 安全密码得分 | VARCHAR(5), NN | 默认0 | | SECURE_EMAIL | 安全邮箱 | VARCHAR(60), NN | | | SECURE_PHONE | 安全手机 | VARCHAR(20), NN | |

帐号

帐号数据,帐号所属组织机构、帐号所属用户组等

  • 帐号 TB_B_ACCOUNT

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | USER_ID | 用户ID | VARCHAR(64), NN | TB_B_USER 表 ID | | ACCOUNT_NAME | 人员账号;唯一 | VARCHAR(64), NN | | | ACCOUNT_EXPIRY_DATE | 账号有效日期[yyyy-MM-dd] | DATE | | | ACCOUNT_LOCKED | 是否锁定 | INT | 0:未锁定;1:锁定;默认,0 未锁定 | | ORGANIZATION_ID | 所属组织机构 | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | | IDENTITY_TYPE_ID | 身份类型 | VARCHAR(64), NN | TB_B_IDENTITY_TYPE 表 ID | | ACTIVATION | 是否激活定 | INT | 0:未激活;1:激活;默认,0 未激活 | | STATE | 状态 | VARCHAR(20) | NORMAL:正常;FREEZE:冻结;WRITTENOFF:注销;默认,NORMAL | | IS_DATA_CENTER | 是否来源数据中心 | INT | 0:否;1:是;默认,1 是 |

  • 帐号-组织机构关系(一人多部门关系) TB_B_ACCOUNT_ORGANIZATION

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | ROOT_ORGANIZATION_ID | 根组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID | | ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | | ORGANIZATION_ID | 组织机构ID | VARCHAR(64), NN | TB_B_ORGANIZATION 表 ID |

  • 帐号-用户组关系 TB_B_ACCOUNT_GROUP

| 字段 | 名称 | 类型(长度) | 说明 | | - | - | - | - | | ID | 编号 | VARCHAR(64), PK, NN | | | ACCOUNT_ID | 人员账户ID | VARCHAR(64), NN | TB_B_ACCOUNT 表 ID | | GROUP_ID | 用户组ID | VARCHAR(64), NN | TB_B_GROUP 表 ID |

字典说明

若组织机构数据、人员数据中使用的字典与以下现有字典 不一致的,须进行重新初始化

  • 组织机构类型

代码 | 名称 | 是否可调整

  • | - | - 10000 | 根组织机构 | 不要删除、调整 10001 | 学校 | 10002 | 部门 | 10003 | 院系 | 10004 | 专业 | 10005 | 班级 |

,除 10000 外,其他组织机构类型代码都可以视项目情况,删除,然后新增

  • 证件类型

采用标准代码

代码 | 名称

  • | - 1 | 居民身份证 2 | 军官证 3 | 士兵证 4 | 文职干部证 5 | 部队离退休证 6 | 香港特区护照/身份证明 7 | 澳门特区护照/身份证明 8 | 台湾居民来往大陆通行证 9 | 境外永久居住证 A | 护照 B | 户口薄 C | 外国人永久居留证 Z | 其他
  • 性别

采用标准代码

代码 | 名称

  • | - 0 | 未知的性别 1 | 男 2 | 女 9 | 未说明的性别
  • 民族

采用标准代码

代码 | 名称

  • | - 01 | 汉族 02 | 蒙古族 03 | 回族 04 | 藏族 05 | 维吾尔族 06 | 苗族 07 | 彝族 08 | 壮族 09 | 布依族 10 | 朝鲜族 11 | 满族 12 | 侗族 13 | 瑶族 14 | 白族 15 | 土家族 16 | 哈尼族 17 | 哈萨克族 18 | 傣族 19 | 黎族 20 | 傈僳族 21 | 佤族 22 | 畲族 23 | 高山族 24 | 拉祜族 25 | 水族 26 | 东乡族 27 | 纳西族 28 | 景颇族 29 | 柯尔克孜族 30 | 土族 31 | 达斡尔族 32 | 仫佬族 33 | 羌族 34 | 布朗族 35 | 撒拉族 36 | 毛难族 37 | 仡佬族 38 | 锡伯族 39 | 阿昌族 40 | 普米族 41 | 塔吉克族 42 | 怒族 43 | 乌孜别克族 44 | 俄罗斯族 45 | 鄂温克族 46 | 德昂族 47 | 保安族 48 | 裕固族 49 | 京族 50 | 塔塔尔族 51 | 独龙族 52 | 鄂伦春族 53 | 赫哲族 54 | 门巴族 55 | 珞巴族 56 | 基诺族 81 | 穿青人族 97 | 其他 98 | 外国血统中国籍人士
  • 国家

采用标准代码

代码 | 名称

  • | - 156 | 中国
  • 地区

采用标准代码,代码过多,此处只列出若干,详细可见系统的字典管理功能

代码 | 名称

  • | - 110000 | 北京市 110100 | 市辖区 110101 | 东城区 110102 | 西城区 | 120000 | 天津市 120100 | 市辖区 120101 | 和平区 120102 | 河东区 120103 | 河西区 | 310000 | 上海市 310100 | 市辖区 310101 | 黄浦区

身份说明

身份数据由项目根据实际情况 进行创建

同步接口逻辑说明

组织机构同步接口

保存数据时, 验证 组织机构数据 是否合法,代码、名称、是否启用、上级组织机构 不能为空 判断 组织机构类型(字典) 是否存在?若不存在,则无法同步 判断 上级组织机构 是否存在?若不存在,则无法同步 根据 组织机构代码 判断组织机构是否已存在?若否,则新增;否则,更新

新增时,将 组织机构代码 作为 组织机构ID 进行保存。 更新时,判断 组织机构ID 是否与 上级组织机构ID 一致?若是,则无法同步;否则 保存。

删除数据时, 将 组织机构数据 的状态修改为 2:注销,并不进行物理删除

帐号同步接口

保存数据时, 验证 帐号数据 是否合法,姓名、证件类型、证件号码、账号名、身份类型、所属组织机构 不能为空 判断 证件类型(字典) 是否存在?若不存在,则无法同步 判断 所属组织机构 是否存在?若不存在,则无法同步 判断 所属组织机构 是否为行政组织机构?若不是,则无法同步 判断 身份类型 是否存在?若不存在,则无法同步

根据 帐号名 获取帐号信息是否存在? 若不存在,则须新增帐号,同时根据 证件号码 获取用户信息是否存在? 若不存在,则须新增用户 否则,判断 姓名是否 一致?若不一致,则无法同步;否则,可更新用户 否则,可更新帐号,同时 可更新用户

新增用户时,设置激活状态,设置信息完善状态 更新用户时,若一人一帐号,则 更新用户的 姓名、证件类型、证件号码

新增帐号时,设置激活状态(与用户的激活状态保持一致) 更新帐号时,不再更新 激活状态

删除数据时, 将 帐号数据 的状态修改为 WRITTENOFF:注销,并不进行物理删除

基于同步程序

实施人员,将 组织机构、人员帐号 数据,通过数据交换等工具,交换至以下临时表中

同步程序会定时,读取待处理的数据,调用对应的同步接口,将数据同步到用户服务的相关业务表中

临时表说明

源头数据表

  • 组织机构表

TMP_ORGANIZATION_ORIGIN

名称 | 类型 | 描述 | 是否必填

  • | - | - | - ID | varchar(64) | ID,主键,随机生成 | 必填 DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 ADD_ACCOUNT | varchar(100) | 创建人用户名 ADD_TIME | timestamp | 创建时间 EDIT_ACCOUNT | varchar(100) | 修改人用户名 EDIT_TIME | timestamp | 修改时间 DELETE_ACCOUNT | varchar(100) | 删除人用户名 DELETE_TIME | timestamp | 删除时间 PARENT_ORGANIZATION_ID | varchar(64) | 所属的父级组织机构,顶级组织机构为 0 CODE | varchar(120) | 组织机构代码 | 必填 NAME | varchar(200) | 组织机构名称 | 必填 DESCRIPTION | varchar(500) | 组织机构描述 TYPE_ID | varchar(64) | 组织机构部门类型,字典表ID、代码均可 | 必填 STATE | int(2) | 状态 [0:正常 1:冻结 2:注销];默认正常 | 必填 ENABLE | int(1) | 是否启用 1:启用 0:不启用;默认启用 IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填
  • 帐号表

TMP_ACCOUNT_ORIGIN

名称 | 类型 | 描述 | 是否必填

  • | - | - | - ID | varchar(64) | ID,主键,随机生成 | 必填 DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 ADD_ACCOUNT | varchar(100) | 创建人用户名 ADD_TIME | timestamp | 创建时间 EDIT_ACCOUNT | varchar(100) | 修改人用户名 EDIT_TIME | timestamp | 修改时间 DELETE_ACCOUNT | varchar(100) | 删除人用户名 DELETE_TIME | timestamp | 删除时间 UID | varchar(64) | 唯一编号 | 必填 NAME | varchar(255) | 姓名 | 必填 NAME_SPELLING | varchar(120) | 姓名简拼 FULL_NAME_SPELLING | varchar(255) | 姓名全拼 CERTIFICATE_TYPE_ID | varchar(64) | 证件类型,字典表ID、代码均可 | 必填 CERTIFICATE_NUMBER | varchar(120) | 证件号码 | 必填 PHONE_NUMBER | varchar(50) | 手机号码 EMAIL | varchar(50) | 邮箱 IMAGE_URL | varchar(255) | 个人照片地址 GENDER_ID | varchar(64) | 性别,字典表ID、代码均可 NATION_ID | varchar(64) | 民族,字典表ID、代码均可 COUNTRY_ID | varchar(64) | 国家,字典表ID、代码均可 ADDRESS_ID | varchar(64) | 地区,字典表ID、代码均可 ACCOUNT_NAME | varchar(120) | 人员账号 | 必填,唯一 ACCOUNT_EXPIRY_DATE | date | 账号有效日期[yyyy-MM-dd] ORGANIZATION_ID | varchar(64) | 所属组织机构 | 必填 IDENTITY_TYPE_ID | varchar(64) | 身份类型,身份表ID、代码均可 | 必填 ACTIVATION | int(1) | 是否激活 [0:未激活 1:激活] | 必填 STATE | varchar(20) | 账号状态[ NORMAL:正常 FREEZE:冻结 WRITTENOFF:注销] 默认正常状态 | 必填 IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填

转换数据表

  • 组织机构表

TMP_ORGANIZATION_TRANS

名称 | 类型 | 描述 | 是否必填

  • | - | - | - TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | TRANS_TIME | DATETIME | 同步时间 | PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | PROC_TIME | DATETIME | 处理时间 | ID | varchar(64) | ID,主键,随机生成 | 必填 DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 ADD_ACCOUNT | varchar(100) | 创建人用户名 ADD_TIME | timestamp | 创建时间 EDIT_ACCOUNT | varchar(100) | 修改人用户名 EDIT_TIME | timestamp | 修改时间 DELETE_ACCOUNT | varchar(100) | 删除人用户名 DELETE_TIME | timestamp | 删除时间 PARENT_ORGANIZATION_ID | varchar(64) | 所属的父级组织机构,顶级组织机构为 0 CODE | varchar(120) | 组织机构代码 | 必填 NAME | varchar(200) | 组织机构名称 | 必填 DESCRIPTION | varchar(500) | 组织机构描述 TYPE_ID | varchar(64) | 组织机构部门类型,字典表ID、代码均可 | 必填 STATE | int(2) | 状态 [0:正常 1:冻结 2:注销];默认正常 | 必填 ENABLE | int(1) | 是否启用 1:启用 0:不启用;默认启用 IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填
  • 帐号表

TMP_ACCOUNT_TRANS

名称 | 类型 | 描述 | 是否必填

  • | - | - | - TRANS_STATUS | VARCHAR(10) | 传输状态(0 无变化、1 新增、2 更新、3 删除) | TRANS_TIME | DATETIME | 同步时间 | PROC_STATUS | VARCHAR(10) | 处理状态(0 不处理、1 可处理) | PROC_RESULT | VARCHAR(10) | 处理结果(0 未处理、1 处理成功、2 处理失败) | PROC_TIME | DATETIME | 处理时间 | ID | varchar(64) | ID,主键,随机生成 | 必填 DELETED | int(1) | 是否删除 0:有效 1:删除 | 必填 ADD_ACCOUNT | varchar(100) | 创建人用户名 ADD_TIME | timestamp | 创建时间 EDIT_ACCOUNT | varchar(100) | 修改人用户名 EDIT_TIME | timestamp | 修改时间 DELETE_ACCOUNT | varchar(100) | 删除人用户名 DELETE_TIME | timestamp | 删除时间 UID | varchar(64) | 唯一编号 | 必填 NAME | varchar(255) | 姓名 | 必填 NAME_SPELLING | varchar(120) | 姓名简拼 FULL_NAME_SPELLING | varchar(255) | 姓名全拼 CERTIFICATE_TYPE_ID | varchar(64) | 证件类型,字典表ID、代码均可 | 必填 CERTIFICATE_NUMBER | varchar(120) | 证件号码 | 必填 PHONE_NUMBER | varchar(50) | 手机号码 EMAIL | varchar(50) | 邮箱 IMAGE_URL | varchar(255) | 个人照片地址 GENDER_ID | varchar(64) | 性别,字典表ID、代码均可 NATION_ID | varchar(64) | 民族,字典表ID、代码均可 COUNTRY_ID | varchar(64) | 国家,字典表ID、代码均可 ADDRESS_ID | varchar(64) | 地区,字典表ID、代码均可 ACCOUNT_NAME | varchar(120) | 人员账号 | 必填,唯一 ACCOUNT_EXPIRY_DATE | date | 账号有效日期[yyyy-MM-dd] ORGANIZATION_ID | varchar(64) | 所属组织机构 | 必填 IDENTITY_TYPE_ID | varchar(64) | 身份类型,身份表ID、代码均可 | 必填 ACTIVATION | int(1) | 是否激活 [0:未激活 1:激活] | 必填 STATE | varchar(20) | 账号状态[ NORMAL:正常 FREEZE:冻结 WRITTENOFF:注销] 默认正常状态 | 必填 IS_DATA_CENTER | int(1) | 是否来源数据中心 [ 0:否 1:是 ];默认是 | 必填

添加触发器

需在临时表上,增加更新触发器,执行以下脚本

用于将 源头表 数据的变更,触发到 转换表 中,更新转换表的相关状态字段,方便同步程序进行处理

DROP TRIGGER IF EXISTS after_update_organization_origin;

delimiter //
create trigger after_update_organization_origin after update on TMP_ORGANIZATION_ORIGIN for each row
begin
  declare ID1 varchar(100);
  declare ID2 varchar(100);

  -- new 代表 表中新增的数据
  set ID1 = (select ID from TMP_ORGANIZATION_TRANS
  where ((ID is null and new.ID is null) or ID=new.ID)
    and ((PARENT_ORGANIZATION_ID is null and new.PARENT_ORGANIZATION_ID is null) or PARENT_ORGANIZATION_ID=new.PARENT_ORGANIZATION_ID)
    and ((CODE is null and new.CODE is null) or CODE=new.CODE)
    and ((NAME is null and new.NAME is null) or NAME=new.NAME)
    and ((DESCRIPTION is null and new.DESCRIPTION is null) or DESCRIPTION=new.DESCRIPTION)
    and ((TYPE_ID is null and new.TYPE_ID is null) or TYPE_ID=new.TYPE_ID)
    and ((STATE is null and new.STATE is null) or STATE=new.STATE)
    and ((ENABLE is null and new.ENABLE is null) or ENABLE=new.ENABLE)
    and ((IS_DATA_CENTER is null and new.IS_DATA_CENTER is null) or IS_DATA_CENTER=new.IS_DATA_CENTER)
  );
  -- into @ID1;

  if ID1 is null then
      set ID2 = (select ID from TMP_ORGANIZATION_TRANS where ID=new.ID); -- into @ID2;

      if ID2 is null then
        insert into TMP_ORGANIZATION_TRANS(TRANS_STATUS, TRANS_TIME, PROC_STATUS, PROC_TIME,
          ID, PARENT_ORGANIZATION_ID,
          CODE, NAME, DESCRIPTION,
          TYPE_ID, 
          STATE, ENABLE, 
          IS_DATA_CENTER
        )
        values ('1', now(), '0', null,
          new.ID, new.PARENT_ORGANIZATION_ID,
          new.CODE, new.NAME, new.DESCRIPTION,
          new.TYPE_ID, 
          new.STATE, new.ENABLE, 
          new.IS_DATA_CENTER
        )
        ;

      else
        update TMP_ORGANIZATION_TRANS set
          TRANS_STATUS='2',
          TRANS_TIME=now(),
          PROC_STATUS='0',
          PARENT_ORGANIZATION_ID=new.PARENT_ORGANIZATION_ID,
          CODE=new.CODE,
          NAME=new.NAME,
          DESCRIPTION=new.DESCRIPTION,
          TYPE_ID=new.TYPE_ID,
          STATE=new.STATE,
          ENABLE=new.ENABLE,
          IS_DATA_CENTER=new.IS_DATA_CENTER
        where ID=new.ID
        ;

      end if;

    else

      -- 如果数据没变化,但存在记录,且被处理,则标记未 不更新、不处理
      update TMP_ORGANIZATION_TRANS set
        TRANS_STATUS='0',
        TRANS_TIME=now(),
        PROC_STATUS='0'
      where ID=new.ID
        and PROC_RESULT!='0'
      ;

    end if;

end //
delimiter ;


DROP TRIGGER IF EXISTS after_update_account_origin;

delimiter //
create trigger after_update_account_origin after update on TMP_ACCOUNT_ORIGIN for each row
begin
  declare ID1 varchar(100);
  declare ID2 varchar(100);

  -- new 代表 表中新增的数据
  set ID1 = (select ID from TMP_ACCOUNT_TRANS
  where ((ID is null and new.ID is null) or ID=new.ID)
    and ((UID is null and new.UID is null) or UID=new.UID)
    and ((NAME is null and new.NAME is null) or NAME=new.NAME)
    and ((NAME_SPELLING is null and new.NAME_SPELLING is null) or NAME_SPELLING=new.NAME_SPELLING)
    and ((FULL_NAME_SPELLING is null and new.FULL_NAME_SPELLING is null) or FULL_NAME_SPELLING=new.FULL_NAME_SPELLING)
    and ((CERTIFICATE_TYPE_ID is null and new.CERTIFICATE_TYPE_ID is null) or CERTIFICATE_TYPE_ID=new.CERTIFICATE_TYPE_ID)
    and ((CERTIFICATE_NUMBER is null and new.CERTIFICATE_NUMBER is null) or CERTIFICATE_NUMBER=new.CERTIFICATE_NUMBER)
    and ((PHONE_NUMBER is null and new.PHONE_NUMBER is null) or PHONE_NUMBER=new.PHONE_NUMBER)
    and ((EMAIL is null and new.EMAIL is null) or EMAIL=new.EMAIL)
    and ((IMAGE_URL is null and new.IMAGE_URL is null) or IMAGE_URL=new.IMAGE_URL)
    and ((GENDER_ID is null and new.GENDER_ID is null) or GENDER_ID=new.GENDER_ID)
    and ((NATION_ID is null and new.NATION_ID is null) or NATION_ID=new.NATION_ID)
    and ((COUNTRY_ID is null and new.COUNTRY_ID is null) or COUNTRY_ID=new.COUNTRY_ID)
    and ((ADDRESS_ID is null and new.ADDRESS_ID is null) or ADDRESS_ID=new.ADDRESS_ID)
    and ((ACCOUNT_NAME is null and new.ACCOUNT_NAME is null) or ACCOUNT_NAME=new.ACCOUNT_NAME)
    and ((ACCOUNT_EXPIRY_DATE is null and new.ACCOUNT_EXPIRY_DATE is null) or ACCOUNT_EXPIRY_DATE=new.ACCOUNT_EXPIRY_DATE)
    and ((ORGANIZATION_ID is null and new.ORGANIZATION_ID is null) or ORGANIZATION_ID=new.ORGANIZATION_ID)
    and ((IDENTITY_TYPE_ID is null and new.IDENTITY_TYPE_ID is null) or IDENTITY_TYPE_ID=new.IDENTITY_TYPE_ID)
    and ((ACTIVATION is null and new.ACTIVATION is null) or ACTIVATION=new.ACTIVATION)
    and ((STATE is null and new.STATE is null) or STATE=new.STATE)
    and ((IS_DATA_CENTER is null and new.IS_DATA_CENTER is null) or IS_DATA_CENTER=new.IS_DATA_CENTER)
  );
  -- into @ID1;

  if ID1 is null then
      set ID2 = (select ID from TMP_ACCOUNT_TRANS where ID=new.ID); -- into @ID2;

      if ID2 is null then
        insert into TMP_ACCOUNT_TRANS(TRANS_STATUS, TRANS_TIME, PROC_STATUS, PROC_TIME,
          ID, UID, 
          NAME, NAME_SPELLING, FULL_NAME_SPELLING,
          CERTIFICATE_TYPE_ID, CERTIFICATE_NUMBER, 
          PHONE_NUMBER, EMAIL, 
          IMAGE_URL,
          GENDER_ID, NATION_ID, COUNTRY_ID, ADDRESS_ID, 
          ACCOUNT_NAME, ACCOUNT_EXPIRY_DATE, ORGANIZATION_ID, IDENTITY_TYPE_ID, 
          ACTIVATION, STATE, 
          IS_DATA_CENTER
        )
        values ('1', now(), '0', null,
          new.ID, new.UID, 
          new.NAME, new.NAME_SPELLING, new.FULL_NAME_SPELLING,
          new.CERTIFICATE_TYPE_ID, new.CERTIFICATE_NUMBER, 
          new.PHONE_NUMBER, new.EMAIL, 
          new.IMAGE_URL, 
          new.GENDER_ID, new.NATION_ID, new.COUNTRY_ID, new.ADDRESS_ID, 
          new.ACCOUNT_NAME, new.ACCOUNT_EXPIRY_DATE, new.ORGANIZATION_ID, new.IDENTITY_TYPE_ID, 
          new.ACTIVATION, new.STATE, 
          new.IS_DATA_CENTER
        )
        ;

      else
        update TMP_ACCOUNT_TRANS set
          TRANS_STATUS='2',
          TRANS_TIME=now(),
          PROC_STATUS='0',
          UID=new.UID,
          NAME=new.NAME,
          NAME_SPELLING=new.NAME_SPELLING,
          FULL_NAME_SPELLING=new.FULL_NAME_SPELLING,
          CERTIFICATE_TYPE_ID=new.CERTIFICATE_TYPE_ID,
          CERTIFICATE_NUMBER=new.CERTIFICATE_NUMBER,
          PHONE_NUMBER=new.PHONE_NUMBER,
          EMAIL=new.EMAIL,
          IMAGE_URL=new.IMAGE_URL,
          GENDER_ID=new.GENDER_ID,
          NATION_ID=new.NATION_ID,
          COUNTRY_ID=new.COUNTRY_ID,
          ADDRESS_ID=new.ADDRESS_ID,
          ACCOUNT_NAME=new.ACCOUNT_NAME,
          ACCOUNT_EXPIRY_DATE=new.ACCOUNT_EXPIRY_DATE,
          ORGANIZATION_ID=new.ORGANIZATION_ID,
          IDENTITY_TYPE_ID=new.IDENTITY_TYPE_ID,
          ACTIVATION=new.ACTIVATION,
          STATE=new.STATE,
          IS_DATA_CENTER=new.IS_DATA_CENTER
        where ID=new.ID
        ;

      end if;

    else

      -- 如果数据没变化,但存在记录,且被处理,则标记未 不更新、不处理
      update TMP_ACCOUNT_TRANS set
        TRANS_STATUS='0',
        TRANS_TIME=now(),
        PROC_STATUS='0'
      where ID=new.ID
        and PROC_RESULT!='0'
      ;

    end if;

end //
delimiter ;

数据清理

临时表数据

将 TMP_ACCOUNT_ORIGIN,TMP_ACCOUNT_TRANS 表的数据删除即可

业务数据

按以下顺序,依次删除相关主业务数据即可

  1. 删除 帐号 数据,将级联地删除 帐号-组织机构关系、帐号-用户组关系 2个表的数据

  2. 删除 用户 数据,将级联地删除 用户安全设置 的数据

  3. 删除 组织机构 数据