我用申请表创建了一个奖学金数据库
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/