Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 删除前应该返回什么触发器_Postgresql_Database Trigger - Fatal编程技术网

Postgresql 删除前应该返回什么触发器

Postgresql 删除前应该返回什么触发器,postgresql,database-trigger,Postgresql,Database Trigger,我试图创建简单触发器函数(Postgresql),但在所有这些情况下(仅简单示例),我都会遇到相同的错误“函数未返回任何行”: 新的: 旧的: 调用此函数“删除前”时应返回什么?(“插入/更新后”效果良好) Tyvm的提示 要求的完整代码: 功能: CREATE OR REPLACE FUNCTION pictogram_frequency_on_delete() RETURNS trigger AS $BODY$ DECLARE new_frequency RECORD; target_un

我试图创建简单触发器函数(Postgresql),但在所有这些情况下(仅简单示例),我都会遇到相同的错误“函数未返回任何行”:

新的:

旧的:

调用此函数“删除前”时应返回什么?(“插入/更新后”效果良好)

Tyvm的提示

要求的完整代码: 功能:

CREATE OR REPLACE FUNCTION pictogram_frequency_on_delete()
RETURNS trigger AS
$BODY$
DECLARE

new_frequency RECORD;
target_unit RECORD;
current_row RECORD;
units_with_same_type RECORD;
what RECORD; 

BEGIN
SET search_path TO 'myScheme';

CASE TG_OP
WHEN 'DELETED' THEN what := OLD;
ELSE what:= OLD;
END CASE;

SELECT unit_type_uid INTO STRICT target_unit 
FROM unit 
WHERE unit_uid = what.unit_uid;

SELECT count(*) AS exists INTO STRICT current_row 
FROM unit_type_pictogram utp 
WHERE utp.pictogram_uid = what.pictogram_uid 
AND utp.unit_type_uid = target_unit.unit_type_uid;

IF (current_row.exists = 0) THEN
    RETURN what; /* return new/old doesnt work too */
END IF;

UPDATE unit_type_pictogram utp 
SET frequency = frequency - 1
WHERE utp.pictogram_uid = what.pictogram_uid 
AND utp.unit_type_uid = target_unit.unit_type_uid;

RETURN what; /* return new/old doesnt work too */

END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
触发:

CREATE TRIGGER on_delete_frequency
BEFORE DELETE
ON unit_pictogram
FOR EACH ROW
  EXECUTE PROCEDURE pictogram_frequency_on_delete();

你应该
返回旧的

您的函数必须定义为从以下位置返回触发器:

每语句触发器调用的触发器函数应始终 返回NULL。每行触发器调用的触发器函数可以返回 调用执行器的表行(HeapTuple类型的值),如果 他们选择。在操作具有 以下选择:

  • 它可以返回NULL以跳过当前行的操作。这将指示执行器不执行 调用触发器(插入、修改或删除 特定表行)

  • 仅对于行级别的INSERT和UPDATE触发器,返回的行将成为要插入的行或将替换要插入的行 更新。这允许trigger函数修改正在处理的行 插入或更新

触发器前的行级别,不打算导致 这些行为必须小心,以作为其结果返回同一行 传入的(即插入和更新的新行) 触发器,删除触发器的旧行)


编辑 试着这样做:

CREATE OR REPLACE FUNCTION pictogram_frequency_on_delete()
RETURNS trigger AS
$BODY$
BEGIN
  UPDATE unit_type_pictogram AS utp
    SET frequency = frequency - 1
    FROM unit
    WHERE utp.pictogram_uid = OLD.pictogram_uid
      AND unit_uid = OLD.unit_uid
      AND utp.unit_type_uid = unit.unit_type_uid;
  RETURN OLD;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;

请完整邮寄code@JGH发布完整代码我正在使用“returnold”,但调试器返回错误“function未返回任何行”。“必须定义为返回触发器”是什么意思?是的,它说“删除触发器的旧行”,但它为我们显示整个函数返回错误。这不是一个函数,只是一个PL/PgSQL块。。。还向我们展示了
CREATE TRIGGER
语句。它现在也在那里,你知道如果错了怎么办吗?删除或更新后的所有我的触发器都可以正常工作。您使用的调试器是什么?
CREATE TRIGGER on_delete_frequency
BEFORE DELETE
ON unit_pictogram
FOR EACH ROW
  EXECUTE PROCEDURE pictogram_frequency_on_delete();
CREATE OR REPLACE FUNCTION pictogram_frequency_on_delete()
RETURNS trigger AS
$BODY$
BEGIN
  UPDATE unit_type_pictogram AS utp
    SET frequency = frequency - 1
    FROM unit
    WHERE utp.pictogram_uid = OLD.pictogram_uid
      AND unit_uid = OLD.unit_uid
      AND utp.unit_type_uid = unit.unit_type_uid;
  RETURN OLD;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;