【问题标题】:how to fix the end of procedure trigger error如何修复程序结束触发错误
【发布时间】:2012-12-07 07:24:59
【问题描述】:

有没有办法解决这个错误或者我的代码中缺少一些东西,我正在学习postgresql,我一直在研究table inheritance and triggers 我有两个表temporary_object tablepersons table个人表继承了临时对象的所有属性,然后我在个人表上创建了一个触发器函数,它检查具有相同id before updatingtables 的记录当我尝试运行insert query 时出现问题,我得到这些errors

ERROR: end of trigger procedure achieved without RETURN
CONTEXT: function PL / pgSQL muli_function ()

ERROR: end of trigger procedure achieved without RETURN
SQL-state: 2F005
Context: The PL / pgSQL muli_function ()

这是通过插入查询

INSERT INTO persons (id, time_create, time_dead, First_name, Last_name) values (1, '2011-10-07 15:25:00 EDT', '2011-10-07 3:25 PM EDT', 'sathiya', 'james');

这是我的触发函数并自行触发

CREATE FUNCTION muli_function() RETURNS trigger AS '
BEGIN
  IF tg_op = ''UPDATE'' THEN
     UPDATE persons
     SET time_dead = NEW.time_create
     Where
         id = NEW.id
         AND time_dead IS NULL
         ;
  RETURN new;
  END IF;
END
' LANGUAGE plpgsql;

CREATE TRIGGER sofgr BEFORE INSERT OR DELETE OR UPDATE
        ON persons FOR each ROW
        EXECUTE PROCEDURE muli_function();

这是我的两个表查询

CREATE TABLE temporary_object
(
  id integer NOT NULL,
  time_create timestamp without time zone NOT NULL,
  time_dead timestamp without time zone,
  PRIMARY KEY (id, time_create)
);

CREATE TABLE persons
(

  First_Name text,
  Last_Name text
)
INHERITS (temporary_object);

【问题讨论】:

  • muli_function 只关心 UPDATE 时,为什么要绑定 INSERT、DELETE 和 UPDATE?您可能想了解美元报价,这对于函数非常方便。
  • 对于触发了触发器的表,无需使用 UPDATE 语句。只需使用 new.time_dead := new.time_create 分配值

标签: database postgresql triggers plpgsql


【解决方案1】:

试试这个:

CREATE FUNCTION muli_function() RETURNS trigger AS '
BEGIN
  IF tg_op = ''UPDATE'' THEN
     UPDATE persons
     SET time_dead = NEW.time_create
     Where
         id = NEW.id
         AND time_dead IS NULL
         ;

  END IF;
  RETURN new;
END
' LANGUAGE plpgsql;

UPD 最好是这样的:

CREATE FUNCTION muli_function() RETURNS trigger AS '
BEGIN
  IF tg_op = ''UPDATE'' THEN
    IF NEW.time_dead IS NULL THEN
     NEW.time_dead = NEW.time_create
    END IF;      
  END IF;
  RETURN new;
END
' LANGUAGE plpgsql;

【讨论】:

  • 后一个查询做了完全不同的事情:它改变了 current 行中的time_dead,而不是第一个行。
  • @dezso 我假设 id 字段是一个 PK。 PK相等 -> 相同记录。
  • 乍一看我假设相同,但 OP 说:'在更新之前检查具有相同 id 的记录'
【解决方案2】:

您为INSERT OR UPDATE 触发器定义了触发过程,但没有为INSERT 提供案例(就像注释mu 太短一样),只有UPDATE。所以触发器执行INSERT的过程,然后它没有找到任何要执行的东西并没有RETURN就退出,这显然是一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2020-11-08
    • 2021-11-16
    • 2018-07-27
    • 2020-02-16
    • 1970-01-01
    • 2019-05-24
    • 2013-01-28
    相关资源
    最近更新 更多