在删除触发postgreSQL之前检查列值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在删除触发postgreSQL之前检查列值相关的知识,希望对你有一定的参考价值。

有人能告诉我如何在删除postgreSQL中的表之前检查特定的列值?

我目前的代码:

CREATE OR REPLACE FUNCTION f_tr_table_row_prohibit_delete() RETURNS TRIGGER AS 
$$
BEGIN
IF (OLD.table_state_code=0) THEN
    DELETE FROM mytable WHERE table_code=OLD.table_code;
ELSE
    RAISE EXCEPTION 'The deletion of a row is allowed only when table state code is 0!';
END IF;
END;
$$ 

CREATE TRIGGER tr_table_row_prohibit_delete 
BEFORE DELETE ON mytable 
FOR EACH ROW 
EXECUTE PROCEDURE f_tr_laua_rida_prohibit_delete();

LANGUAGE plpgsql SECURITY DEFINER STABLE
SET search_path = public, pg_temp;

我有一个名为mytable的表,其中包含列table_code和table_state_code。在删除之前,mytable我想检查table_state_code是否为0,如果没有,那么它不应该允许删除,如果它是什么,那么它应该删除该行。

使用我当前的代码,当table_state_code不为0时它正确地引发了异常但是当它出现时它会说:ERROR:DELETE不允许在非易失性函数中,而不是删除行。

提前致谢。

答案

BEFORE DELETE触发器中,您可以取消删除或让它发生。

  • 要取消删除,您可以return NULLRAISE EXCEPTION
  • 让删除继续return OLD

删除已经开始(因为它是BEFORE DELETE触发器)所以你不必执行DELETE FROM mytable WHERE table_code=OLD.table_code;

请参阅文档中的Overview of Trigger Behavior

以上是关于在删除触发postgreSQL之前检查列值的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 触发器

PostgreSQL 触发器

11.PostgreSQL 触发器

postgresql无法创建触发器

在 PostgreSQL 函数中,是不是可以检查列值是不是与给定参数值匹配?

PostgreSQL 创建触发器 Trigger