防止插入触发器

Ann*_*il8 3 oracle plsql database-trigger

如何获得此触发器以防止前进不大于0或小于100的插入?谢谢.

DROP TRIGGER CheckAdvance;
CREATE OR REPLACE TRIGGER CheckAdvance
BEFORE INSERT OR UPDATE OF advance ON titles
FOR EACH ROW
WHEN (new.advance<0 OR new.advance>100)
BEGIN
dbms_output.put_line('Advance is Invalid.');
END;
Run Code Online (Sandbox Code Playgroud)

APC*_*APC 9

"这是一个课堂问题."

我在一次会议上发表演讲后,与一位教授PL/SQL的大学讲师聊天.我的演讲是关于PL/SQL的良好实践; 我的一张幻灯片简单地说"不要使用触发器".讲师告诉我,他发现这些建议难以与课程的需求相协调.他们必须向学生传授所有的语法,但他承认,他们经常设置任务,这些任务需要在专业编写软件时不会使用的解决方案.

这是一个问题.正如戈登的回答所示,正确的方法是使用检查约束.约束更有效率,也是惯用语.但是你的老师要你写一个触发器,所以这是你的代码,更正了.

CREATE OR REPLACE TRIGGER CheckAdvance
    BEFORE INSERT OR UPDATE OF advance ON titles
    FOR EACH ROW
BEGIN
    IF (:new.advance < 0  
         OR :new.advance > 100)
    THEN
        raise_application_error(-20000
                , 'Advance cannot be less than zero or greater than one hundred.');
    END IF;
END;
Run Code Online (Sandbox Code Playgroud)

注意事项:

  1. CREATE OR REPLACE意味着我们可以在没有初步DROP语句的情况下更改触发器代码.
  2. BEGIN和END帧代码块,例如触发器主体.
  3. 静态条件框架为IF ... END IF关键字; WHEN用于退出循环结构.
  4. 引用表列值包含:NEW(和:OLD)关键字 - 记下冒号.
  5. 使用RAISE_APPLICATION_ERROR抛出异常; 错误号必须在-20999到-20000的范围内,Oracle会为用户定义的异常保留.
  6. 使您的错误消息有意义:告诉您的用户他们做错了什么,而不是让他们猜测.
  7. 学习使用缩进来使代码可读.你未来的同事会感谢你.


Gor*_*off 7

你不应该使用触发器.Oracle(以及一般的SQL)支持检查约束:

alter table titles
    add constraint chk_titles_advance check (advance > 0 and advance <= 100);
Run Code Online (Sandbox Code Playgroud)