概述
触发器(Trigger)可以在指定schema的增、删、改操作之前或之后,触发执行预先定义好的UQL语句,从而实现与DML类操作有绑定关系的业务逻辑的自动执行。
触发器命名规则
触发器由用户命名,规则如下:
- 2~64个字符
- 以字母开头
- 仅允许使用字母、下划线和数字(_ 、A-Z、a-z、0-9)
一个图集中的点触发器不能重名,边触发器也不能重名,但点触发器可以和边触发器重名。
查看触发器
返回的表名:_nodeTrigger
、_edgeTrigger
返回的表头:id
| name
| schema
| description
| when
| operation
| uqls
(触发器ID、名称、所属schema、描述、触发时机、操作类型、触发内容的UQL语句)
触发时机有before(前)和after(后),操作类型有insert(插入)、upsert(插入更新)、update(更新)和delete(删除)。
// 查看当前图集中的所有触发器(分点、边两个表返回)
show().trigger()
// 查看当前图集中的所有点触发器
show().node_trigger()
// 查看当前图集中的所有边触发器
show().edge_trigger()
创建触发器
// 在当前图集中为指定点schema创建触发器
create().node_trigger("<name>", @<schema>, "<desc?>")
.<before|after>("<insert|update|upsert|delete>")
.on("with node <subUQLs>")
// 在当前图集中为指定边schema创建触发器
create().edge_trigger("<name>", @<schema>, "<desc?>")
.<before|after>("<insert|update|upsert|delete>")
.on("with edge <subUQLs>")
本例为@student创建点触发器,效果是在插入@student点之前先将name属性值里的英文字符转为大写:
create().node_trigger("AutoUpperCase", @student).before("insert").on(
"
with node
let node.name = upper(node.name)
"
)
删除触发器
删除一个schema将同时删除其触发器。
// 从当前图集中删除指定的点触发器
drop().node_trigger("<name>")
// 从当前图集中删除指定的边触发器
drop().edge_trigger("<name>")
本例删除点触发器AutoUpperCase:
drop().node_trigger("AutoUpperCase")
本例删除边触发器AutoFloor:
drop().edge_trigger("AutoFloor")
使用触发器
创建好触发器以后,根据所定义的schema以及操作类型编写UQL语句。
本例使用触发器自动从待插入边的日期中提取出年份,并插入为另一个边属性:
// 创建边触发器AbstractYear
create().edge_trigger("AbstractYear", @studyAt).before("insert").on(
"
with edge
let edge.graduateYear = year(edge.graduateDate)
"
)
// 插入一条@studyAt边并返回该边
insert().into(@studyAt).edges([{GPA: 4.3, graduateDate: "2022-06-03", _from: "STU001", _to: "UNV003"}]) as n
return n{*}
|------------------------------ @studyAt ----------------------------|
| _uuid | _from | _to | GPA | graduateDate | graduateYear |
|-------|--------|--------|-----|---------------------|--------------|
| 34 | STU001 | UNV003 | 4.3 | 2022-06-03 00:00:00 | 2022 |