2012-07-19 221 views
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.00AM仍然可以插入,删除和更新数据。 我发现这个触发器忽略AM和PM。 如何解决?Oracle SQL(触发器)

回答

2

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

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

...而不是使用5。但事实上,它应该在任何时候提高误差,而不仅仅是在08:00-17:00范围之外(因为极少数数字都是> = 8和< 5)。触发器是否实际编译?

此外,你需要检查你用来比较星期几的情况,因为我认为此刻不会匹配(更正 - 是的,它将与dy一致)。但依靠NLS敏感值进行比较并不理想。

+0

我尝试它b4,改为17但问题仍然存在。 这一天无法匹配.. – 2012-07-19 16:26:54

+0

@LONGKIT - 我测试过了,用'17',这个触发器做了你想要的;你改变了别的吗?如果再次尝试它,现在只需要更改为'17',会发生什么情况? – 2012-07-19 16:34:19

+0

我改为17,然后我也将我的电脑时间更改为4.00Am,但仍可以更新记录。 – 2012-07-19 16:40:47