删除预防触发器不工作-postgresql

删除预防触发器不工作-postgresql,postgresql,triggers,Postgresql,Triggers,我为航班预订数据库创建了这个触发器,该触发器用于防止在使用delete sql语句时删除预订。我有两种状态。一个是“r”表示保留,另一个是“c”表示取消。我的任务是确保预订不能被删除,如果用户试图删除预订,就会引发异常,如我的示例触发器所示 我已经创建了这个触发器,它已成功执行,但当我通过删除状态为“r”的预订来测试它时,它会运行并显示“查询已成功返回:一行受影响…”,这不是我想要的。我希望它引发异常,而不是删除预订 CREATE FUNCTION prevent_deletion() RETU

我为航班预订数据库创建了这个触发器,该触发器用于防止在使用delete sql语句时删除预订。我有两种状态。一个是“r”表示保留,另一个是“c”表示取消。我的任务是确保预订不能被删除,如果用户试图删除预订,就会引发异常,如我的示例触发器所示

我已经创建了这个触发器,它已成功执行,但当我通过删除状态为“r”的预订来测试它时,它会运行并显示“查询已成功返回:一行受影响…”,这不是我想要的。我希望它引发异常,而不是删除预订

CREATE FUNCTION prevent_deletion() RETURNS trigger AS $prevent_deletion$

        BEGIN            
            IF 'status' = 'r' THEN
                RAISE EXCEPTION 'You cannot delete reserved bookings';
            END IF;
            RETURN NEW;

        END;
    $prevent_deletion$ LANGUAGE plpgsql;

    CREATE TRIGGER prevent_deletion AFTER DELETE ON flightbooking
        FOR EACH ROW EXECUTE PROCEDURE prevent_deletion();
这一行:

IF 'status' = 'r' THEN
…将字符串
'status'
与字符串
'r'
进行比较(当然,它们永远不会相等……)

将字段
status
与字符串
'r'
进行比较如下:

IF OLD.status = 'r' THEN
这一行:

IF 'status' = 'r' THEN
…将字符串
'status'
与字符串
'r'
进行比较(当然,它们永远不会相等……)

将字段
status
与字符串
'r'
进行比较如下:

IF OLD.status = 'r' THEN

在删除之前需要一个
触发器。@J.Doe:在
触发器之前的
中,如果返回
NULL
,触发操作将中止,并且在您的情况下
NEW
NULL
(没有
删除
的“新”记录)。请尝试
返回旧的
。在删除
触发器之前,您需要一个
。@J.Doe:在
触发器之前的
中,如果您返回
NULL
新的
在您的情况下是
NULL
(没有
删除
的“新”记录),则触发操作将中止。请尝试返回旧的