一、简介
触发器是一种特殊的数据库对象,它在特定的数据库操作(如插入INSERT、更新UPDATE或删除DELETE)发生时自动执行。当这些预定义的事件发生在一个表上时,与该表关联的触发器会自动启动,并执行一段用户预先定义的SQL代码。
与之相关联的,就是我们所定义的模型事件,这种事件允许根据业务规则或数据完整性约束来自动响应对模型数据的操作。例如,一个模型事件可以用来检查每次插入新订单之前客户的账户状态,或者在更新某列数据后自动更新另一个相关表的数据。
二、交互流程
创建一个模型事件,配置它的名称、存储位置,关联模型及时机;
可以在事件页面中构建相应的执行函数,即事件触发后做什么,并控制事件开启生效。
事件执行记录展示当前事件被触发后,相应的执行动作留痕,包括触发来源、时间、执行反馈等。
三、触发时机
在一个完整的事件构成中,最重要的两项就是触发时机和执行动作,先来说下时机。
目前针对模型事件,我们提供了七种事件类型,即新增数据之前、新增数据之后、更新数据之前、更新数据之后、删除数据之前、删除数据之后、字段值更新后。
以上这些事件类型围绕的也都是当模型数据发生变化的时间节点。而与之对应的,能够影响这些事件发生的源头,在于我们通过模型函数对模型数据进行的实际变动,也就是事件订阅。即表象的具体行为会引发一系列的内在影响。
下面的表格中展示了现有模型函数会触发的事件类型:
事件订阅 | 新增数据之前 | 新增数据之后 | 更新数据之前 | 更新数据之后 | 删除数据之前 | 删除数据之后 | 字段值更新后 | |
---|---|---|---|---|---|---|---|---|
模型-类函数 | 新增数据 | ✔ | ✔ | ✔ | ||||
批量新增或更新 | ✔ | ✔ | ✔ | ✔ | ✔ | |||
按筛选条件更新数据 | ||||||||
按主键更新数据 | ✔ | ✔ | ✔ | |||||
按筛选条件删除数据 | ||||||||
按主键删除数据 | ✔ | ✔ | ✔ | |||||
更新或新增 | ✔ | ✔ | ✔ | ✔ | ✔ | |||
模型-成员函数 | 保存 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
删除 | ✔ | ✔ | ✔ | |||||
数据类型函数 | 单行数据-重置 | ✔ | ✔ | ✔ | ||||
多行数据-从数据库中删除 | ✔ | ✔ | ✔ | |||||
多行数据-保存到数据库中 | ✔ | ✔ | ✔ | ✔ | ✔ | |||
多行数据-更新数据 | ✔ | ✔ | ✔ |
通过此表,我们可以了解在对某一种事件类型进行具体实现后,会在哪些具体的场景中得到应用。
在三种更新类型的触发时机中,对于事件的触发范围可以在数据层面上进行更一步限定,即通过《筛选条件》模块对数据进行过滤。本质上就是对数据表的行做监控。
而在字段值更新后事件中,甚至可以对具体是哪个字段的值有变动做区分。本质上就是对数据表的列做监控。
目前数据筛选都是针对改变后的值筛选。
四、执行函数
在事件中最重要的是对具体执行动作的实现,也就是执行函数的构建。
在这里我们可以选择两种,一种为全局函数,选择任意一个服务函数,另一种是直接在内部函数中实现调用。至于内部函数编辑也是通过函数设计模块实现,参见 《函数设计》模块。
需要说明的是,在模型事件中,会将事件订阅输出参数作为函数的入参,该参数包含了具体的事件触发来源、模型行数据变化前后的记录。
五、代码实现
在代码编辑器模式下,可以看到每个事件分为两个文件,event.json、inner.py。
这两个文件分别对事件本身进行属性记录和对事件的执行函数实现。
下面是event.json原文,定义或记录了相关参数,如应用名、扩展类型、操作类型、返回类型等。
{
"funcType": "Inner",
"title": "跟进记录录入后",
"sender": "models.FollowupModel",
"operate": "AddAfter",
"enable": true
}
对于inner.py,则主要体现了执行函数本身,其中eventOutData为事件订阅输出参数。
六、使用场景示例
当模型中数据发生变化,除了查询以外的增加、修改、删除时都会触发。
例如订单入库时,更新库存,就只需要监听【货品数量】是否有改变,改变后,写一个逻辑处理即可;不用在新增、修改、删除时,写3个逻辑处理。
例如项目管理系统中,主管新增了一个任务进行分配,那么就可以监听任务模型的数据变化,对于新增任务解析执行人后自动在系统中发起相应通知。
七、注意事项
目前模型事件仅支持对数据表模型触发,不支持扩展表、聚合表。
进一步了解极态云,体验产品? 请访问 极态云官网
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。