CÁC BỘ
Chỳng ta đó xem xột cỏc ràng buộc khoỏ, chỳng buộc cỏc thuộc tớnh nào đấy phải cú cỏc giỏ trị khỏc biệt trờn tất cả cỏc bộ giỏ trị của một quan hệ. Chỳng ta cũng đó xem xột cỏc ràng buộc khoỏ ngoài, chỳng bắt tuõn theo ràng buộc tham chiếu giữa cỏc thuộc tớnh của hai quan hệ. Bõy giờ chỳng ta sẽ xem xột một loại ràng buộc quan trọng thứ ba: chỳng là hạn chế cỏc giỏ trị cú thể xuất hiện trong cỏc thành phần đối với một số thuộc tớnh. Cỏc ràng buộc này cú thể được diễn đạt bằng một trong hai cỏch sau:
1. Một ràng buộc trờn thuộc tớnh trong định nghĩa của lược đồ quan hệ của nú, hoặc
2. Một ràng buộc trờn một bộ giỏ trị. Ràng buộc này là một phần của lược đồ quan hệ, khụng liờn quan đến bất kỳ thuộc tớnh nào của nú.
2.2.1 Cỏc ràng buộc Not-Null
Một ràng buộc đơn giản gắn kết với một thuộc tớnh là NOT NULL. Hiệu quả của nú là cấm cỏc bộ mà trong đú giỏ trị của thuộc tớnh này là NULL. Ràng buộc được mụ tả bằng cỏc từ khoỏ NOT NULL đi sau mụ tả của thuộc tớnh trong lệnh CREATE TABLE
Vớ dụ 2.6: Giả sử quan hệ DỰÁN đũi hỏi thuộc tớnh MósốDV là xỏc định. Khi đú ta cú mụ tả của thuộc tớnh trong dũng 5) của vớ dụ 2.4 được thay đổi như sau:
5) MósốĐV INT REFERENCES ĐƠNVỊ(MósốĐV) NOT NULL Thay đổi này cú nhiều hệ quả, chẳng hạn:
ư Chỳng ta khụng thể thờm vào quan hệ Studio một bộ giỏ trị bằng cỏch chỉ ra ba thuộc tớnh TờnDA, MósốDA, ĐịađiểmDA bởi vỡ bộ thờm vào sẽ cú giỏ trị NULL cho thành phần MósốĐV.
. Chỳng ta khụng thể sử dụng chớnh sỏch setưnull trong hoàn cảnh giống như dũng 6) của vớ dụ 2.4, bởi vỡ nú yờu cầu hệ thống gỏn cả giỏ trị NULL cho MósốĐV để bảo toàn ràng buộc khoỏ ngoài.
2.2.2 Cỏc ràng buộc kiểm tra (CHECK) dựa trờn thuộc tớnh
Cỏc ràng buộc phức tạp hơn cú thể gắn với một mụ tả thuộc tớnh bằng từ khoỏ CHECK sau đú là một điều kiện phải thoả món đối với mọi giỏ trị của thuộc tớnh này. Điều kiện được đặt trong dấu ngoặc. Trờn thực tế, một ràng buộc CHECK dựa trờn thuộc tớnh giống như một hạn chế đơn giản trờn cỏc giỏ trị, như là việc liệt kờ cỏc giỏ trị hợp thức hoặc là một bất phương trỡnh số học. Tuy nhiờn, về nguyờn tắc, điều kiện cú thể là bất kỳ cỏi gỡ cú thể đi sau WHERE trong một truy vấn SQL. Điều kiện này cú thể tham chiếu đến thuộc tớnh bị ràng buộc bằng cỏch sử dụng tờn của thuộc tớnh đú trong biểu thức của nú. Tuy nhiờn, nếu điều kiện tham chiếu đến cỏc quan hệ khỏc hoặc cỏc thuộc tớnh khỏc của quan hệ thỡ quan hệ phải được đưa vào trong mệnh đề FROM của một truy vấn con (ngay cả nếu quan hệ được tham chiếu đến là một quan hệ chứa thuộc tớnh bị kiểm tra).
Một ràng buộc CHECK dựa trờn thuộc tớnh được kiểm tra khi một bộ nào đấy nhận một giỏ trị mới cho thuộc tớnh này. Giỏ trị mới cú thể được đưa vào bằng một sửa đổi đối với bộ hoặc cú thể là một phần của bộ được thờm vào. Nếu giỏ trị mới vi phạm ràng buộc thỡ phộp sửa đổi bị loại bỏ. Chỳng ta sẽ thấy trong vớ dụ 2.7, ràng buộc CHECK dựa trờn thuộc tớnh sẽ khụng được kiểm tra nếu một sửa đổi cơ sở dữ liệu khụng làm thay đổi giỏ trị của thuộc tớnh gắn với ràng buộc. Hạn chế đú cú thể dẫn đến ràng buộc trở nờn bị vi phạm. Trước tiờn ta hóy xột một vớ dụ đơn giản về kiểm tra dựa trờn thuộc tớnh.
Vớ dụ 2.7 Giả sử chỳng ta muốn đũi hỏi rằng cỏc Mó sốĐV chỉ gồm cú một chữ số. Ta cú thể sửa đổi dũng 5) của vớ dụ 2.4, một mụ tả của lược đồ đối với quan hệ DỰÁN như sau:
4) MósốDA INT REFERENCES ĐƠNVỊ(MósốDA) CHECK (MósốDA < 10)
Việc đề cập đến cỏc thuộc tớnh khỏc của quan hệ hoặc cỏc quan hệ khỏc trong điều kiện là được phộp. Để làm điều đú, trong điều kiện phải cú truy vấn con. Như chỳng ta đó núi, điều kiện cú thể là bất kỳ cỏi gỡ cú thể đi sau WHERE trong một lệnh selectưfromưwhere của SQL. Tuy nhiờn, chỳng ta cần nhận thấy rằng việc kiểm tra ràng buộc chỉ được kết hợp với thuộc tớnh cần kiểm tra chứ khụng phải với mỗi quan hệ hoặc thuộc tớnh kể ra trong ràng buộc. Kết quả là một điều kiện phức tạp cú thể trở thành sai nếu một phần tử nào đú khỏc với thuộc tớnh cần kiểm tra thay đổi…
Vớ dụ 2.8 Chỳng ta cú thể giả thiết rằng ta cú thể thay thế một ràng buộc toàn vẹn tham chiếu bằng một ràng buộc CHECK dựa trờn thuộc tớnh đũi hỏi sự tồn tại của giỏ trị được tham chiếu. Sau đõy là một sự cố gắng sai lầm nhằm thay thế đũi hỏi rằng giỏ trị của MósốDA trong một bộ (TờnDA, MósốDA, ĐịađiểmDA, MósốĐV) của quan hệ DỰÁN phải xuất hiện trong thành phần MósốĐV của một bộ nào đấy của quan hệ ĐƠNVỊ. Giả sử dũng 5) của vớ dụ 2.4 được thay thế bằng:
4) MósốĐV INT CHECK (MósốĐV IN(SELECT MósốĐV FROM ĐƠNVỊ)
Lệnh này là một ràng buộc CHECK dựa trờn thuộc tớnh hợp lệ nhưng ta hóy xem xột hiệu quả của nú.
Nếu ta cố gắng chốn một bộ mới vào DỰÁN và bộ đú cú giỏ trị của MósốĐV khụng là mó số của một đơn vị nào cả, khi đú phộp chốn bị loại bỏ.
Nếu ta cố gắng cập nhật thành phần MósốĐV của một bộ DỰÁN, và giỏ trị mới khụng phải là một giỏ trị của thuộc tớnh MósốĐV trong một bộ nào cả của ĐƠNVỊ, phộp cập nhật bị loại bỏ.
Tuy nhiờn, nếu chỳng ta thay đổi quan hệ ĐƠNVỊ bằng cỏch loại bỏ một bộ giỏ trị, thay đổi đú là khụng nhỡn thấy đối với ràng buộc CHECK ở trờn. Như vậy, phộp loại bỏ được chấp nhận mặc dự ràng buộc CHECK dựa vào thuộc tớnh trờn MósốĐV bõy giờ bị vi phạm.
2.2.3 Cỏc ràng buộc kiểm tra (CHECK)dựa trờn bộ giỏ trị.
Để khai bỏo một ràng buộc trờn cỏc bộ của một bảng R, khi chỳng ta định nghĩa bảng đú bằng lệnh CREATE TABLE, chỳng ta cú thể thờm vào danh sỏch cỏc khai bỏo thuộc tớnh, khoỏ và khoỏ ngoài từ khoỏ CHECK theo sau là một điều kiện đặt trong dấu ngoặc. Điều kiện này cú thể là bất cứ cỏi gỡ cú thể xuất hiện trong mệnh đề WHERE. Nú được cài đặt như là một điều kiện về một bộ trong bảng R, và cỏc thuộc tớnh của R cú thể được tham chiếu đến bằng tờn trong biểu thức này. Tuy nhiờn, cũng như đối với cỏc ràng buộc CHECK dựa trờn thuộc tớnh, điều kiện cũng cú thể đề cập đến cỏc quan hệ khỏc hoặc cỏc bộ giỏ trị khỏc của cựng quan hệ R ở trong cỏc truy vấn con. Điều kiện của một ràng buộc CHECK dựa trờn bộ được kiểm tra mỗi khi một bộ được chốn vào R và mỗi khi một bộ của R được cập nhật và được đỏnh giỏ đối với bộ được cập nhật hoặc bộ mới được chốn vào. Nếu điều kiện là sai đối với bộ đú thỡ ràng buộc bị vi phạm và phộp chốn hoặc phộp cập nhật sinh ra sự vi phạm đú sẽ bị loại bỏ. Tuy nhiờn, nếu điều kiện đề cập đến một quan hệ nào đú (thậm chớ đến chớnh R) trong một truy vấn con, và một thay đổi đối với quan hệ này gõy ra việc điều kiện trở thành sai đối với một bộ nào đú của R thỡ kiểm tra khụng ngăn cấm thay đổi đú. Như vậy, giống như một CHECK dựa trờn thuộc tớnh, một CHECK dựa trờn bộ là khụng thấy được đối với cỏc quan hệ khỏc.
Mặc dự cỏc kiểm tra dựa trờn bộ cú thể gồm cỏc điều kiện rất phức tạp nhưng nờn trỏnh trường hợp đú bởi vỡ nú cú thể bị vi phạm dưới cỏc điều kiện nào đấy. Nếu cỏc kiểm tra dựa trờn bộ chỉ chứa cỏc thuộc tớnh của bộ cần kiểm tra thỡ nú luụn luụn đỳng.
Vớ dụ 2.9 Chỳng ta viết lệnh CREATE TABLE đối với quan hệ GIÁOVIấN, trong đú ta thờm vào một ràng buộc: nếu một giỏo viờn là nam giới thỡ tờn của anh ta khụng được bắt đầu bằng “Ms.”:
1) CREATE TABLE GIÁOVIấN ( 2) Tờn CHAR(30) PRIMARY KEY, 3) Địachỉ VARCHAR(255),
5) Ngàysinh DATE,
6) CHECK (Giớitớnh = ‘F’ OR Tờn NOT LIKE ‘Ms.%’));
Dũng 6) ở trờn mụ tả ràng buộc. Điều kiện của ràng buộc này là đỳng đối với cỏc giỏo viờn nữ hoặc cỏc giỏo viờn khỏc cú tờn khụng bắt đầu bằng ‘Ms.’. Cỏc bộ làm cho điều kiện trở thành sai là cỏc bộ cú giới tớnh là nam và tờn bắt đầu bằng ‘Ms.’.
2.3 SỬA ĐỔI CÁC RÀNG BUỘC
Cú thể thờm, sửa đổi, hoặc loại bỏ cỏc ràng buộc tại mọi thời điểm. Cỏch diễn đạt cỏc sửa đổi đú phụ thuộc vào việc ràng buộc liờn quan đến một thuộc tớnh, một bộ giỏ trị, một bảng hoặc một lược đồ cơ sở dữ liệu.
2.3.1 Đặt tờn cho cỏc ràng buộc
Để sửa đổi hoặc xoỏ một ràng buộc đang tồn tại điều cần thiết là ràng buộc phải cú một tờn. Để làm điều đú, chỳng ta đặt trước ràng buộc từ khoỏ CONSTRAINT và một tờn cho ràng buộc này.
Vớ dụ 2.10:
Tờn CHAR(30) CONSTRAINT Tờnlàkhúa PRIMARY KEY, Giớitớnh CHAR(1) CONSTRAINT Giỏ trịGT
CHECK (gender IN (‘F’, ‘M’)), CONSTRAINT Tờnđỳng
CHECK (Giớitớnh = ‘F’ OR Tờn NOT LIKE ‘Ms.%’),
2.3.2 Sửa đổi cỏc ràng buộc trờn cỏc bảng
Trong phần trước chỳng ta đó núi rằng ta cú thể chuyển việc kiểm tra một ràng buộc từ tức khắc (immediate) sang chậm (deferred) với lệnh SET CONSTRAINT. Cỏc thay đổi khỏc đối với cỏc ràng buộc được thực hiện với lệnh ALTER TABLE. Chỳng ta cũng đó sử dụng lệnh này trong phần trước để thờm hoặc loại bỏ cỏc thuộc tớnh.
Cỏc lệnh đú cũng cú thể được sử dụng để sửa đổi cỏc ràng buộc. ALTER TABLE được sử dụng đối với cả hai kiểm tra: kiểm tra dựa trờn thuộc tớnh
DROP và tờn của ràng buộc bị dừng. Chỳng ta cũng cú thể thờm một ràng buộc với từ khoỏ ADD, tiếp theo là ràng buộc được thờm vào. Tuy nhiờn, cần để ý rằng chỳng ta chỉ cú thể thờm một ràng buộc vào một bảng khi ràng buộc đú thoả món đối với trạng thỏi hiện tại của bảng.
Vớ dụ 2.11: Ba lệnh sau đõy làm dừng cỏc ràng buộc đối với quan hệ GIÁOVIấN:
ALTER TABLE GIÁOVIấN DROP CONSTRAINT Tờnlàkhúa ; ALTER TABLE GIÁOVIấN DROP CONSTRAINT GiỏtrịGT ; ALTER TABLE GIÁOVIấN DROP CONSTRAINT Tờnđỳng ;
Bõy giờ, giả sử ta muốn khụi phục lại cỏc ràng buộc đú, ta viết cỏc lệnh sau: ALTER TABLE GIÁOVIấN ADD CONSTRAINT Tờnlàkhúa
PRIMARY KEY (Tờn);
ALTER TABLE GIÁOVIấN ADD CONSTRAINT GiỏtrịGT CHECK (Giớitớnh IN (‘F’, ‘M’));
ALTER TABLE GIÁOVIấN ADD CONSTRAINT RightTitle CHECK (Giớitớnh = ‘F’ OR Tờn NOT LIKE ‘Ms.%’ ;
Cỏc ràng buộc này trở thành cỏc ràng buộc dựa trờn bộ chứ khụng cũn là cỏc ràng buộc dựa trờn thuộc tớnh.
2.4 CÁC RÀNG BUỘC MỨC LƯỢC ĐỒ VÀ CÁC TRIGGER TRIGGER
Cỏc dạng phần tử tớch cực mạnh mẽ nhất trong SQL khụng kết hợp với cỏc bộ hoặc cỏc thành phần của cỏc bộ cụ thể. Cỏc phần tử này được gọi là cỏc khẳng định (assertion) và cỏc trigger, chỳng là một thành phần của lược đồ cơ sở dữ liệu, ngang hàng với cỏc quan hệ và cỏc khung nhỡn.
. Một khẳng định là một biểu thức SQL cú giỏ trị lụ gic, nú phải đỳng tại mọi thời điểm.
. Một trigger là một loạt hành động kết hợp với cỏc sự kiện nào đú, chẳng hạn như chốn vào một quan hệ cụ thể, và chỳng được thực hiện khi cỏc sự kiện này xảy ra.
2.4.1 Cỏc khẳng định (assertion)
Chuẩn SQL đề nghị một dạng khẳng định đơn giản cho phộp chỳng ta bắt buộc một điều kiện nào đú. Giống như cỏc phần tử lược đồ khỏc, chỳng ta mụ tả một khẳng định bằng lệnh CREATE. Dạng của một khẳng định là:
1. Cỏc từ khúa CREATE ASSERTION, 2. Tờn của khẳng định
3. Từ khúa CHECK, và
4. Một điều kiện được đặt trong dấu ngoặc. Như vậy, dạng của lệnh này là
CREATE ASSERTION < Tờn > CHECK < điềukiện >
Điều kiện trong assertion phải đỳng khi assertion được tạo ra và phải luụn luụn vẫn cũn đỳng; bất kỳ một sửa đổi cơ sở dữ liệu nào làm cho nú trở thành sai sẽ bị loại bỏ. Nhớ lại rằng cỏc kiểu ràng buộc CHECK khỏc mà chỳng ta đó xột cú thể bị vi phạm dưới một số điều kiện.
Cú một sự khỏc nhau giữa cỏch viết cỏc ràng buộc CHECK dựa trờn bộ và cỏch viết assertion. Cỏc kiểm tra dựa trờn bộ cú thể tham chiếu đến cỏc thuộc tớnh của quan hệ cú kiểm tra này xuất hiện trong mụ tả của nú. Vớ dụ, trong dũng 6) của vớ dụ 2.8 chỳng ta sử dụng cỏc thuộc tớnh Giới tớnh và Tờn mà khụng núi chỳng đi đến từ đõu. Chỳng tham chiếu đến cỏc thành phần của một bộ được chốn vào hoặc được cập nhật trong bảng GIÁOVIấN bởi vỡ bảng đú là một trong cỏc bảng được mụ tả trong lệnh CREATE TABLE. Điều kiện của một assertion khụng cú đặc quyền như vậy. Cỏc thuộc tớnh bất kỳ được tham chiếu đến trong điều kiện phải được giới thiệu trong assertion, thường là bằng việc chỉ ra quan hệ của chỳng trong một biểu thức selectưfromưwhere. Bởi vỡ điều kiện phải cú một giỏ trị lụgic, việc nhúm cỏc kết quả của điều kiện theo một cỏch nào đú để tạo ra một lựa chọn true/false
biểu thức sản xuất ra một quan hệ mà NOT EXISTS được ỏp dụng cho quan hệ đú; điều đú cú nghĩa là, ràng buộc là quan hệ này luụn luụn rỗng. Một cỏch khỏc, chỳng ta cú thể ỏp dụng một phộp toỏn nhúm như là SUM cho một cột của một quan hệ và so sỏnh nú với một hằng. Vớ dụ, chỳng ta cú thể đũi hỏi rằng tổng luụn luụn bộ hơn một giỏ trị cú giới hạn nào đú.
Vớ dụ 2.12: Giả sử chỳng ta muốn yờu cầu rằng muốn trở thành người quản lý của một đơn vị thỡ phải cú lương ớt nhất là 4000. Ta sẽ khai bỏo một assertion với với mục đớch rằng tập hợp cỏc đơn vị cú người quản lý với lương nhỏ hơn 4000 là rỗng. Assertion này cần cú hai quan hệ NHÂNVIấN và ĐƠNVỊ.
CREATE ASSERTION Quanly CHECK (NOT EXISTS
(SELECT *
FROM NHÂNVIấN NV, ĐƠNVỊ ĐV WHERE NV.MósốNV = ĐV.Mó sốNQL AND Lương <4000);
Nhõn tiện, cần chỳ ý rằng mặc dự ràng buộc này cú hai quan hệ, chỳng ta cú thể viết nú như cỏc ràng buộc CHECK dựa trờn bộ trờn hai quan hệ hơn là như một assertion đơn. Vớ dụ, chỳng ta cú thể viết như sau
CREATE TABLE ĐƠNVỊ
(TờnĐV VARCHAR(15) NOT NULL, MósốĐV INT PRIMARY KEY,
Ngàybắtđầu DATE, MósốNQL CHAR(9) REFERENCES NHÂNVIấN(MósốNV), CHECK (MósốNQL NOT IN (SELECT MósốNV FROM NHÂNVIấN WHERE Lương < 4000)));
Tuy nhiờn, chỳ ý rằng ràng buộc này chỉ sẽ được kiểm tra khi cú một thay đổi xảy ra đối với quan hệ của nú, quan hệ ĐƠNVỊ. Cú thể nú khụng chặn được tỡnh trạng cú những người quản lý được ghi vào quan bệ NHÂNVIấN nhưng lại cú lương < 4000. Để nhận được hiệu quả đầy đủ của assertion, chỳng ta phải thờm một ràng buộc khỏc vào khai bỏo của bảng NHÂNVIấN, đũi hỏi rằng lương của một nhõn viờn phải >=4000 nếu anh ta là người quản lý một đơn vị.
Vớ dụ 2.13 Assertion sau đõy núi rằng tổng lương của mỗi đơn vị khụng được vượt quỏn 100000. Nú bao hàm quan hệ NHÂNVIấN.
CREATE ASSERTION Tổnglương CHECK (100000 >= ALL
(SELECT SUM(Lương) FROM NHÂNVIấN GROUP BY MósốĐV));
Vỡ ràng buộc này chỉ bao hàm cú một quan hệ NHÂNVIấN, nú cú thể được trỡnh bày như một ràng buộc CHECK dựa trờn biến bộ trong lược đồ đối với NHÂNVIấN hơn là như một assertion. Vỡ vậy, chỳng ta cú thể thờm vào định nghĩa của bảng NHÂNVIấN ràng buộc CHECK dựa trờn biến bộ như sau:
CHECK (100000>= ALL
(SELECT SUM(Lương) FROM NHÂNVIấN GROUP BY MósốĐV)); Để ý rằng, về nguyờn tắc, điều kiện này ỏp dụng cho mỗi bộ của bảng NHÂNVIấN. Tuy nhiờn, nú khụng kể ra cỏc thuộc tớnh của bộ một cỏch rừ ràng và mọi cụng việc được thực hiện trong truy vấn con. Cũng để ý thờm rằng nếu được cài đặt như một ràng buộc dựa trờn bộ thỡ việc kiểm tra khụng thể thực hiện trờn phộp xúa một bộ ra khỏi quan hệ NHÂNVIấN. Trong vớ dụ này, sự khỏc nhau đú khụng gõy ra tai hại bởi vỡ nếu ràng buộc được thỏa món trước khi xúa thỡ sau khi xúa nú cũng được thỏa món. Tuy nhiờn, nếu