|
Chapter 20. 触发器PostgreSQL 拥有服务器端函数接口. 服务器端函数可以用 SQL,PLPGSQL,TCL,或者C写. 触发器函数可以用除SQL以外的任何这些语言书写. 要注意当前版本还不支持语句级(STATEMENT-level)的触发器事件. 目前你可以在 INSERT, DELETE 或 UPDATE 一条元组上声明 BEFORE 或 AFTER (之前或之后)作为触发器事件. 20.1. 创建触发器如果发生了触发器事件,触发器管理器(由执行器调用)初始化 信息结构 TriggerData (下面描述)并调用触发器函数来操作事件. 触发器函数必须在创建触发器之前,作为一个没有参数并且返回 opaque 的函数定义. 如果你用C写这个函数,它必须使用 "版本 1" 的函数管理器接口. 创建触发器的语法如下: CREATE TRIGGER trigger [ BEFORE | AFTER ] [ INSERT | DELETE | UPDATE [ OR ... ] ] ON relation FOR EACH [ ROW | STATEMENT ] EXECUTE PROCEDURE procedure ( args ); 这里的参数是:
触发器函数返回 HeapTuple 给调用它的执行器. 这个返回在那些在 INSERT,DELETE 或 UPDATE 操作之后 执行的触发器上被忽略,但它允许那些 BEFORE 触发器用来:
注意,CREATE TRIGGER 句柄将不进行任何初始化工作. 这一点将在以后进行修改.同样, 如果多于一个触发器为同样的事件定义在同样的关系上, 触发器触发的顺序将不可预料.这一点以后也会修改. 如果一个触发器函数执行 SQL-查询(使用 SPI) 那么这些查询可能再次触发触发器. 这就是所谓的嵌套触发器.对嵌套触发器的嵌套深度没有明确的限制. 如果一个触发器是被 INSERT 触发并且插入一个新行到同一关系中, 然后该触发器将被再次触发.目前对这种情况没有提供任何同步(等)的措施, 这一点也可能会修改. 目前,回归测试里有一个函数 funny_dup17() 使用了一些技巧避 免对自身的递归(嵌套)调用... |