我可以知道如何编写触发器,如果假设有申请人,职位,申请关系和申请就像协会类一样,因为申请人可以申请许多职位,而一个职位可以通过许多申请人申请,申请关系有自己的属性称为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.
$
通过数据库触发器强制实施业务逻辑通常是错误的方法。
您应该检查申请人在哪里申请职位,然后让它继续或停止申请流程。
至于触发器无法commit
或rollback
;嗯,这并不完全正确。如果它(触发器(是一个自主事务,它可以。例如:
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
已插入到表中。本来可以回滚的是触发器本身中包含的代码。在我的例子中,没有一个故意告诉你这样的编译指示对你想要做的事情没有帮助。
此外,你可以做某事并不意味着你应该做。