# 44.6.PL/Tcl中的触发器函数
触发器函数可以用PL/Tcl编写。PostgreSQL要求作为触发器调用的函数必须声明为不带参数且返回类型为的函数触发
.
触发器管理器的信息通过以下变量传递给函数体:
$TG_name
来自触发器的触发器的名称创建触发器
陈述
$TG_relid
导致触发函数被调用的表的对象ID。
$TG_table_name
导致调用触发器函数的表的名称。
$TG_table_schema
导致调用触发器函数的表的架构。
$TG_relatts
表列名的Tcl列表,前缀为空列表元素。所以用Tcl的线性搜索
命令返回元素的编号,第一列从1开始,与PostgreSQL中的列编号方式相同。(空列表元素也会出现在已删除的列的位置,因此属性编号对于其右侧的列是正确的。)
$TG_何时
绳子之前
,之后
或而不是
,具体取决于触发事件的类型。
$TG_水平
绳子一行
或陈述
取决于触发事件的类型。
$TG_op
绳子插入
, 使现代化
, 删去
或截断
取决于触发事件的类型。
$NEW
包含新表行的值的关联数组插入
或使现代化
行动,或空为删去
。数组按列名编制索引。空的列不会出现在数组中。这不是为语句级触发器设置的。
$OLD
包含旧表行的值的关联数组使现代化
或删去
操作,或为空插入
。数组按列名编制索引。空的列不会出现在数组中。这不是为语句级触发器设置的。
$args
函数参数的Tcl列表,如创建触发器
陈述这些参数也可以作为$1
... $*
n*
在函数体中。
触发器函数的返回值可以是以下字符串之一好啊
或跳过
,或列名称/值对的列表。如果返回值为好啊
手术(插入
/使现代化
/删去
)触发触发器的操作将正常进行。跳过
告诉触发器管理器以静默方式抑制此行的操作。如果返回了一个列表,它会告诉PL/Tcl将修改后的行返回给触发器管理器;修改行的内容由列表中的列名和值指定。列表中未提及的任何列都设置为空。返回修改过的行仅对行级别有意义之前
插入
或使现代化
触发器,将为其插入修改后的行,而不是中给定的行$NEW
; 还是行级而不是
插入
或使现代化
触发器,其中返回的行用作插入返回
或更新返回
条款。在行级别之前
删去
或而不是
删去
触发器,返回修改过的行与返回好啊
,这就是手术的过程。对于所有其他类型的触发器,触发器返回值将被忽略。
# 提示
结果列表可以通过使用数组获取
Tcl命令。
下面是一个小示例触发器函数,它强制表中的整数值跟踪在行上执行的更新次数。对于插入的新行,该值初始化为0,然后在每次更新操作时递增。
CREATE FUNCTION trigfunc_modcount() RETURNS trigger AS $$
switch $TG_op {
INSERT {
set NEW($1) 0
}
UPDATE {
set NEW($1) $OLD($1)
incr NEW($1)
}
default {
return OK
}
}
return [array get NEW]
$$ LANGUAGE pltcl;
CREATE TABLE mytab (num integer, description text, modcnt integer);
CREATE TRIGGER trig_mytab_modcount BEFORE INSERT OR UPDATE ON mytab
FOR EACH ROW EXECUTE FUNCTION trigfunc_modcount('modcnt');
请注意,触发器函数本身不知道列名;这是由触发器参数提供的。这使得触发器函数可以在不同的表中重用。