sql >> Base de Datos >  >> RDS >> Oracle

Uso de un disparador para implementar una restricción de verificación de clave externa

Presumiblemente, la fecha de la carrera debe estar entre la fecha de inicio y finalización de la reunión, por lo que podría verificar ambas a la vez; y también, presumiblemente, desea verificar esto en busca de nuevos registros, no solo actualizaciones. Así que podrías usar algo como:

CREATE OR REPLACE TRIGGER RaceDateCheck
BEFORE INSERT OR UPDATE ON Race
FOR EACH ROW
DECLARE
  meetingStart Meeting.MeetingStartDate%TYPE;
  meetingEnd Meeting.MeetingEndDate%TYPE;
BEGIN
  SELECT StartDate, EndDate
  INTO meetingStart, meetingEnd
  FROM Meeting
  WHERE MeetingID = :NEW.MeetingID;

  IF :NEW.RaceDate < meetingStart
    OR :NEW.RaceDate > meetingEnd THEN
      RAISE_APPLICATION_ERROR(-20001, 'Invalid race date');
  END IF;
END;

Solo para la fecha de finalización:

CREATE OR REPLACE TRIGGER RaceDateCheck
BEFORE INSERT OR UPDATE ON Race
FOR EACH ROW
DECLARE
  meetingEnd Meeting.MeetingEndDate%TYPE;
BEGIN
  SELECT EndDate
  INTO meetingEnd
  FROM Meeting
  WHERE MeetingID = :NEW.MeetingID;

  IF :NEW.RaceDate > meetingEnd THEN
    RAISE_APPLICATION_ERROR(-20001, 'Invalid race date');
  END IF;
END;