【问题标题】:PostgreSQL Trigger with two function statements具有两个函数语句的 PostgreSQL 触发器
【发布时间】:2018-11-26 10:47:52
【问题描述】:

我正在尝试为 2 个不同的函数创建触发器,仅在条件上有所不同:

CREATE OR REPLACE FUNCTION seculoxxi()
    RETURNS integer AS $total1$
    declare
        total1 integer;
    BEGIN
       SELECT count(*) into total1 
       FROM edicao
       WHERE ano >= 2000;
       RETURN total1;
    END;
    $total1$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION seculoxx()
RETURNS integer AS $total2$
declare
    total2 integer;
BEGIN
   SELECT count(*) into total2 
   FROM edicao
   WHERE ano < 2000;
   RETURN total2;
END;
$total2$ LANGUAGE plpgsql;

表格的结构也很简单,一共有三行:

  1. 代码(数字)
  2. 版本(字符)
  3. 年份(整数)

如何创建此触发器?

【问题讨论】:

  • 我不明白。您希望在 what 事件上触发 what
  • 对不起,我需要创建一个触发器来添加表中的计数器。 @eurotrash

标签: sql postgresql database-trigger


【解决方案1】:

这完全是在黑暗中拍摄,但假设您要修改的字段称为“计数器”,那么我认为触发器可能如下所示:

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
DECLARE
  total integer;
BEGIN
  select count (*)
  into total
  from edicao e
  where
    (NEW.ano >= 2000 and e.ano >= 2000) or
    (NEW.ano < 2000 and e.ano < 2000);

  NEW.counter := total;

  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

然后将触发器添加到您的表中:

CREATE TRIGGER insert_edicao_trigger
  BEFORE INSERT
  ON edicao
  FOR EACH ROW
  EXECUTE PROCEDURE edicao_insert_trigger()

现在,当您进行插入时,它应该会自动添加“计数器”字段的值。

为了记录,如果你想获得一个唯一的 id,最好使用一个序列。

create sequence edicao_gt_2000;
create sequence edicao_lt_2000;

CREATE OR REPLACE FUNCTION edicao_insert_trigger()
  RETURNS trigger AS
$BODY$
BEGIN
  NEW.counter :=
    case
      when NEW.ano >= 2000 then nextval ('edicao_gt_2000')
      else nextval ('edicao_lt_2000')
    end;
  RETURN NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

【讨论】:

    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多