触发以确保不会发生值

时间:2015-01-03 06:03:44

标签: sql oracle triggers

这是使用Oracle SQL。 因为我是SQL界的新手,所以请提前道歉。

我试图创建一个简单的触发器,以确保在某个月内不会发生体育赛事(我们将以12月为例)。因此,如果有人试图在12月插入一个日期为新的行,则触发器会阻止它。

当前表使用DATE数据类型,插入为' DD-MMM-YYYY'但是当它被选中时,它显示为' DD-MMM-YY' (我不知道为什么。)

无论如何,我之前从未制作过触发器,而且我已经尝试了两种方式,但是它有问题,因为当我在SQL Plus上按ENTER时,它就像我错过了一个分号一样继续前进。而且我猜测触发器本身不起作用。

CREATE OR REPLACE TRIGGER event_test
BEFORE INSERT OR UPDATE
ON sports_event
BEGIN
    IF DATE
        IS 'DEC' THEN
        'Sports cannot occur during December.';
    END IF;
END;

我也试过CASE而且我无法让它工作。

2 个答案:

答案 0 :(得分:1)

触发器并非真正用于数据验证。为什么不使用检查约束呢?

ALTER TABLE sports_event
ADD CONSTRAINT not_in_december_ck
CHECK (TO_CHAR(event_date, 'MM') != '12')

答案 1 :(得分:1)

  

我正在尝试创建一个简单的触发器,以确保在某个月内不会发生体育赛事

     

[...]

     

我正在尝试这样做的练习专门要求创建触发器以确保事件不会在某个月发生。

由于这是作业/教育目的,首先是一些提示:

  1. 首先,正如Mureink在答案中所说的那样,请记住CHECK CONSTRAINT是进行数据验证的首选方式;
  2. 然后,由于您需要使用触发器,因此需要INSERT触发器和UPDATE触发器;
  3. 由于您要进行数据验证,因此需要 BEFORE INSERT OR UPDATE触发器;
  4. 您将使用NEW.伪记录;
  5. 访问传入数据
  6. 您将通过提出异常来拒绝DML声明。

  7. 您的代码中已经有(2)和(3)。从那开始,一个完整的解决方案可能看起来像这样:

    CREATE OR REPLACE TRIGGER event_test
    BEFORE INSERT OR UPDATE
    ON sports_event
    FOR EACH ROW WHEN (EXTRACT(MONTH FROM NEW.event_date) = 12)
    BEGIN
        RAISE_APPLICATION_ERROR (
               num=> -20107,
               msg=> 'Sports cannot occur during December.');
    END;
    

    未测试。小心拼写错误!功能