sql >> Database teknologi >  >> RDS >> Oracle

KONTROLLER begrænsning på fødselsdato?

Check-begrænsninger skal være deterministiske. Det vil sige, at en bestemt række altid skal opfylde begrænsningen, eller den skal altid undlade at opfylde begrænsningen. Men SYSDATE er i sagens natur ikke-deterministisk, da den returnerede værdi konstant ændrer sig. Du kan således ikke definere en CHECK begrænsning, der kalder SYSDATE eller enhver anden brugerdefineret funktion.

Hvis du prøver at henvise til SYSDATE i begrænsningsdefinitionen får du en fejl

SQL> ed
Wrote file afiedt.buf

  1  create table t(
  2      birth_date date check( birth_date between date '1900-01-01' and
  3                                                sysdate )
  4* )
SQL> /
                                              sysdate )
                                              *
ERROR at line 3:
ORA-02436: date or system variable wrongly specified in CHECK constraint

Du kan oprette en CHECK begrænsning, hvor både minimums- og maksimumsdatoen var hårdkodet, men det ville ikke være særlig praktisk, da du konstant skulle slippe og genskabe begrænsningen.

SQL> ed
Wrote file afiedt.buf

  1   create table t(
  2       birth_date date check( birth_date between date '1900-01-01' and
  3                                                 date '2011-12-08' )
  4*  )
SQL> /

Table created.

Den praktiske måde at håndhæve denne form for krav på ville være at skabe en trigger på bordet

CREATE OR REPLACE TRIGGER check_birth_date
  BEFORE INSERT OR UPDATE ON employee
  FOR EACH ROW
BEGIN
  IF( :new.emp_dob < date '1900-01-01' or 
      :new.emp_dob > sysdate )
  THEN
    RAISE_APPLICATION_ERROR( 
      -20001, 
      'EMployee date of birth must be later than Jan 1, 1900 and earlier than today' );
  END IF;
END;


  1. SQL Server trunkering og 8192 begrænsning

  2. Sådan finder du duplikerede poster i MySQL

  3. Installer PostgreSQL på Ubuntu 20.04

  4. Vælg en MySQL-database på Linux via kommandolinjen