我想在Oracle SQLDeveloper上创建一个触发器。
如果成绩列中的数据低于4.0,即5.0/6.0(德国评分系统),则触发器应该只允许更改'考试'表中的'grade'列。
如果分数列中的数据是1.0/2.0/3.0/4.0,触发器应该拒绝修改。
所以触发器应该检查分数是低于还是高于4.0,并基于此,允许或拒绝对现有表数据的修改。
我的主要问题是,我不太了解Oracle SQL Developer的触发器创建语法。创建约束似乎很容易,但触发器让我困惑。
解决方案我正在努力工作:
CREATE OR REPLACE TRIGGER KlausurWiederholung
BEFORE UPDATE OF Note ON Prüfen
FOR EACH ROW
BEGIN
IF NEW.Note > OLD.Note THEN UPDATE Prüfen
END IF;
END
所以,如果有人能解释或链接一个有用的例子,如何正确地构建我的触发器,这将是非常感激的。
您想使用:OLD
和:NEW
来引用更新前后的行记录,如果更新无效,那么您想引发异常(并且您需要;
作为最终END
的语句终止符,并在新行上终止/
的PL/SQL块):
CREATE OR REPLACE TRIGGER KlausurWiederholung
BEFORE UPDATE OF Note ON Prüfen
FOR EACH ROW
BEGIN
IF :OLD.Note <= 4.0 THEN
RAISE_APPLICATION_ERROR(-20000, 'Grade too high to update.');
END IF;
END;
/
然后,对于样本数据:
CREATE TABLE Prüfen (id, note) AS
SELECT 1, 1 FROM DUAL UNION ALL
SELECT 2, 1.2 FROM DUAL UNION ALL
SELECT 3, 2 FROM DUAL UNION ALL
SELECT 4, 2.5 FROM DUAL UNION ALL
SELECT 5, 3 FROM DUAL UNION ALL
SELECT 6, 4 FROM DUAL UNION ALL
SELECT 7, 4.4 FROM DUAL UNION ALL
SELECT 8, 5 FROM DUAL UNION ALL
SELECT 9, 5.7 FROM DUAL UNION ALL
SELECT 10, 6 FROM DUAL UNION ALL
SELECT 11, 6.3 FROM DUAL;
:
UPDATE Prüfen
SET note = 1
WHERE id = 2;
给出异常:
ORA-20000: Grade too high to update. ORA-06512: at "FIDDLE_DPBZKTZLAVYIZCPLKBSE.KLAUSURWIEDERHOLUNG", line 3 ORA-04088: error during execution of trigger 'FIDDLE_DPBZKTZLAVYIZCPLKBSE.KLAUSURWIEDERHOLUNG'
但:
UPDATE Prüfen
SET note = note + 4
WHERE note > 4;
。
小提琴