Oracle SQL Developer中创建成绩修改限制触发器的技术求助
Oracle触发器实现成绩修改限制方案
你的需求是仅允许当原有成绩(OLD.Note)低于4.0时修改Note列,原有成绩为1.0、2.0、3.0、4.0时拒绝修改。先指出你现有代码的问题:
- 行级触发器中不需要再执行
UPDATE Prüfen语句,NEW和OLD已经代表当前被修改行的新、旧值,直接通过条件判断控制修改即可 - 你的逻辑方向错误,应该针对不允许修改的情况抛出异常,而非允许修改时执行额外操作
正确的触发器代码
CREATE OR REPLACE TRIGGER KlausurWiederholung BEFORE UPDATE OF Note ON Prüfen FOR EACH ROW BEGIN -- 当原有成绩为1.0/2.0/3.0/4.0时,拒绝修改操作 IF OLD.Note IN (1.0, 2.0, 3.0, 4.0) THEN RAISE_APPLICATION_ERROR(-20001, '原有成绩为1.0-4.0时,不允许修改成绩'); END IF; END; /
触发器结构拆解
CREATE OR REPLACE TRIGGER KlausurWiederholung:创建或替换名为KlausurWiederholung的触发器(如果触发器已存在则覆盖)BEFORE UPDATE OF Note ON Prüfen:指定触发时机为Prüfen表的Note列被更新之前,仅当Note列被修改时才触发FOR EACH ROW:行级触发器,每一行被修改时都会执行逻辑(区别于只执行一次的表级触发器)BEGIN ... END:触发器的核心逻辑块RAISE_APPLICATION_ERROR(-20001, '提示信息'):抛出自定义异常,-20000到-20999是Oracle预留的自定义错误码,触发后会终止当前更新操作,并返回指定的错误提示
可选扩展逻辑
如果需要同时限制新成绩符合德国评分体系(比如补考成绩不能比原有成绩更差),可以在触发器中追加判断:
CREATE OR REPLACE TRIGGER KlausurWiederholung BEFORE UPDATE OF Note ON Prüfen FOR EACH ROW BEGIN -- 拒绝原有成绩为1.0-4.0的修改请求 IF OLD.Note IN (1.0, 2.0, 3.0, 4.0) THEN RAISE_APPLICATION_ERROR(-20001, '原有成绩为1.0-4.0时,不允许修改成绩'); END IF; -- 限制新成绩必须是德国评分体系有效值,且不能比原有成绩更差 IF NEW.Note NOT IN (1.0, 1.3, 1.7, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0, 5.0, 6.0) OR NEW.Note > OLD.Note THEN RAISE_APPLICATION_ERROR(-20002, '新成绩不符合德国评分体系,或比原有成绩更差'); END IF; END; /
内容的提问来源于stack exchange,提问作者Alexy
相关产品推荐
相关产品推荐

