ORA-04092:超过每天进行的应用程序数后,无法在触发器中回滚



我可以知道如何编写触发器,如果假设有申请人,职位,申请关系和申请就像协会类一样,因为申请人可以申请许多职位,而一个职位可以通过许多申请人申请,申请关系有自己的属性称为dateApp,我想将申请量限制为每天两次, 因此,这意味着客户一天只能申请 2 个项目。到目前为止,我有以下代码:

CREATE OR REPLACE TRIGGER APPLYTWICEONLY
AFTER INSERT ON APPLIES
DECLARE
CURSOR C IS
SELECT ANUMBER, COUNT(APPDATE) AS TOTAL
FROM APPLIES
WHERE APPDATE = TRUNC(SYSDATE)
GROUP BY ANUMBER;
BEGIN

FOR APPLY IN C
LOOP
IF APPLY.TOTAL > 2 THEN
DBMS_OUTPUT.PUT_LINE('AN APPLICANT CAN APPLY MAXIMUM TWICE A DAY.');
ROLLBACK;
END IF;
END LOOP;

END;
/

所以这里发生的事情是,在申请人申请职位后,我使用 ANUMBER 检查今天为每个申请人提出的申请总数,如果今天申请人的总申请数超过 2 个,那么我将回滚并撤消该插入。我想使用语句触发器而不是行触发器来执行此操作,但我不断收到 ORA-04092:在申请人超过当天的申请数量后,无法在触发器中回滚。有人可以帮助我吗?

不能在触发器中运行 COMMIT 或 ROLLBACK:

$ oerr ora 4092
04092, 00000, "cannot %s in a trigger"
// *Cause: A trigger attempted to commit or rollback.
// *Action: Rewrite the trigger so it does not commit or rollback.
$ 

通过数据库触发器强制实施业务逻辑通常是错误的方法。

您应该检查申请人在哪里申请职位,然后让它继续或停止申请流程。


至于触发器无法commitrollback;嗯,这并不完全正确。如果它(触发器(是一个自主事务,它可以。例如:

SQL> create or replace trigger trg_rlbk
2    after insert on test
3  declare
4    pragma autonomous_transaction;
5  begin
6    rollback;
7  end;
8  /
Trigger created.
SQL> insert into test (id) values (2);
1 row created.
SQL> select * From test;
ID NAME
---------- --------------------
2
SQL>

如您所见,主事务未回滚 -ID = 2已插入到表中。本来可以回滚的是触发器本身中包含的代码。在我的例子中,没有一个故意告诉你这样的编译指示对你想要做的事情没有帮助。

此外,你可以做某事并不意味着你应该做。

最新更新