无法删除Postgresql中的行

无法删除Postgresql中的行,postgresql,Postgresql,我创建了一个小函数和小触发器。当我运行最简单的DELETE查询时,我在控制台中只看到一条通知和一条上下文消息(没有警告和错误消息),但这个DELETE查询仍然没有效果(记录保留在表中并且没有被删除)。函数和触发器如下所示: CREATE FUNCTION trigger_layers_before_del () RETURNS trigger AS $$ DECLARE table_name text := (SELECT concat ('layer_', OLD.id::text,

我创建了一个小函数和小触发器。当我运行最简单的
DELETE
查询时,我在控制台中只看到一条通知和一条上下文消息(没有警告和错误消息),但这个
DELETE
查询仍然没有效果(记录保留在表中并且没有被删除)。函数和触发器如下所示:

CREATE FUNCTION trigger_layers_before_del () RETURNS trigger 
AS $$
DECLARE
    table_name text := (SELECT concat ('layer_', OLD.id::text, '_'));
BEGIN 
    EXECUTE '
        DROP TABLE IF EXISTS ' || quote_ident(table_name) || ' CASCADE
    ';
    RETURN NULL;
END;
$$ LANGUAGE  plpgsql;

CREATE TRIGGER tr_layers_del_befor
BEFORE DELETE ON layers FOR EACH ROW
EXECUTE PROCEDURE trigger_layers_before_del();
下面是
DELETE
命令的样子:

DELETE FROM layers where id = 31
因此,如果我跑步:

DELETE FROM layers WHERE id = 31;
SELECT * FROM layers WHERE id = 31;
然后它返回一条id=31的记录


通知上说,“表”层不存在,跳过。上下文消息只打印
EXECUTE
语句。所以,如果没有错误,为什么不提交
DELETE
命令?

这是因为函数返回
NULL
。根据:

每行触发器调用的触发器函数可以返回表行 (HeapTuple类型的值)发送给调用执行器(如果他们选择)。A. 在操作具有以下选项之前激发的行级触发器:

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

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

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

所以,您需要的是
返回旧的