Cỏc khẳng định (assertion)

Một phần của tài liệu Giáo trình Ngôn ngữ SQL doc (Trang 82 - 85)

CHƯƠNG II : CÁC RÀNG BUỘC VÀ CÁC TRIGGER

2.4.1Cỏc khẳng định (assertion)

2.4 CÁC RÀNG BUỘC MỨC LƯỢC ĐỒ VÀ CÁC TRIGGER

2.4.1Cỏ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 ràng buộc khụng phải là cận trờn mà là cận dưới của tổng lương theo từng

đơn vị thỡ chỳng ta cú thể tỡm thấy ràng buộc bị vi phạm ngay cả khi chỳng ta viết nú như là một kiểm tra dựa trờn bộ mà khụng phải là một assertion. Cuối cựng, ta cú thể bỏ một assertion. Lệnh làm việc đú cũng tuõn theo mẫu đối với mọi phần tử của lược đồ cơ sở dữ liệu.

DROP ASSERTION <Tờn của assertion>.

So sỏnh cỏc ràng buộc

Bảng sau đõy liệt kờ cỏc khỏc nhau cơ bản giữa cỏc kiểm tra dựa trờn thuộc tớnh, cỏc kiểm tra dựa trờn bộ và assertion

Kiểu ràng buộc Được mụ tả ở

đõu

Khi nào được kớch hoạt Được đảm bảo đỳng ? CHECK dựa trờn thuộc tớnh Cựng với thuộc tớnh Trờn phộp chốn vào quan hệ hoặc cập nhật thuộc tớnh Khụng đảm bảo nếu cú truy vấn con CHECK dựa trờn bộ Phần tử của lược đồ quan hệ Trờn phộp chốn vào quan hệ hoặc cập nhật bộ Khụng đảm bảo nếu cú truy vấn con

Assertion Phần tử của lược đồ cơ sở dữ liệu

Trờn một thay đổi đối với quan hệ được kể ra

Đảm bảo

Một phần của tài liệu Giáo trình Ngôn ngữ SQL doc (Trang 82 - 85)