业务背景

因客户要求以前的业务配置已经废弃(有所变更),
要更新业务最新的配置信息(字段、相关项、审批配置配置与展示等)。

客户要把这些配置变成 最新的阶段配置 以前的配置 不会因为现在的最新配置 而改变 俗称快照存储(旧的配置) 就如Redis有两种特性 持久化 快照

选择使用函数解决的由来

有的人会问,为什么不使用代码去实现,你的每一步都可以通过查询数据库实现的。

业务功能与表结构的设计 很标准规范,考虑到完全可以用SQL语句一步到位,实现客户的需要。

1、通过代码实现 首先你得先考虑客户与他们的业务,他们的想法和业务是实时发生变化的,使用代码实现始终满足不了客户的需要(也可以使用代码,但考虑的甚多)。
2、通过代码实现 还要自己自测、测试人员测试、提单子安排发版本等,如果中间代码出了问题,所有人都会因为你的过失而加班,效率反而反其道而行。

该业务背景下使用函数的好处

  • 可以根据客户的心情、业务的变化,需要调用配置更新,根据自己实际情况只修改部分变量即可。
  • 使用SQL解决要么成功要么失败,而写代码有可能会带来更多的问题(不否认可以实现)。
  • 类似业务背景下可以通用 (我的SQL会在甲方的脚本手册中出现,给甲方省一大笔给乙方(外包公司)开发的时间以及金钱)。 ```plsql CREATE OR REPLACE FUNCTION “public”.”updatestageinstancenode”() RETURNS “pg_catalog”.”void” AS $BODY$ DECLARE mt_data RECORD; stage_instance RECORD; _stage_id varchar(24); _version_id varchar(24); _node_id varchar(24); instance_node RECORD; BEGIN
    1. FOR mt_data IN ( SELECT ID, object_describe_api_name, name FROM paas_mt_data WHERE object_describe_api_name IN ( 'Object_zbhg__u' ) AND is_deleted = FALSE AND ID in ('6176059c7e88604f6edb541c'))
    2. loop

— 输出 RAISE NOTICE ‘==================================’ ; RAISE NOTICE ‘paas_mt_data is id %’, mt_data.id ; RAISE NOTICE ‘paas_mt_data is object_describe_api_name %’, mt_data.object_describe_api_name ; RAISE NOTICE ‘paas_mt_data is name %’, mt_data.name ;

— 第一步,根据数据data id,获取当前在用的阶段版本id和实例id,stage_version_id = ‘60c2f404add538284b09bf1f’,stage_instance_id = id = ‘60caeec8add538284b09c15f’ select id, stage_version_id into stage_instance from paas_stage_instance where data_id = mt_data.id;

— 第二步,根据版本id,到阶段版本表中找到这条数据的阶段配置id,stage_id = ‘60c0737fadd538284b09bb2a’ select stage_id into _stage_id from paas_stage_version where id = stage_instance.stage_version_id;

— 第三步,根据阶段配置id,去检查当前最新的阶段版本, 拿到最新的stage_version_id = id = ‘6131b7fbadd5386957984e4c’ select id into _version_id from paas_stage_version where stage_id = _stage_id order by update_time desc limit 1 ;

—第四步,根据这个最新的stage_version_id去查询到阶段各个节点的最新的node配置信息,拿到新的投决阶段的node id,node_id = id = ‘6131b7fbadd5386957984e4d’ select id into _node_id from paas_stage_node where stage_version_id = _version_id and node_name = ‘项目执行’;

— 第五步,不改变阶段整体配置的情况下更新单个节点,先找到节点,用第一步的实例id, 拿到节点实例id instance_node_id = id = ‘60caeec8add538284b09c160’ select id, node_id into instance_node from paas_stage_instance_node where stage_instance_id = stage_instance.id and node_name = ‘项目执行’;

— 输出 RAISE NOTICE ‘node_id is %’, _node_id ; RAISE NOTICE ‘instance_node_id is %’, instance_node.id ;

— 第六步 将实例节点的配置,更新为新的节点配置的数据要求 UPDATE paas_stage_instance_node A SET related_items = b.related_items_definition FROM paas_stage_node b WHERE A.ID = instance_node.id AND b.ID = _node_id ;

  1. --第七步 修改节点配置
  2. UPDATE paas_stage_node A SET related_items_definition = b.related_items_definition
  3. FROM paas_stage_node b
  4. WHERE A.ID = instance_node.node_id AND b.ID = _node_id ;

— 输出
RAISE NOTICE ‘==================================’ ; END loop; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ``` 理解客户的思想(选修)

  1. 业务一直在变化 但是以前存储的业务 已经废弃了 所以要 变成现在 的业务配置。
  2. 客户并不会说指定 哪个配置要更新
    1. 也有可能说 我只更改阶段的 审批配置
    2. 也有可能说,阶段挂着的 相关项配置
    3. 也有可能说,阶段挂着的 字段配置
  3. 这段SQL(自定义函数&存储过程) 可以实现
    1. 哪个实体要更改,甚至可以稍微改一下,就这条数据要更改 更改的哪写配置项。(可以随便指定某个配置)
      1. A项目更改阶段审批配置
      2. B项目更改阶段相关项配置
      3. C项目更改阶段字段配置