全部文档
文档中心DeepModel功能触发器

触发器

标准对象可设置触发器,用于增删改对象数据后,执行表达式以实现日志记录、数据校验等后置逻辑。但不能修改发起对象,如需修改,则使用属性/链接的数据重写功能,详见:数据重写。触发器可能会使保存数据变慢,请合理使用

对象属性栏-高级中新建触发器,点击编辑进入触发器二级页

配置

说明

编码

自动生成编码

名称

触发器的描述

运行时机

运行触发器的时机,包括:新建、更新、删除数据后,可多选。运行时机针对最后生成的DeepQL语句,例如:在DeepModel数据管理、UX页面新建包含自我链接的数据,由于对应DeepQL语句实际为先新建数据,再更新自我链接,会分别触发运行时机为新建、更新的触发器

执行方式

单条表示对每条操作数据执行一次表达式;批量表示只执行一次表达式。执行方式针对最后生成的DeepQL语句,例如:在DeepModel数据管理、UX页面批量更新数据,由于对应DeepQL语句实际为一条一条地更新数据,即使执行方式设置为批量,每次批量更新对应数据为单条

执行语句

触发器执行的DeepQL语句,格式do (expr)。可使用__old__、__new__分别表示操作前后数据。执行方式为单条时,对应一条操作数据;执行方式为批量时,对应操作数据集合。运行时机为新建时可使用__new__,为更新时可使用__old__、__new__,为删除时可使用__old__。保存后回显SDL对应内容

首先新建日志对象Log,用于记录操作日志

编码

名称

分类

属性类型/链接对象

说明

code

编码

非计算属性

文本

业务主键,可配置新建后的数据重写规则<str>.id,即自动填id值

action

动作

非计算属性

枚举值

枚举值与触发器的运行时机对应,包括:


+ insert - 新建

+ update - 更新

+ delete - 删除

operation_time

操作时间

非计算属性

日期时间

可配置新建后的数据重写规则cal::local_datetime_of_statement(),即自动填当前时间

operate_user_id

操作用户ID

非计算属性

文本

可配置新建后的数据重写规则global ${空间模块}::current_user_id,即自动填当前用户ID

object_code

对象编码

非计算属性

文本

记录操作对象,可配置对象索引加速日志数据查询

business_key

业务主键

非计算属性

文本

记录操作主键,可配置对象索引加速日志数据查询

data

数据

非计算属性

文本

记录操作数据,即新建后、更新后、删除前的对象数据

operator

操作用户

计算链接

${空间模块}::SystemUser

联查模式下,根据操作用户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页面上设置前端控制,即点击保存,行表有数据时才能提交表单

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send