Periksa kendala harus deterministik. Artinya, baris tertentu harus selalu memenuhi kendala atau harus selalu gagal memenuhi kendala. Tapi SYSDATE
secara inheren non-deterministik karena nilai yang dikembalikan terus berubah. Dengan demikian, Anda tidak dapat mendefinisikan CHECK
batasan yang memanggil SYSDATE
atau fungsi lain yang ditentukan pengguna.
Jika Anda mencoba mereferensikan SYSDATE
dalam definisi kendala, Anda akan mendapatkan kesalahan
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
Anda dapat membuat CHECK
batasan di mana tanggal minimum dan maksimum dikodekan secara keras tetapi itu tidak akan terlalu praktis karena Anda harus terus-menerus menjatuhkan dan membuat ulang batasan.
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.
Cara praktis untuk menerapkan persyaratan semacam ini adalah dengan membuat pemicu di atas meja
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;