# 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');

请注意,触发器函数本身不知道列名;这是由触发器参数提供的。这使得触发器函数可以在不同的表中重用。