在Oracle触发器中引发应用程序错误问题
这里有个问题。如果我使用where子句删除任何用户,它都可以正常工作,但如果我从emp中触发类似delete的查询,那么它就会出现问题,即它不会删除任何记录。理想的行为应该是,它不应该删除单个记录(ename='GAU'),其余的都应该删除。请帮助您不能接受部分交易并在另一部分引发错误 解决方法:凤凰模式 删除记录后,将其重新插入 更好的解释:在Oracle触发器中引发应用程序错误问题,oracle,triggers,Oracle,Triggers,这里有个问题。如果我使用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;