这是使用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而且我无法让它工作。
答案 0 :(得分:1)
触发器并非真正用于数据验证。为什么不使用检查约束呢?
ALTER TABLE sports_event
ADD CONSTRAINT not_in_december_ck
CHECK (TO_CHAR(event_date, 'MM') != '12')
答案 1 :(得分:1)
我正在尝试创建一个简单的触发器,以确保在某个月内不会发生体育赛事
[...]
我正在尝试这样做的练习专门要求创建触发器以确保事件不会在某个月发生。
由于这是作业/教育目的,首先是一些提示:
CHECK CONSTRAINT
是进行数据验证的首选方式; INSERT
触发器和UPDATE
触发器; BEFORE
INSERT OR UPDATE
触发器; NEW.
伪记录; 您的代码中已经有(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;
未测试。小心拼写错误!功能