CHƯƠNG II : CÁC RÀNG BUỘC VÀ CÁC TRIGGER
2.1 KHểA VÀ KHểA NGOÀI
2.1.6 Làm chậm việc kiểm tra ràng buộc
Xột vớ dụ 2.3, trong đú MósốĐV trong DỰÁN là khoỏ ngồi tham chiếu đến MósốĐV của ĐƠNVỊ. Nếu ta thực hiện chốn một bộ giỏ trị vào quan hệ DỰÁN
INSERT INTO DỰÁN
VALUES (‘DA08’, 25,’ Hà nội’,6);
thỡ chỳng ta sẽ gặp rắc rối bởi vỡ khụng cú bộ giỏ trị nào của quan hệ ĐƠNVỊ cú giỏ trị 6 cho thuộc tớnh MósốĐV. Như vậy, ta đó vi phạm ràng buộc khoỏ ngoài.
Một sửa đổi cú thể được là trước tiờn hóy chốn vào quan hệ DỰÁN một bộ giỏ trị khụng cú thuộc tớnh MósốĐV:
INSERT INTO DỰÁN (TờnDA, MósốDA, ĐịađiểmDA) VALUES (‘DA08’, 25,’ Hà nội’);
Thay đổi này trỏnh vi phạm ràng buộc bởi vỡ bộ này được chốn vào với giỏ trị null cho MósốĐV và NULL trong một khoỏ ngoài khụng đũi hỏi phải kiểm tra sự tồn tại của bất kỳ giỏ trị nào ở trong cột được tham chiếu đến. Sau đú chỳng ta chốn vào quan hệ ĐƠNVỊ một bộ giỏ trị mới cú giỏ trị cho thuộc tớnh MósốĐV là 6, cuối cựng ta cập nhật quan hệ DỰÁN Studio bằng lệnh:
UPDATE DỰÁN SET MósốĐV = 6
WHERE TờnDA = ‘DA08’;
Nếu ta khụng sửa đổi quan hệ ĐƠNVỊ trước thỡ lệnh update này cũng sẽ vi phạm ràng buộc khoỏ ngoài. Tuy nhiờn, trong một số trường hợp ta khụng thể sắp xếp một cỏch khụn ngoan cỏc bước sửa đổi cơ sở dữ liệu như vậy. Trong SQL để giải quyết khú khăn trờn ta cần hai điểm:
1. Trước tiờn ta cần cú khả năng nhúm nhiều lệnh SQL (hai phộp chốn, một vào DỰÁN và một vào ĐƠNVỊ) vào một đơn vị gọi là một giao tỏc (transaction).
2. Sau đú chỳng ta cần một cỏch núi với hệ thống SQL khụng kiểm tra cỏc ràng buộc cho đến sau khi toàn bộ giao tỏc được hoàn thành.
a) Mọi ràng buộc (khoỏ, khoỏ ngoài hoặc ràng buộc khỏc) cú thể được khai bỏo DEFERABLE hoặc NOT DEFERABLE. Khai bỏo NOT DEFERABLE là ngầm định và cú nghĩa là mỗi một lần xuất hiện một sửa đổi cơ sở dữ liệu, ràng buộc được kiểm tra ngay sau đú nếu phộp sửa đổi đũi hỏi rằng nú được kiểm tra. Tuy nhiờn nếu ta khai bỏo một ràng buộc là DEFERABLE, thỡ chỳng ta cú lựa chọn bảo nú chờ đợi cho đến khi một giao tỏc hoàn thành trước khi kiểm tra ràng buộc.
b) Nếu một ràng buộc là chậm được (deferable), thỡ chỳng ta cũng cú thể khai bỏo nú là INITIALLY DEFERED hoặc INITIALLY IMMEDIATE. Trong trường hợp thứ nhất việc kiểm tra sẽ được trỡ hoón đến hết của giao tỏc hiện tại, trừ khi chỳng ta bảo hệ thống dừng việc trỡ hoón ràng buộc này. Nếu mụ tả INITIALLY IMMEDIATE, việc kiểm tra sẽ được làm trước mọi sửa đổi, nhưng bởi vỡ ràng buộc là trỡ hoón được, chỳng ta cú quyền lựa chọn quyết định kiểm tra chậm về sau.
Vớ dụ 2.5 Hỡnh dưới đõy biểu thị mụ tả của DỰÁN được cải tiến để cho phộp việc kiểm tra ràng buộc khoỏ ngồi được trỡ hn cho đến sau một giao tỏc. Ta cũng mụ tả MósốĐV là UNIQUE với mục đớch là nú cú thể được cỏc ràng buộc khoỏ ngoài của cỏc quan hệ khỏc tham chiếu đến.
CREATE TABLE DỰÁN
(TờnDA VARCHAR(15),
MósốDA INT PRIMARY KEY,
ĐịađiểmDA VARCHAR(15), MósốĐV INT UNIQUE
REFERENCES ĐƠNVỊ(MósốDA)), DEFERABLE INITIALLY DEFERRED); Cú hai điểm cần chỳ ý:
ư Cú thể đặt tờn cho cỏc ràng buộc
ư Nếu một ràng buộc cú một tờn, vớ dụ MyConstraint, thỡ chỳng ta cú thể đổi một ràng buộc chậm từ immediate thành deferred bằng lệnh SQL
và chỳng ta cú thể đảo ngược xử lý bằng cỏch đổi từ DEFERRED ở trờn thành IMMEDIATE.