INSERT、UPDATE 与 DELETE 的规则 #针对数据修改命令定义的规则,其执行时机会在原始语句派生的查询树上生效。规则支持两种模式:
DO INSTEAD:完全拦截并替换原始命令,使原始语句本身不再向目标关系写入任何数据,转而只执行规则内部声明的一条或多条替代 SQL 语句。
DO ALSO:在原始命令正常执行写入的同时,额外派生并发起一条附加的 SQL 命令(例如在向订单表写入时,通过规则同时向审计流水表中写入备份副本)。
在规则定义内部,可以使用特殊的伪关系 NEW 引用待写入的新数据行,使用 OLD 引用被更新或删除的存量行。
当为带有数据修改的命令定义规则时,规划器会先根据原始命令生成查询树,随后触发规则系统。
如果一条规则声明为 DO INSTEAD,原始命令的查询树会被丢弃,规则中声明的动作查询树将取而代之;如果声明为 DO ALSO,原始命令与规则动作会同时生成并在同一事务中依次执行。
通过编写以视图为目标关系的更新规则,并在规则的动作体中使用底层实际基表,可以将外部对视图逻辑列的修改透明映射为底层一张或多张物理基表的更新操作。