Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle触发器中引发应用程序错误问题_Oracle_Triggers - Fatal编程技术网

在Oracle触发器中引发应用程序错误问题

在Oracle触发器中引发应用程序错误问题,oracle,triggers,Oracle,Triggers,这里有个问题。如果我使用where子句删除任何用户,它都可以正常工作,但如果我从emp中触发类似delete的查询,那么它就会出现问题,即它不会删除任何记录。理想的行为应该是,它不应该删除单个记录(ename='GAU'),其余的都应该删除。请帮助您不能接受部分交易并在另一部分引发错误 解决方法:凤凰模式 删除记录后,将其重新插入 更好的解释: 撤销删除权限 编写一个过程以提供删除功能。该程序将始终排除“永久”记录 授予用户执行该过程的权限 第三种解决方案: 编写一个排除“永久”记录的视图。您可

这里有个问题。如果我使用where子句删除任何用户,它都可以正常工作,但如果我从emp中触发类似delete的查询,那么它就会出现问题,即它不会删除任何记录。理想的行为应该是,它不应该删除单个记录(ename='GAU'),其余的都应该删除。请帮助

您不能接受部分交易并在另一部分引发错误

解决方法:凤凰模式

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

更好的解释:

  • 撤销删除权限
  • 编写一个过程以提供删除功能。该程序将始终排除“永久”记录
  • 授予用户执行该过程的权限
  • 第三种解决方案:

  • 编写一个排除“永久”记录的视图。您可以添加复选选项,以禁止插入另一个“永久”记录
  • 授予用户在该视图上的删除权限

  • 关于如何使用/不使用触发器的更多信息是

    ,正如vav所说,从原始的删除查询中省略该记录。可以通过禁止直接删除(例如过程)或将表隐藏在视图后面来实现。另一种方法是使用VPD来阻止delete语句查看记录。我不允许使用view,因为应用程序前端多次引用该表。问题是,有一个特定的用户在随机场合被神秘地删除。因此,需要创建一个触发器:1。限制特定行的删除2。无论何时尝试删除,都将时间和用户详细信息保存在审核表中,仅保留在该特定记录上。所有其他表记录应单独保留(不受任何删除限制)。但当我使用“从表中删除”语法时,这个触发器会出现问题。您可以重命名表并使用tablename创建视图。这对应用程序来说是透明的。您可以使用audit plus“phoenix模式”,只是在这种情况下不要引发异常。
    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;