Oracle触发器中的raise_application_error问题

时间:2014-07-10 11:44:26

标签: oracle triggers

CREATE OR REPLACE TRIGGER del_info
   BEFORE DELETE
   ON emp
   REFERENCING NEW AS new OLD AS old
   FOR EACH ROW
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
   IF :old.ename = 'GAU'
   THEN
      INSERT INTO audit_table (who, dated)
           VALUES (USER, TO_CHAR (SYSDATE, 'dd-mon-yyyy hh24:mi:ss'));

      COMMIT;
      raise_application_error (
         -20001,
         'You Are not authorized to delete this record');
   ELSE
      NULL;
   END IF;
END;

这里有一个问题。如果我使用where子句删除任何用户,它工作正常,但如果我从emp中解除像delete这样的查询,那么它会产生问题,即它不会删除任何记录。理想的行为应该是,它不应该删除单个recors(ename ='GAU'),其余的都应该被删除。请帮忙

1 个答案:

答案 0 :(得分:1)

您不能接受部分交易并在其他部分引发错误。

解决方法:Phoenix模式!

删除记录后,将其重新插入。

更好的方法:

  1. 撤销DELETE权利
  2. 编写一个程序来提供删除功能。该程序将始终排除“永久”记录。
  3. 授予用户执行该过程的权限
  4. 第3个解决方案:

    1. 写一个会排除“永久”记录的视图。您可以添加WITH CHECK OPTION以禁止插入另一个“永久”记录。
    2. 在该视图上授予用户DELETE
    3. 有关如何使用/不使用触发器的更多信息是here