sql - 触发功能 等级检查 PostgreSQL

标签 sql function postgresql triggers plpgsql

我用申请表创建了一个奖学金数据库

 applyid |  studid   |    gpa    | other |  sch_id  |    date    | sem | sy
---------+-----------+-----------+-------+----------+------------+-----+----
       1 | 2010-0000 | 1.5       |       |        1 |            |     |
       2 | 2010-0001 | 1.5       |       |        7 | 2014-03-13 |     |
       3 | 2010-0003 |           |       |        1 | 2014-03-13 |     |
       4 | 2010-0003 |           |       |        1 | 2014-03-13 |     |
       5 | 2010-0003 |           |       |        1 | 2014-03-13 |     |
    2308 | 2012-0004 | 1.5       |       |        1 | 2014-03-19 |     |
    4593 | 2012-0004 | 1.5       |       |        1 | 2014-03-19 |     |
    4596 | 2012-0004 | 1.5       |       |        1 | 2014-03-19 |     |
    4597 | 2012-0004 | 1.5       |       |        1 | 2014-03-19 |     |
(9 rows)

目前正在研究这个触发功能,检查特定学生的成绩是否为 INC、DRP、5.00。

CREATE FUNCTION fail_check() RETURNS TRIGGER AS $$
DECLARE
one RECORD;
two RECORD;

BEGIN

   SELECT * INTO one FROM grade, registration;

   IF (SELECT COUNT(g.grade)::int  
       FROM grade g
         INNER JOIN registration r ON r.grade_id = g.grade_id
       WHERE g.grade IN ('INC', 'DRP', '5.00')
     AND studid=new.studid) <= 1 
   THEN 
    SELECT studid, gpa, sch_name INTO two
        FROM apply WHERE studid=new.studid;

    INSERT INTO apply(studid, gpa, sch_name)
    VALUES (new.studid, new.gpa, new.sch_name);

   END IF;

  RETURN NEW;

END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fail
BEFORE INSERT ON apply
FOR EACH ROW
EXECUTE PROCEDURE fail_check();

但是当我输入这个时:

INSERT INTO apply(studid, gpa, sch_name) 
VALUES ('2012-0004', '1.5', 1);

学生 ID 为“2012-0004”的学生的成绩为 INC DRP 和 5.00。 SELECT查询工作正常并返回值 3。由于 3 大于 1,这与 IF 相反声明 IF .... <= 1 ,我期待一个错误,说它不能被插入,因为“学生”在 INC、DRP、5.00 中有超过 1 级。

但是我得到了这个错误:

ERROR:  stack depth limit exceeded 
HINT:  Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. 
CONTEXT:  SQL statement "SELECT (SELECT COUNT(g.grade) 
       FROM grade g
         INNER JOIN registration r ON r.grade_id = g.grade_id
       WHERE g.grade IN ('INC', 'DRP', '5.00')   AND studid=new.studid) <= 1" PL/pgSQL function fail_check() line 12 at IF SQL statement "INSERT INTO apply(studid, gpa, sch_name)  VALUES (new.studid, new.gpa, new.sch_name)" PL/pgSQL function fail_check() line 21 at SQL statement SQL statement "INSERT INTO apply(studid, gpa, sch_name)     VALUES (new.studid, new.gpa, new.sch_name)"

我哪里错了??这个 max_stack_depth 到底是什么意思?我的代码的哪一部分导致了这个 max_stack_depth 错误??

目前使用 PostgreSQL 9.3.2

最佳答案

您的触发器 BEFORE INSERT 触发对同一个表的更多 INSERT,这会导致无限循环。因此堆栈溢出。您似乎觉得触发器中需要这个:

<strike>INSERT INTO apply(studid, gpa, sch_name)   
VALUES (new.studid, new.gpa, new.sch_name);</strike>

但你没有。 RETURN NEW; 足以让原来的 INSERT 通过。

触发器的其余部分似乎没有做任何有用的事情,但这可能只是一种简化。

关于sql - 触发功能 等级检查 PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507087/

相关文章:

jquery - 加载时出现客户端验证错误的 rails form_for

postgresql - 如何在 PostgreSQL 中获取给定日期的星期几?

php - Laravel SQLSTATE[23000] : Integrity constraint violation: 1452 Cannot add or update a child row

mysql - SQL根据某些条件将3个表中的数据合并到第4个表中

C++如何替换一个函数但仍然使用原来的函数?

Python Tkinter : Binding Same Key Twice?

php - 如何防止 PHP 中的 SQL 注入(inject)?

javascript - 如何在客户端浏览器中执行类似 SQL 的查询?

c# - aws Lambda 函数中的 Webresponse c#

java - 带有 postgresql 的串行列上的 Spring Data JPA "null value in column xxx violates not-null constraint"