从触发器调用多个函数?

VL-*_*-80 8 postgresql trigger plpgsql functions

我运行PostgreSQL-9.2.4

是否可以从触发器调用 2 个函数?

假设以下触发器触发时,我有两个函数可以执行两个不同的表:

扳机:

CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)

功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)

CREATE FUNCTION void_next_task() RETURNS trigger AS $$

BEGIN
  DELETE FROM tasks_status ts
  WHERE ts.system = NEW.system
  AND ts.event = 'next_task';
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

功能 2:( 如果插入的组合tasksystem已经出现在表中=> 将此组合标记为任何较早的记录deleted

CREATE FUNCTION void_dup_task() RETURNS trigger AS $$

BEGIN
  UPDATE system_status ss
  SET deleted = 'TRUE'
  WHERE ss.system = NEW.system
  AND ss.task = NEW.task
  AND ss.deleted IS FALSE;
  RETURN NEW;
  END;

$$

LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)

所以我最终采用了以下方法来解决它:

  1. 有一个调用两个函数的触发器;
  2. 具有对一个表执行更新并在另一个表上执行删除的函数;
  3. 有两个完全相同的触发器和两个不同的功能;

在我继续实施解决方案之前,3您能否建议我解决方案12是否可行?

Erw*_*ter 11

一个触发器只能调用一个tigger 函数,所以1不能

更可取的形式是第2项。IMO。您可以根据需要将任意数量的 SQL 语句放入单个 plpgsql 函数中。

3项也是可能的。好吧,不是完全相同的触发器,名称必须不同。同一个事件的触发器按字母顺序触发,顺便说一句。但我看不到两个独立功能的收益。只是更多的代码和开销以及两个更昂贵的函数调用。

2.是无可争议的胜利者。