【问题标题】:CREATE TRIGGER AND TRIGGER FUNCTION WITH RECURSIVE AND IF STATEMENT使用递归和 IF 语句创建触发器和触发函数
【发布时间】:2020-03-23 06:38:41
【问题描述】:

我想在我的数据库中插入之前创建一个触发器。

触发函数检查一个条件。

  • 如果条件为真:
    • 不能插入
  • 其他:
    • CAN 插入

要检查我的状况,我需要RECURSIVITY,这就是我所做的:

CREATE OR REPLACE FUNCTION trigger_check_relation()
  RETURNS TRIGGER AS

$$BEGIN

    WITH RECURSIVE parent_list AS (

      SELECT relation.parent
      FROM relation
      WHERE relation.child = 9817

      UNION

      SELECT r.parent FROM relation r
        JOIN parent_list on parent_list.parent = r.child
    )
    SELECT name FROM component WHERE _id in (SELECT parent FROM parent_list);

    IF 9817 in (SELECT _id FROM component WHERE _id in (SELECT parent FROM parent_list))
        THEN RETURN OLD;
     ELSE 
        RETURN NEW;
     END IF;

END;$$ LANGUAGE plpgsql;

我可以创建触发器和函数,但是当我运行它时:

错误:查询没有结果数据的目的地提示:如果你想 丢弃 SELECT 的结果,改用 PERFORM。语境: PL/pgSQL 函数 trigger_check_relation() 第 3 行 SQL 语句 SQL 状态:42601

您能帮我理解并解决这个问题吗?

【问题讨论】:

    标签: postgresql if-statement plpgsql database-trigger recursive-query


    【解决方案1】:

    函数中有两个语句:第一个是“WITH RECURSIVE parent_list ... SELECT name FROM ...”,但它对结果没有任何作用,例如将其分配给变量。

    我认为您可能需要将 WITH 子句移到条件中:

    IF 9817 in (
      WITH RECURSIVE parent_list AS (
    
        SELECT relation.parent
        FROM relation
        WHERE relation.child = 9817
    
        UNION
    
        SELECT r.parent FROM relation r
          JOIN parent_list on parent_list.parent = r.child
      )
      SELECT _id FROM component
        WHERE _id in (SELECT parent FROM parent_list)
    )
    …
    

    【讨论】:

    • @alecxia ferric:很高兴能帮上忙!请单击复选标记,以便将问题标记为已回答,欢迎使用 Stack Overflow。
    猜你喜欢
    • 2020-11-23
    • 2013-08-24
    • 2016-12-20
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多