ORA-04088 and ORA-06512



使用此触发代码时:

CREATE TRIGGER Verify_deathDate 
BEFORE INSERT Or UPDATE of deathDate, birthDate on Actor 
FOR EACH ROW 
BEGIN 
IF (:NEW.deathDate < :NEW.birthDate) THEN 
    Raise_application_error(-20000, 'birthDate should be before deathDate'); 
END IF; 
END; 
/ 

然后这个更新查询:

UPDATE Actor SET deathDate = '28-Dec-1937' , birthDate = '29-Dec-1938' 
WHERE actorID = '00069';

我得到以下代码(只有一个是正确的):

ORA-20000: birthDate should be before deathDate
ORA-06512: at "OPS$U0853885.CHECK_DEATHDATE", line 3
ORA-04088: error during execution of trigger 'OPS$xxxxxxxx.CHECK_DEATHDATE'

Oracle建议您仅在不能使用CHECK约束的情况下使用触发器来约束数据。由于这实际上是更简单的,您可能应该在这种情况下使用它;

CREATE TABLE Actor (
  id int, 
  name varchar(32), 
  birthdate date, 
  deathdate date, 
  CONSTRAINT birth_death CHECK (deathdate > birthdate)
);

这将在没有额外触发器的情况下强制执行您的业务规则。

在这里演示。

最新更新