sql >> Databáze >  >> RDS >> Oracle

ZKONTROLUJTE omezení u data narození?

Omezení kontroly musí být deterministické. To znamená, že určitý řádek musí vždy splňovat podmínku nebo musí vždy podmínku nesplňovat. Ale SYSDATE je ze své podstaty nedeterministický, protože vrácená hodnota se neustále mění. Nemůžete tedy definovat CHECK omezení, které volá SYSDATE nebo jakoukoli jinou uživatelem definovanou funkci.

Pokud se pokusíte odkazovat na SYSDATE v definici omezení se zobrazí chyba

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

Můžete vytvořit CHECK omezení, kde minimální i maximální datum bylo pevně zakódováno, ale to by nebylo zvlášť praktické, protože byste museli omezení neustále rušit a znovu vytvářet.

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.

Praktickým způsobem, jak vynutit tento druh požadavku, by bylo vytvořit spouštěč na stole

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. Android - aktualizujte klientskou databázi sqlite pomocí GCM

  2. jak použít dbms_scheduler ke spuštění úlohy každých 30 minut

  3. Rozdíl mezi TRIM() a TRIM_ORACLE() v MariaDB

  4. Nelze se připojit k místnímu serveru MySQL přes soket '/tmp/mysql.sock