У меня есть следующая таблица, и я хочу создать триггер, который позволяет вставлять значения, если значение ActualLeaveDate не равно нулю:
CREATE TABLE Bed
(
PatBedNum NUMBER GENERATED BY DEFAULT AS IDENTITY START WITH 1 INCREMENT BY 1,
WardNum NUMBER(4),
BedNum NUMBER(2),
PatNum VARCHAR2(6) CHECK (PatNum LIKE '%P%'),
DateOnWaitlist DATE,
ExpectedStayDuration VARCHAR2(8) CHECK (ExpectedStayDuration LIKE '% days%'),
DatePlacedInWard DATE,
ExpectedLeaveDate DATE,
ActualLeaveDate DATE,
CONSTRAINT BedPK PRIMARY KEY (PatBedNum),
CONSTRAINT PatBedNum FOREIGN KEY (PatNum)
REFERENCES Patient (PatNum) ON DELETE CASCADE,
CONSTRAINT PatWardNum FOREIGN KEY (WardNum)
REFERENCES Ward (WardNum) ON DELETE CASCADE
);
Я пытался создать триггер, используя следующую script:
CREATE TRIGGER BedCheck2
BEFORE INSERT ON BED
FOR EACH ROW
BEGIN
IF (:Old.ActualLeaveDate IS NOT NULL)
THEN
INSERT INTO Bed (PatBedNum, WardNum, BedNum, PatNum, DateOnWaitlist, ExpectedStayDuration, DatePlacedInWard, ExpectedLeaveDate, ActualLeaveDate)
VALUES (:New.PatBedNum, :New.WardNum, :New.BedNum, :New.PatNum, :New.DateOnWaitlist, :New.ExpectedStayDuration, :New.DatePlacedInWard, :New.ExpectedLeaveDate, :New.ActualLeaveDate);
ELSE
RAISE_APPLICATION_ERROR (-20002, 'Bed ' || :Old.BedNum || 'is not empty!');
END IF;
END;
/
Однако, когда я ввожу следующую команду вставки, она пропускает часть вставки триггера:
INSERT INTO BED VALUES (5, 11, 84, 'P10787', '12/1/20', '5 days', '17/1/20', '22/1/20', NULL);
Кроме того, она направляется прямо к RAISE_APPLICATION_ERROR, даже если данные в «ActualLeaveDate» в базе данных не равны NULL.
Я что-то здесь упускаю или делаю что-то не так?