PSQL:触发功能的目的

时间:2013-02-12 23:52:52

标签: postgresql-9.1 psql

触发功能如何与常规'不同?功能?创建触发器是否绝对必要?

例如,在这种情况下:

-- Trigger function
CREATE FUNCTION update_record_trigger_function() RETURNS trigger
LANGUAGE plpgsql
AS $update_record_trigger_function$
BEGIN
  PERFORM update_record(NEW.oid); -- helper function ... 
  RETURN NEW;
END
$update_record_trigger_function$;

-- Trigger for updating latest clicks for posts
CREATE TRIGGER update_latest_record
AFTER INSERT OR UPDATE ON record
FOR EACH ROW
EXECUTE PROCEDURE update_record_trigger_function();

(或者是否有可能)更简单:

-- Trigger for updating latest clicks for posts
CREATE TRIGGER update_latest_record
AFTER INSERT OR UPDATE ON record
FOR EACH ROW
PERFORM update_record(NEW.oid); -- syntactically not right but along this idea

我无法找到任何包含“跳过触发功能”的示例的文档。或解释触发器功能如何特殊且必要的触发器?

1 个答案:

答案 0 :(得分:2)

PostgreSQL将“触发器功能”与触发器定义分开,原因有很多:

  • 触发器函数可以编写为可以在许多不同表上工作的通用函数,因此您可以将相同的触发器函数作为触发器添加到许多不同的表中。这样可以简化维护。

  • 触发器函数可以采用允许它们适应特定列名称或您应用它们的表的其他特征的参数。这使得编写通用的,可重用的触发器函数变得切实可行,否则您将无法在多个位置重复代码。请参阅EXECUTE ... USINGformat函数及其%L%I格式说明符。

  • PostgreSQL非常难以理解您的函数编写的编程语言。它们可以是PL / PgSQL,Python,Perl,C或MyWackyPluginLanguage。如果它没有将触发器功能与触发器定义分开,那么这将更难实现。

PostgreSQL不支持您描述的简写,尽管其他一些数据库系统提供的内容非常类似于您所显示的内容。您基本上希望能够将触发器函数定义为内联表达式。这不受支持。从来没有迫切需要它,所以没有人实现它。

如果将来添加了这样的功能 - 而且我不知道有任何计划 - 可能会使用上下文解释为触发器的PL / PgSQL DO块来完成喜欢(不是合法语法):

CREATE TRIGGER update_latest_record
AFTER INSERT OR UPDATE ON record
FOR EACH ROW DO $$ PERFORM update_record(NEW.oid); RETURN NEW; $$;

这样解析器就不需要理解PL / PgSQL构造了,我们只需要教它理解FOR EACH ROW DO [string literal body of function]作为FOR EACH ROW EXECUTE PROCEDURE proc_name(args)的替代,然后调用PL / PgSQL子系统处理触发器文字。

在实践中,Pg可能只会生成一个普通的触发器函数,并从触发器添加对它的引用,因此如果触发器被删除它就会被删除,这使得它只是一个方便的宏,就像SERIAL是一个方便的宏对于INTEGER字段,DEFAULT nextval(...)字段和SEQUENCE字段所拥有的SERIAL字段所拥有的pg_dump字段。特别是,{{1}}可能会输出它,就像你定义了一个单独的触发函数和触发器,而不是使用速记。

老实说,我怀疑任何类似的东西都会被添加,但是如果你能够提供足够令人信服的用例,那么可能如果你真的很幸运,那么就会有兴趣。如果您愿意在资金支持下实施该功能所需的时间,那么您很可能只能通过这样的提议(“允许DO块用作触发程序”)到达任何地方。