Postgresql 删除前应该返回什么触发器
我试图创建简单触发器函数(Postgresql),但在所有这些情况下(仅简单示例),我都会遇到相同的错误“函数未返回任何行”: 新的: 旧的: 调用此函数“删除前”时应返回什么?(“插入/更新后”效果良好) Tyvm的提示 要求的完整代码: 功能: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
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;