当订单表出现时,我的任务是创建触发器以插入日志表
- 插入
- 更新
在星期五下午 5 点到星期一上午 9 点之间也将禁用插入/删除/更新。下面的解决方案涵盖了所有这些,但是因为它是一个前触发器,我不得不关闭完整性约束(这对日志表有影响吗?)
有没有人有任何建议我可以如何做到这一点并保持完整性约束(在 logono 列上)?
我正在考虑 11G 计算触发器,但在之前的答案中建议这不合适,加上向后兼容性的问题。
CREATE OR REPLACE TRIGGER log_order
BEFORE INSERT OR UPDATE OR DELETE ON orders
FOR EACH ROW
DECLARE out_of_hours EXCEPTION;
BEGIN
IF INSERTING THEN
IF
TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) BETWEEN 109 AND 517 THEN
insert into order_log values
(order_log_PK.nextval,
(select user from dual),
:NEW.ono,
(select SYSDATE from dual),
'Order Inserted' ) ;
ELSE
RAISE out_of_hours;
END IF;
END IF;
IF UPDATING THEN
IF
TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) BETWEEN 109 AND 517 THEN
insert into order_log values
(order_log_PK.nextval,
(select user from dual),
:NEW.ono,
(select SYSDATE from dual),
'order updated' ) ;
ELSE
RAISE out_of_hours;
END IF;
END IF;
IF DELETING THEN
IF
TO_NUMBER( TO_CHAR( SYSDATE, 'DHH24' ) ) BETWEEN 109 AND 517
THEN
RAISE out_of_hourS;
END IF;
END IF;
EXCEPTION
WHEN out_of_hours THEN
dbms_output.put_line('there is not privelages at this time');
RAISE_APPLICATION_ERROR(-20001, 'CANNOT UPDATE OUT OF HOURS');
END;
谢谢
编辑
完整性问题的出现是因为进入日志表的 :NEW.ono 值尚未插入到订单表中,因为这是一个前触发器,因此违反了 logono 外键。