0
CREATE OR REPLACE TRIGGER Guest_Change_In_WorkingHour
       BEFORE INSERT OR UPDATE OR DELETE ON guest
    BEGIN
       IF  TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) < 8 -- cant do anything before 8:00am
           OR TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) >= 5
              -- changes must be made BEFORE 5:00pm
            OR TO_CHAR(SYSDATE,'dy') in ('sun','sat') THEN -- nothing on weekends
    RAISE_APPLICATION_ERROR (-20000, 'Satff changes only allowed during business hours.');
    END IF;
   END;
   /

此触发器在工作时间(上午 8 点到下午 5 点)可以执行插入、删除和更新数据。对于我的问题是,当时间是凌晨 4 点时,仍然可以插入、删除和更新数据。我发现这个触发器忽略了 AM 和 PM。怎么解决?

4

1 回答 1

2

您正在使用时间格式HH24,即 24 小时制(我相信在美国是“军用”时间)。因此,您需要这样做:

TO_NUMBER(TO_CHAR(SYSDATE,'hh24')) >= 17

...而不是使用5.

但事实上,它应该随时引发错误,而不仅仅是在 08:00-17:00 范围之外(因为很少有数字同时 >= 8 和 < 5)。触发器是否真正编译?

此外,您还需要检查用于比较星期几的情况,因为我认为目前不匹配(更正 - 是的,使用dy);但依靠 NLS 敏感值进行比较并不理想。

于 2012-07-19T16:14:31.127 回答