sql >> Databasteknik >  >> RDS >> Oracle

KONTROLLERA begränsning på födelsedatum?

Kontrollbegränsningar måste vara deterministiska. Det vill säga, en viss rad måste alltid uppfylla begränsningen eller så måste den alltid misslyckas med att uppfylla begränsningen. Men SYSDATE är i sig icke-deterministisk eftersom det returnerade värdet ständigt förändras. Du kan alltså inte definiera en CHECK begränsning som anropar SYSDATE eller någon annan användardefinierad funktion.

Om du försöker referera till SYSDATE i begränsningsdefinitionen får du ett fel

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 skapa en CHECK begränsning där både lägsta och högsta datum var hårdkodade men det skulle inte vara särskilt praktiskt eftersom du hela tiden måste släppa och återskapa 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.

Det praktiska sättet att upprätthålla denna typ av krav skulle vara att skapa 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. php-kod för att testa pdo är tillgänglig?

  2. MySQL Lägg till främmande nyckel

  3. Omslagsklass Funktionalitet Transformation

  4. öka radnumret när värdet på fältet ändras i Oracle