
# 使用校验器和触发器
#### 什么是校验器和触发器
- [对象校验器]：在向对象中录入记录数据时，为了保证对象数据的有效性，可以定义一些校验规则，对字段值以及各字段之间的逻辑关系进行校验。例如，name字段不能为空，MinPrice字段不能大于maxPrice字段等。
- [对象触发器]：与数据库中的触发器类似，可以为对象定义触发器。在增/删/改对象的记录数据时，自动触发自定义的TypeScript脚本执行。脚本的执行结果将会影响主操作（即增删改记录）的结果，系统保证主操作与触发器在一个事务中执行，要么都成功，要么都失败。
 
#### 为什么要用校验器和触发器
使用校验器主要是为了方便对字段做一些简单的规则限制，触发器主要是方便控制一个事务执行的动作。
 #### 为对象字段增加校验器（Validator）
1. 在对象配置页面，单击"验证规则"页签，再单击"新建"。 
   图1新建验证规则   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045744.png "点击放大")
   
   
2. 输入校验规则，单击"保存"。 
   图2编辑校验规则   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125041.png "点击放大")
   表1校验规则参数说明 
   | 参数     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|
   | 基本信息   | - 标签：新建校验规则的标签名，用于展现在配置界面。  - 名称：新建校验规则的名称，单击后自动生成，与标签的值保持一致。  - 描述：新建校验规则的描述信息。                                                                                                                                                                                                                                                                  |
   | 错误条件公式 | 配置校验公式时，配置的是错误条件。例如，班级编号\>200，公式如下： ``` CNAME__number__CST<=200 ``` 规则由公式、字段、运算符组成： - 单击"字段"，可选择逻辑表达式中涉及的字段。  - 单击"操作符"，可选择表达式中的运算符。  - 单击"公式"后的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125033.png)，选择所需的公式，单击"插入"，即可在表达式中嵌入公式。   |
   | 错误消息   | 错误提示信息，可手动输入。 例如，班级编号小于等于200时，提示如下错误。 ``` The class number must be greater than 200 ```                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
      
   
   
3. 在校验规则列表中，单击新建校验规则后的启用开关，启用该条规则。 
   您也可以单击规则名称，在规则详情页单击"启用"，启用该条规则。
   图3启用校验规则   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284881.png "点击放大")
   
   
4. 验证规则是否正常。 
   在"布局"页签，单击Records所在操作列的查看图标，预览该页面。在预览页单击"添加"，插入一条191的"number"数据。如何使用布局，请参见[如何使用布局增删改查对象数据](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0037.html#astrozero_05_0037__section132771847111717)。
   图4报错校验器的错误   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045728.png "点击放大")
   
   
 
 #### 为对象配置内嵌触发器
AstroZero支持用户给对象增加内嵌触发器，实现在增/删/改对象的记录数据时，**自动执行**内嵌触发器脚本（该脚本由用户自定义，其实就是一段普通的TypeScript脚本，没有输入输出参数）。例如，在对象记录插入前、记录插入后、记录更新前、记录更新后、记录删除前或者记录删除后，自动执行内嵌触发器脚本。
下面以之前创建的对象"*CNAME* __Class__CST"为例，创建一个记录删除后的触发器，实现在删除一条"*CNAME* __Class__CST"对象的记录后，把相应的"name"、"*CNAME* __number__CST"数据记录到日志对象"*CNAME* __log__CST"中。在此需要提前创建如下的日志对象"CNAME__log__CST"，如何创建请参考上一节中对象"*CNAME*__Class__CST"的创建过程。
表2"*CNAME* __log__CST"对象的字段 
| 对象                | 字段来源       | 字段名称                      | 字段数据类型     |
|:---|:---|:---|:---|
| *CNAME*__log__CST | 自定义字段，手动创建 | *CNAME*__operator__CST    | 文本，数据长度36。 |
| *CNAME*__log__CST | 自定义字段，手动创建 | *CNAME*__className__CST   | 文本         |
| *CNAME*__log__CST | 自定义字段，手动创建 | *CNAME*__classNumber__CST | 数字，表示班级编号。 |
   
1. 在对象"*CNAME* __Class__CST"配置页面，单击"内嵌触发器"页签，再单击"新建"。
   
   图5新建内嵌触发器   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932886356.png "点击放大")
   
   
2. 输入触发器的基本信息，单击"保存"。 
   图6输入信息   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284857.png "点击放大")
   表3内嵌触发器参数说明 
   | 参数     | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|
   | 标签     | 内嵌触发器在用户界面展示的名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | 名称     | 内嵌触发器的名称，单击后默认自动生成，与"标签"值保持一致。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 事件触发时机 | 内嵌触发器在什么时候生效，可直接在下拉框中选择。即在系统执行如下某动作时，自动执行触发器的脚本： - 插入前：记录插入操作前触发。  - 修改前：记录更新操作前触发。  - 删除前：记录删除操作前触发。  - 插入后：记录插入操作后触发。  - 修改后：记录更新操作后触发。  - 删除后：记录删除操作后触发。   |
   | 描述     | 内嵌触发器的描述。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
      
   
   
3. 编写触发器的脚本，其中对象名称、字段名称和之前创建的保持一致。 
   对象的内嵌触发器脚本，其实就是一段普通的**TypeScript脚本** ，没有输入输出参数。在脚本中可以通过"***对象名*** **.*字段名*** "，来访问当前记录的具体字段值。针对"事件触发时机"为"修改前"或者"修改后"的触发器（即触发器脚本执行条件是对象记录更新前、记录更新后），脚本代码中通过**"*对象名* .*字段名*"** 获取到的都是当前记录的具体字段值，目前不支持获取更新前的记录值。
   ```
   //test_delete_trigger
   import * as db from 'db';
   import * as context from 'context';
   let name = CNAME__Class__CST.name;
   let CNAME__number__CST = CNAME__Class__CST.CNAME__number__CST;
   let logObj = db.dynamicObject('CNAME__log__CST');
   logObj.insert({
       "CNAME__operator__CST": context.getUserId(),
       "CNAME__className__CST": name,
       "CNAME__classNumber__CST": CNAME__number__CST,
   });
   ```
   ![](https://support.huaweicloud.com/usermanual-astrozero/public_sys-resources/note_3.0-zh-cn.png)
   关于脚本的更多说明，请参考[脚本开发](https://support.huaweicloud.com/usermanual-astrozero/astrozero_05_0044.html)。
   
   
4. 编辑后单击上方的![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045756.png)，进行保存。
5. 保存成功后，单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125061.png)，启用脚本。
   
   **启用后** 在内嵌触发器列表，可查看到当前触发器状态为"ON"，表示当触发条件满足时，AstroZero会**自动执行** 该触发器脚本。
   图7启用触发器   
   ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932886332.png "点击放大")
   
   
6. 验证触发器。 
   1. 在对象"CNAME__Class__CST"配置页面，单击"布局"页签，在"Class Records"后单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125025.png "点击放大")。
      "*对象名* Records"显示对象数据的记录列表。**预览该页面可增、删、改、查对象数据。**
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284837.png "点击放大")
      
   
   2. 在布局的预览页面，单击"添加"，新增并保存，增加数据，为下一步删除数据做准备。
      图8如何新增数据   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284865.png "点击放大") 
   
   3. 单击数据所在列的"删除"，删除数据。
      图9删除数据   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960284889.png "点击放大") 
   
   4. 在对象"CNAME__log__CST"配置页面，单击"布局"页签，在"log Records"后单击![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001960125049.png "点击放大")。
      图10预览Records页面   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001932886368.png "点击放大")
      查看到对象"CNAME__log__CST"数据列表中，已记录一条刚删除的"CNAME__Class__CST"数据，触发器生效。
      图11触发器脚本新增的一条数据   
      ![](https://support.huaweicloud.com/usermanual-astrozero/zh-cn_image_0000001933045700.png "点击放大") 
   
   
   
   
 
