【发布时间】:2012-05-17 20:39:16
【问题描述】:
我的任务是创建触发器以在订单表存在时插入到日志表中
- 插入
- 更新
还在周五下午 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 外键。
【问题讨论】:
-
您需要禁用哪些完整性约束?我不确定我是否遵循了这样做的必要性。
-
在将 :NEW.ono 插入日志表时,因为它是一个前触发器,所以在 order 表中还没有引用它,所以日志表中的 FK 导致了问题
标签: oracle plsql triggers oracle11g