标准对象可设置触发器,用于增删改对象数据后,执行表达式以实现日志记录、数据校验等后置逻辑。但不能修改发起对象,如需修改,则使用属性/链接的数据重写功能,详见:数据重写。触发器可能会使保存数据变慢,请合理使用
对象属性栏-高级中新建触发器,点击编辑进入触发器二级页
配置 |
说明 |
---|---|
编码 |
自动生成编码 |
名称 |
触发器的描述 |
运行时机 |
运行触发器的时机,包括:新建、更新、删除数据后,可多选。运行时机针对最后生成的DeepQL语句,例如:在DeepModel数据管理、UX页面新建包含自我链接的数据,由于对应DeepQL语句实际为先新建数据,再更新自我链接,会分别触发运行时机为新建、更新的触发器 |
执行方式 |
单条表示对每条操作数据执行一次表达式;批量表示只执行一次表达式。执行方式针对最后生成的DeepQL语句,例如:在DeepModel数据管理、UX页面批量更新数据,由于对应DeepQL语句实际为一条一条地更新数据,即使执行方式设置为批量,每次批量更新对应数据为单条 |
执行语句 |
触发器执行的DeepQL语句,格式 |
首先新建日志对象Log,用于记录操作日志
编码 |
名称 |
分类 |
属性类型/链接对象 |
说明 |
---|---|---|---|---|
code |
编码 |
非计算属性 |
文本 |
业务主键,可配置新建后的数据重写规则 |
action |
动作 |
非计算属性 |
枚举值 |
枚举值与触发器的运行时机对应,包括: |
operation_time |
操作时间 |
非计算属性 |
日期时间 |
可配置新建后的数据重写规则 |
operate_user_id |
操作用户ID |
非计算属性 |
文本 |
可配置新建后的数据重写规则 |
object_code |
对象编码 |
非计算属性 |
文本 |
记录操作对象,可配置对象索引加速日志数据查询 |
business_key |
业务主键 |
非计算属性 |
文本 |
记录操作主键,可配置对象索引加速日志数据查询 |
data |
数据 |
非计算属性 |
文本 |
记录操作数据,即新建后、更新后、删除前的对象数据 |
operator |
操作用户 |
计算链接 |
|
联查模式下,根据操作用户ID,查询用户对象SystemUser获取操作用户 |
然后对所有需要记录操作日志的对象设置触发器,执行语句即往日志对象Log中写数。以需求对象Requirement为例,新建记录新建、更新、删除日志的触发器
名称 |
运行时机 |
执行方式 |
执行语句 |
---|---|---|---|
记录新建日志 |
新建 |
单条 |
do (insert Log { action := ‘insert’, object_code := ‘Requirement’, business_key := __new__.code, data := to_str(<json>(select __new__ { name, req_type, component_code := .component.code } )) } ) |
记录更新日志 |
更新 |
单条 |
do (insert Log { action := ‘update’, object_code := ‘Requirement’, business_key := __new__.code, data := to_str(<json>(select __new__ { name, req_type, component_code := .component.code } )) } ) |
记录删除日志 |
删除 |
单条 |
do (insert Log { action := ‘delete’, object_code := ‘Requirement’, business_key := __old__.code, data := to_str(<json>(select __old__ { name, req_type, component_code := .component.code } )) } ) |
可新建UX页面展示操作日志
触发器可用于联动更新其他对象数据。例如:头表对象Head、行表对象Detail各有一个状态属性status,初始都为true,链接head从行表指向头表。当头表对象数据的状态置为false,行表对象关联数据的状态也都置为false
头表对象设置触发器,执行语句即更新行表对象关联数据的状态
名称 |
运行时机 |
执行方式 |
执行语句 |
---|---|---|---|
更新行表关联数据的状态 |
更新 |
单条 |
do (update Detail filter (.head.code = __new__.code) set { status := (false if (__old__.status AND NOT (__new__.status)) else .status) } ) |
通过assert函数进行数据校验,即assert(cond, message := 'msg')
,分别定义校验条件与错误信息。保存数据时,如果校验条件判断为false,则保存失败并报错,文案为自定义的错误信息
触发器主要校验单条数据且涉及多个属性/链接,单个属性/链接的约束可在属性/链接的属性栏中配置
以任务对象Task为例,设置触发器校验计划开始时间小于计划结束时间
名称 |
运行时机 |
执行方式 |
执行语句 |
---|---|---|---|
校验计划开始时间小于计划结束时间 |
新建、更新 |
单条 |
do (assert((__new__.p_start_date < __new__.p_end_date), message := ((‘任务【’ ++ __new__.name) ++ ‘】计划开始时间需小于计划结束时间’)) ) |
以需求对象Requirement为例,设置触发器校验重复需求的关联需求必填
名称 |
运行时机 |
执行方式 |
执行语句 |
---|---|---|---|
校验重复需求的关联需求必填 |
新建、更新 |
单条 |
do (assert(NOT ((__new__.is_duplicated AND NOT (EXISTS (__new__.related_req)))), message := ((‘需求【’ ++ __new__.name) ++ ‘】为重复需求,关联需求必填’)) ) |
触发器也可校验批量数据,以头表对象Head、行表对象Detail为例,每条头表对象数据至少有一条关联的行表对象数据
行表对象设置触发器,校验删除数据后,被删除的行表数据对应各头表数据,至少有一条关联的行表数据
名称 |
运行时机 |
执行方式 |
执行语句 |
---|---|---|---|
校验至少有一条关联的行表数据 |
删除 |
批量 |
do (assert((for h in __old__.head union (select (count((select detached Detail filter (.head = h) )) > 0) )), message := ‘至少有一条关联的行表数据’) ) |
但在UX页面新建领域模型头、行表数据时,无法进行该校验。需要在UX页面上设置前端控制,即点击保存,行表有数据时才能提交表单
回到顶部
咨询热线