我正在尝试开发一个基于Java web的应用程序,可以工作流不同的对象沿着不同的路径。这些对象和路径将在DB中定义为工作流类和工作项。现在我正在研究Calculation Assignment
对象,该对象根据其选择的计算级别获得其工作流路径。
这是我的工作流程计算表:
TPQOT_CALC_ASSIGNMENT "Calculation Assignment - Main Object"
=====================
CONSTRAINT dup_wf_instance UNIQUE (WORKFLOW_INSTANCE_ID)
---------------------
CALC_NUM (PK) VARCHAR2(6) "Calculation Number"
CALC_REV (PK) VARCHAR2(2) "Calculation Revision Designator"
CALC_DEPT (PK) VARCHAR2(3) "Calculation Originating Department"
CALC_LEVEL_ID (FK) VARCHAR2(24) "Calculation Level ID"
WORKFLOW_INSTANCE_ID (FK) VARCHAR2(24) "Workflow Instance Unique ID"
TPQOT_CALC_LEVEL_WORKFLOW "Calculation Level To Work Flow Class Lookup Table"
=========================
CONSTRAINT dup_calclvlwf UNIQUE (CALC_LEVEL, DEPT_OWNER, WORKFLOW_CLASS_ID)
CONSTRAINT dup_calclvl UNIQUE (CALC_LEVEL, DEPT_OWNER)
-------------------------
CALC_LEVEL_ID (PK) VARCHAR2(24) "Calculation Level To Work Flow Type Unique ID (Surrogate)"
CALC_LEVEL VARCHAR2(3) "Calculation Level"
DEPT_OWNER VARCHAR2(3) "Department Owner"
WORKFLOW_CLASS_ID (FK) VARCHAR2(24) "Work flow Class Unique ID"
WF_WORKFLOW_INSTANCE "Workflow Instances"
====================
WORKFLOW_INSTANCE_ID (PK) VARCHAR2(24) "Work Flow Instance Unique ID"
WORKFLOW_CLASS_ID (FK) VARCHAR2(24) "Work Flow Class Unique ID"
STARTED_BY VARCHAR2(9) "Work Flow Instance Started By Badge"
LAST_DATE DATE "Last date instance was worked"
STATUS VARCHAR2(3) "Workflow Instance Status"
WF_WORKFLOW_CLASS "Workflow process classes by department Reference Table"
=================
CONSTRAINT dup_workflow UNIQUE (DEPT_OWNER, NAME)
-----------------
WORKFLOW_CLASS_ID (PK) VARCHAR2(24) "Work flow Class Unique ID (Surrogate)"
DEPT_OWNER VARCHAR2(3) "Department Owner"
NAME VARCHAR2(64) "Short Name"
DESCRIPTION VARCHAR2(256) "Description"
VERSION VARCHAR2(2) "Version Number"
当用户开始一个新的计算工作流时,他们从下拉菜单中选择一个计算级别,这告诉我当他们点击提交时我应该在WF_WORKFLOW_INSTANCE表中存储哪个WORK_FLOW_CLASS_ID。
在TPQOT_CALC_ASSIGNMENT表中存储的两个外键:CALC_LEVEL_ID &WORKFLOW_INSTANCE_ID -两者在各自的表中都与相同的WORK_FLOW_CLASS相关。
如果计算分配数据被编辑,并且计算级别从II级计算更改为III级计算(与不同的工作流类相关)怎么办?
这是一个缺陷,会来困扰我的道路吗?我意识到我可以编写代码来确保如果Calc Level被更新,那么确保适当地创建一个新的工作流实例。
您可能想知道为什么我在工作流实例中没有Calc Level。这是因为我可能想要创建另一个不使用Level字段的工作流程对象,并且它可能只有一条路径。比如一份求职者的简历。
JOB_APPLICANT
=====================
APPLICANT_ID (PK)
FIRST_NAME
WORKFLOW_INSTANCE_ID (FK)
= = = = = = = =编辑如果我把CALC_LEVEL_ID
从TPQOT_CALC_ASSIGNMENT
表中去掉呢?TPQOT_CALC_LEVEL_WORKFLOW
表将用于Calc级别下拉,这为我提供了WORKFLOW_CLASS_ID
用于创建WF_WORKFLOW_INSTANCE
?在查看计算分配表单时,我将能够联合表并获得Calc级别标签。任何想法吗?
如果编辑了计算赋值数据,并且Calc Level由第II级计算改为第III级计算(与不同的工作流程类)?
如果这是你打算允许的更新,那么你有责任对更新做出适当的反应。您可能需要撤销基表上的权限,并通过可更新视图或存储过程处理所有更新。或者您可能需要编写一个或多个触发器。
如果这是一个你不应该允许的更新,那么你就不应该允许它。您只能授予INSERT和DELETE权限,并撤销UPDATE权限。可能还有其他方法。
允许更新而不适当地响应它会使数据库处于无效状态。因为这是一个应该适用于所有用户的需求,所以理想情况下它应该在数据库中,而不是在应用程序代码中。
如果您发现撤销更新权限限制太大,您可以使用一个简单的触发器来执行该规则,以便在更新计算级别而未更改工作流id时引发错误:
CREATE OR REPLACE TRIGGER trg_chk_class_change
BEFORE UPDATE
ON tpqot_calc_assignment
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
BEGIN
IF :NEW.calc_level_id <> :old.calc_level_id AND :NEW.workflow_class_id = :OLD.workflow_class_id THEN
raise_application_error(-20001, 'Class change only allowed if workflowid is changed');
END IF;
END;