Ràng buộc kiểm tra phải xác định. Có nghĩa là, một hàng cụ thể phải luôn thỏa mãn ràng buộc hoặc nó phải luôn không thỏa mãn ràng buộc. Nhưng SYSDATE
vốn dĩ không xác định vì giá trị trả về liên tục thay đổi. Do đó, bạn không thể xác định một CHECK
ràng buộc gọi SYSDATE
hoặc bất kỳ chức năng nào khác do người dùng xác định.
Nếu bạn cố gắng tham chiếu SYSDATE
trong định nghĩa ràng buộc, bạn sẽ gặp lỗi
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
Bạn có thể tạo CHECK
ràng buộc trong đó cả ngày tối thiểu và tối đa đều được mã hóa cứng nhưng điều đó sẽ không thực tế lắm vì bạn phải liên tục thả và tạo lại ràng buộc.
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.
Cách thực tế để thực thi loại yêu cầu này là tạo một trình kích hoạt trên bảng
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;