sql >> Database >  >> RDS >> Oracle

CHECK beperking op geboortedatum?

Controlebeperkingen moeten deterministisch zijn. Dat wil zeggen dat een bepaalde rij altijd aan de beperking moet voldoen of dat deze altijd niet aan de beperking moet voldoen. Maar SYSDATE is inherent niet-deterministisch, aangezien de geretourneerde waarde voortdurend verandert. U kunt dus geen CHECK . definiëren beperking die SYSDATE . aanroept of een andere door de gebruiker gedefinieerde functie.

Als u probeert te verwijzen naar SYSDATE in de beperkingsdefinitie krijg je een foutmelding

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

Je zou een CHECK . kunnen maken beperking waarbij zowel de minimum- als maximumdatum hard gecodeerd waren, maar dat zou niet bijzonder praktisch zijn, omdat je de beperking constant zou moeten laten vallen en opnieuw moet creëren.

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.

De praktische manier om dit soort vereisten af ​​te dwingen zou zijn om een ​​trigger op de tafel te creëren

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. Gegevens opmaken in Power BI Desktop-visualisaties

  2. Verschil tussen VARCHAR en TEXT in MySQL

  3. Waarom wordt de uitvoeringstijd van de opgeslagen procedure in Oracle aanzienlijk verlengd, afhankelijk van hoe deze wordt uitgevoerd?

  4. SQL - Vraag om het IP-adres van de server