防止插入触发器

时间:2016-12-12 01:11:47

标签: oracle plsql database-trigger

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

<?php $args = array(
    'posts_per_page'   => 5,
    'offset'           => 0,
    'category'         => '',
    'category_name'    => '',
    'orderby'          => 'date',
    'order'            => 'DESC',
    'include'          => '',
    'exclude'          => '',
    'meta_key'         => '',
    'meta_value'       => '',
    'post_type'        => 'post',
    'post_mime_type'   => '',
    'post_parent'      => '',
    'author'       => '',
    'author_name'      => '',
    'post_status'      => 'publish',
    'suppress_filters' => true 
);
$posts_array = get_posts( $args ); ?>

2 个答案:

答案 0 :(得分:7)

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

alter table titles
    add constraint chk_titles_advance check (advance > 0 and advance <= 100);

答案 1 :(得分:7)

  

&#34;这是一个课堂问题。&#34;

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

这是一个问题。正确的方法是使用检查约束,Gordon's answer shows。约束更有效率,也是惯用语。但是你的老师要你写一个触发器,所以这是你的代码,更正了。

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;

注意事项:

  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. 学习使用缩进来使代码可读。你未来的同事会感谢你。