触发以确保不会发生值

Trigger to ensure a value cannot happen

这是使用 Oracle SQL。 提前致歉,因为我是 SQL 世界的新手。

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

当前table使用DATE数据类型,插入为'DD-MMM-YYYY',但选择后显示为'DD-MMM-YY'(我不知道为什么。)

无论如何,我以前从来没有做过触发器,我试过两种方法,但它出了问题,因为当我在 SQL 上按 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,但无法正常工作。

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

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

I'm trying to create a simple trigger to ensure a sports event cannot happen in a certain month

[...]

The exercise that I'm trying to do this for specifically asks to create a trigger to ensure the event cannot happen in a certain month.

由于这是为了家庭作业/教育目的,这里先给出一些提示:

  1. 首先,正如 Mureink 在他的回答中所说,请记住 CHECK CONSTRAINT 是进行数据验证的首选方式;
  2. 然后,由于您需要使用触发器,因此您将同时需要一个 INSERT 触发器和一个 UPDATE 触发器;
  3. 因为要进行数据验证,所以需要一个BEFOREINSERT OR UPDATE触发器;
  4. 您将使用 NEW. 伪记录访问传入数据;
  5. 并且您将通过引发异常来拒绝 DML 语句。

您的代码中已有 (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;

未经测试。小心错别字!