CSDL Lab9 Đặt ràng buộc toàn vẹn và Trigger - Trường Cao đẳng Quốc tế KENT

CSDL Lab9 Đặt ràng buộc toàn vẹn và Trigger/Trường Cao đẳng Quốc tế KENT. Tài liệu được biên soạn dưới dạng file PDF gồm 6 trang, giúp bạn tham khảo, ôn tập và đạt kết quả cao trong kì thi sắp tới. Mời bạn đọc đón xem!

lOMoARcPSD|41967345
ĐẶT RÀNG BUC TOÀN VN
1 Gii thiu
Ràng buc toàn vn nhng quy tắc, quy định trên CSDL nhm đảm bo cho CSDL
đưc nhất quán và đúng đắn vi ng nghĩa của thc tế hay mong mun của con người.
Các thành phần cơ bản ca mt ràng buc toàn vn:
Phát biểu RBTV bng ngôn ng t nhiên: là mt phát biu t nhiên v ràng buc
toàn vn
Bối cnh: nhng quan h liên quan đến RBTV. Nhng quan h “liên quan”
khi thc hin nhng thao c cp nht d liu lên nhng quan h này thì RBTV b vi phm.
Nội dung: phát biu li ca RBTV bng ngôn ng hình thức để th hiện được
s cht ch. Mt s ngôn ng hình thức được s dụng như: phép nh quan hệ, đại s
quan h hoc mã gi.
Bảng tm ảnh hưởng: bng t các s ảnh hưởng đến RBVT ca các thao
tác cp nht lên các bng d liu.
Các loi RBTV:
‐ RBTV miền giá tr
‐ RBTV duy nht
‐ RBTV tham chiếu
‐ RBTV liên thuộc tính trên mt quan h
‐ RBTV liên bộ trên mt quan h
‐ RBTV liên bộ liên quan h
‐ RBTV thuộc tính tng hp
2 Các k thuật cài đặt ràng buc toàn vẹn đơn giản
2.1 Các k thuật cơ bản
‐ NOT NULL
‐ PRIMARY KEY
‐ FOREIGN KEY
‐ CHECK
Các trường hp s dng:
PRIMARY KEY: S dng dành riêng cho RBTV khoá chính. Mi bng trong
hình d liu quan h ca SQL Server có tối đa một khoá chính.
lOMoARcPSD|41967345
UNIQUE: S dng dành riêng cho RBTV duy nht. Các thuộc tính được khai báo
RBTV duy nht th xem như các thuộc tính ca khoá ng viên. Mi bng th khai
báo nhiu khoá ng viên.
FOREIGN KEY: S dng dành riêng cho vic to RBTV tham chiếu hoc khoá
ngoi. CÁc thuc tính khoá ngoi phi tham chiếu đến các thuc tính khoá (khoá chính
hoc khoá ng viên).
CHECK: S dng dành riêng cho vic tạo các RBTV khác. Lúc này các RBTV được
mô t như một biu thức điều kin mà các d liu phi tho biu thức điều kiện đó.
Cách s dng các k thuật này được trình bày trong phn xây dng cu trúc
s d liu.
2.2 RULE
RULE được thiết lập như là một quy tc ca mt thuc tính. Trình t các bước to
và s dng RULE:
To RULE:
CREATE RULE [Tên_Rule]
AS [Biu_thc_mô_tả_điều_kin] [ ; ] Trong
đó:
‐ [Tên_Rule]: Tên do người lập trình đặt
[Biểu_thc_mô_tả_điều_kin]: Biu thức tương ng vi ni dung ca RULE.
Trong biu thc này ch đưc s dng 1 biến (bắt đầu bằng @) để t RULE. Khi gn
RULE cho thuc tính nào thì biến tương ứng vi thuộc tính đó.
Gn RULE cho thuc tính:
EXEC sp_bindrule [ @rulename = ] 'Tên_rule' ,
[ @objname = ] 'Tên_bng.Tên_thuc_tính'
Ghi chú: Sinh viên tìm hiu thêm mt spháp s dng RULE khác: s dng các
tham s futureonly, gn RULE cho kiu d liệu… Tháo b RULE cho thuc tính:
EXEC sp_unbindrule [ @objname = ] 'Tên_bng.Tên_thuc_tính'
Ghi chú: Khi g bõ RULE thì g b toàn b RULE mà đã được gn vào thuc tính.
Xóa RULE
DROP RULE [Tên_Rule]
d 1: Cài đặt RBTV lương của giáo viên thuc khong ($1000, $20000) bng
cách s dng RULE.
Tạo RULE để biu din ràng buc thuc 1 khong.
CREATE RULE range_rule AS
@range>= $1000 AND @range <$20000;
lOMoARcPSD|41967345
Gn RULE va to cho thuc tính Luong ca bng GIAOVIEN sp_bindrule
'range_rule' , 'GIAOVIEN.Luong'
Khi không s dng RBTV này na thì tháo b RULE khi thuộc tính lương.
sp_unbindrule 'GIAOVIEN.Luong'
2.3 K thuật cài đặt RBTV nâng cao: TRIGGER
2.3.1 Gii thiu
Là một cơ chế để đảm bo ràng buc toàn vn s dng kh ng lập trình ca H
qun tr cơ sở d liu.
2.3.2 Cú pháp:
To Trigger
CREATE TRIGGER [Tên_trigger] ON [Tên_bng]
FOR [Các_thao_tác: insert, update hoc delete] AS
IF UPDATE (Tên thuc tính)
BEGIN
‐‐‐‐‐‐ Thân_của_trigger: Mã ngun kim tra hoc cp nht END Mt
s lưu ý khi sử dng trigger:
‐ Một trigger được gn vi 1 bảng để giám sát s thay đi d liu ca bảng đó. Mã
ngun trong phn Thân_ca_trigger s đưc t động gi thc hin khi xy ra
Các_thao_tác cp nht d liu (insert, update hoc delete) lên bng Tên_bng. Do đó nội
dung mã ngun ca Thân_ca_trigger thường s thc hin nhng công việc như: kiểm
tra d liệu, thay đổi d liu, hu b thao tác để làm cho ràng buc toàn vn không b vi
phm.
Trong phần thân của trigger để d dàng cho các thao tác kim tra d liu, h
qun tr cung cp 2 bng tạm cho người viết trigger s dng. Hai bng này cu trúc
ging hệt như bảng chính:
o Bng inserted: cha nhng dòng mi thêm vào o
Bng deleted cha nhng dòng va mi b xoá đi.
Lưu ý: Không bng updated thao tác cp nhật được xem bao gm thao
tác xoá thêm mi. Khi thc hin thao tác cp nht, bng inserted cha d liu mi,
bng deleted cha d liệu cũ.
‐ Trong MS SQL Server, trigger được gi thc hin sau khi thao tác tương ứng (insert,
update, delete) được thc hin trên bảng chính. Người dùng nếu mun khôi phc li
d liu trong bng chính thì gi lnh rollback. Ngoài ra s dng hàm raiserror để
thông báo li khi phát hin thy s vi phm RBTV.
Xoá Trigger
lOMoARcPSD|41967345
DROP TRIGGER [Tên_trigger] Cp
nht ni dung Trigger:
ALTER TRIGGER [Tên_trigger] ON [Tên_bng]
FOR [Các_thao_tác: insert, update hoc delete] AS
IF UPDATE (Tên thuc tính) BEGIN
Thân_ca_trigger: Mã ngun kim tra hoc cp nht
‐‐‐‐‐‐ TH1: Mã nguồn kim tra IF (điu
kiện để RBTV vi phm ) BEGIN
raiserror (N'Li: XXXX ', 16, 1)
rollback END
‐‐‐‐‐‐ TH2: Mã nguồn cp nht UPDATE …
END
2.3.3 Mt s ví d:
d 2: Cài đặt RBTV “Lương của giáo viên phải >= 1000” s dng k thut
trigger.
Nhận xét: RBTV này liên quan đến bng GIAOVIEN ( ON GIAOVIEN), khi
thêm mi mt dòng (insert) hoc cp nht thuc tính LUONG (update) thì RBTV
này có kh năng bị vi phm. Khi xoá thì s không ảnh hưởng đến RBTV này (FOR
insert, update).
T
X
S
GIAOVIEN
+
+(LUONG)
S dụng trigger để kim tra nhng d liu mới đưa vào, nếu vi phm quy
địnhbáo li và khôi phc li d liu.
CREATE TRIGGER trgLuong ON GIAOVIEN
FOR insert, update AS if update(LUONG) BEGIN if exists (select * from
inserted where LUONG < 1000) begin if exists (select * from inserted
where LUONG < 1000) begin raiserror (N'Lỗi: Lương của giáo viên phi
>= 1000 ', 16, 1) rollback
end END
Gi s có bng CTHD (MaHD, MaSP, SoLuong, DonGia, ThanhTien)
Ví d 3: Cài đặt RBTV sau “Thành tiền phi bng S ợng * Đơn giá”
lOMoARcPSD|41967345
Nhận xét: RBTV này liên quan đến bng CTHD, khi thêm mi mt dòng d
liu hoc khi cp nht các thuộc tính như SoLuong, DonGia thì cn cp nht li
ThanhTien tương ứng.
T
X
S
CTHD
+
+ (SoLuong, DonGia,
ThanhTien)
S dụng trigger để cp nht d liệu đúng với RBTV.
CREATE TRIGGER trgCapNhatThanhTien ON CTHD
FOR insert, update AS
IF update(SoLuong, DonGia, ThanhTien) BEGIN
Update CTHD
Set ThanhTien = SoLuong * DonGia
Where EXISTS (select * from inserted I where i.MAHD=CTHD.MAHD AND
i.MASP = CTHD.MASP) END
Ví d 4: Cài đặt RBTV sau “Giáo viên làm trưng b môn thì phi thuc b môn
đó”
T
X
S
GIAOVIEN
+ (MABM)
BOMON
+ (TRBOMON)
Gi s đã có các RBTV khoá chính, khoá ngoại.
CREATE TRIGGER trgTruongBoMon_BOMON ON BOMON
FOR update
AS
IF update(TRBOMON)
BEGIN
IF exists (SELECT *
FROM INSERTED I
WHERE I.TRBOMON IS NOT NULL
AND I.TRBOMON NOT IN ( SELECT G.MAGV
FROM GIAOVIEN G
WHERE G.MABM=I.MABM ) ) BEGIN raiserror (N'Lỗi: Trưởng b
môn phải là người trong b môn ', 16,
lOMoARcPSD|41967345
1) rollback
END
END
CREATE TRIGGER trgTruongBoMon_GIAOVIEN ON GIAOVIEN
FOR update AS
IF update(MABM) BEGIN
IF exists (SELECT *
FROM BOMON B, INSERTED I
WHERE B.TRBOMON=I.MAGV AND B.MABM <> I.MABM) BEGIN
raiserror(N'Lỗi: Trưởng b môn phải là người trong b môn',
16,1) rollback
END
END
3 Bài tp ti lp Yêu
cu:
1. Cài đặt mt s RBTV min giá tr s dng k thut CHECK, RULE
a. Gii tính ca Giáo viên phi là Nam hoc N
b. Lương của giáo viên phi là mt s tròn chc.
c. Tui ca giáo viên phi t 18 tuổi đến 60 tui.
2. Cài đt các ràng buc toàn vẹn R1, R3, R5, R7, …, R13 sử dng TRIGGER (qun
lý đề tài).
Thời lượng: 02 gi.
4 Bài tp v nhà
Yêu cu: Cài đặt các ràng buc toàn vẹn R2, R4, R6, …, R14, R15,…, R19 sử dng
TRIGGER (quản lý đề tài).
Thời lượng: 04 gi.
| 1/6

Preview text:

lOMoARcPSD| 41967345
ĐẶT RÀNG BUỘC TOÀN VẸN 1 Giới thiệu
Ràng buộc toàn vẹn là những quy tắc, quy định trên CSDL nhằm đảm bảo cho CSDL
được nhất quán và đúng đắn với ngữ nghĩa của thực tế hay mong muốn của con người.
Các thành phần cơ bản của một ràng buộc toàn vẹn:
‐ Phát biểu RBTV bằng ngôn ngữ tự nhiên: là một phát biểu tự nhiên về ràng buộc toàn vẹn
‐ Bối cảnh: là những quan hệ liên quan đến RBTV. Những quan hệ “liên quan” là
khi thực hiện những thao tác cập nhật dữ liệu lên những quan hệ này thì RBTV bị vi phạm.
‐ Nội dung: là phát biểu lại của RBTV bằng ngôn ngữ hình thức để thể hiện được
sự chặt chẽ. Một số ngôn ngữ hình thức được sử dụng như: phép tính quan hệ, đại số quan hệ hoặc mã giả.
‐ Bảng tầm ảnh hưởng: Là bảng mô tả các sự ảnh hưởng đến RBVT của các thao
tác cập nhật lên các bảng dữ liệu. Các loại RBTV: ‐ RBTV miền giá trị ‐ RBTV duy nhất ‐ RBTV tham chiếu
‐ RBTV liên thuộc tính trên một quan hệ
‐ RBTV liên bộ trên một quan hệ
‐ RBTV liên bộ liên quan hệ
‐ RBTV thuộc tính tổng hợp
2 Các kỹ thuật cài đặt ràng buộc toàn vẹn đơn giản
2.1 Các kỹ thuật cơ bản ‐ NOT NULL ‐ PRIMARY KEY ‐ FOREIGN KEY ‐ CHECK
Các trường hợp sử dụng:
PRIMARY KEY: Sử dụng dành riêng cho RBTV khoá chính. Mỗi bảng trong mô
hình dữ liệu quan hệ của SQL Server có tối đa một khoá chính. lOMoARcPSD| 41967345
UNIQUE: Sử dụng dành riêng cho RBTV duy nhất. Các thuộc tính được khai báo
RBTV duy nhất có thể xem như các thuộc tính của khoá ứng viên. Mỗi bảng có thể khai
báo nhiều khoá ứng viên.
FOREIGN KEY: Sử dụng dành riêng cho việc tạo RBTV tham chiếu hoặc khoá
ngoại. CÁc thuộc tính khoá ngoại phải tham chiếu đến các thuộc tính khoá (khoá chính hoặc khoá ứng viên).
CHECK: Sử dụng dành riêng cho việc tạo các RBTV khác. Lúc này các RBTV được
mô tả như một biểu thức điều kiện mà các dữ liệu phải thoả biểu thức điều kiện đó.
Cách sử dụng các kỹ thuật này được trình bày trong phần xây dựng cấu trúc Cơ sở dữ liệu. 2.2 RULE
RULE được thiết lập như là một quy tắc của một thuộc tính. Trình tự các bước tạo và sử dụng RULE: Tạo RULE: CREATE RULE [Tên_Rule]
AS [Biểu_thức_mô_tả_điều_kiện] [ ; ] Trong đó:
‐ [Tên_Rule]: Tên do người lập trình đặt
‐ [Biểu_thức_mô_tả_điều_kiện]: Biểu thức tương ứng với nội dung của RULE.
Trong biểu thức này chỉ được sử dụng 1 biến (bắt đầu bằng @) để mô tả RULE. Khi gắn
RULE cho thuộc tính nào thì biến tương ứng với thuộc tính đó.
Gắn RULE cho thuộc tính:
EXEC sp_bindrule [ @rulename = ] 'Tên_rule' ,
[ @objname = ] 'Tên_bảng.Tên_thuộc_tính'
Ghi chú: Sinh viên tìm hiểu thêm một số cú pháp sử dụng RULE khác: sử dụng các
tham số futureonly, gắn RULE cho kiểu dữ liệu… Tháo bỏ RULE cho thuộc tính:
EXEC sp_unbindrule [ @objname = ] 'Tên_bảng.Tên_thuộc_tính'
Ghi chú: Khi gỡ bõ RULE thì gỡ bỏ toàn bộ RULE mà đã được gắn vào thuộc tính. Xóa RULE DROP RULE [Tên_Rule]
Ví dụ 1: Cài đặt RBTV lương của giáo viên thuộc khoảng ($1000, $20000) bằng cách sử dụng RULE.
Tạo RULE để biểu diễn ràng buộc thuộc 1 khoảng. CREATE RULE range_rule AS
@range>= $1000 AND @range <$20000; lOMoARcPSD| 41967345
Gắn RULE vừa tạo cho thuộc tính Luong của bảng GIAOVIEN sp_bindrule
'range_rule' , 'GIAOVIEN.Luong'
Khi không sử dụng RBTV này nữa thì tháo bỏ RULE khỏi thuộc tính lương.
sp_unbindrule 'GIAOVIEN.Luong'
2.3 Kỹ thuật cài đặt RBTV nâng cao: TRIGGER
2.3.1 Giới thiệu
Là một cơ chế để đảm bảo ràng buộc toàn vẹn sử dụng khả năng lập trình của Hệ
quản trị cơ sở dữ liệu.
2.3.2 Cú pháp: Tạo Trigger
CREATE TRIGGER [Tên_trigger] ON [Tên_bảng]
FOR [Các_thao_tác: insert, update hoặc delete] AS
IF UPDATE (Tên thuộc tính) BEGIN
‐‐‐‐‐‐ Thân_của_trigger: Mã nguồn kiểm tra hoặc cập nhật END Một
số lưu ý khi sử dụng trigger:
‐ Một trigger được gắn với 1 bảng để giám sát sự thay đổi dữ liệu của bảng đó. Mã
nguồn trong phần Thân_của_trigger sẽ được tự động gọi thực hiện khi xảy ra
Các_thao_tác cập nhật dữ liệu (insert, update hoặc delete) lên bảng Tên_bảng. Do đó nội
dung mã nguồn của Thân_của_trigger thường sẽ thực hiện những công việc như: kiểm
tra dữ liệu, thay đổi dữ liệu, huỷ bỏ thao tác để làm cho ràng buộc toàn vẹn không bị vi phạm.
‐ Trong phần thân của trigger để dễ dàng cho các thao tác kiểm tra dữ liệu, hệ
quản trị cung cấp 2 bảng tạm cho người viết trigger sử dụng. Hai bảng này có cấu trúc
giống hệt như bảng chính:
o Bảng inserted: chứa những dòng mới thêm vào o
Bảng deleted chứa những dòng vừa mới bị xoá đi.
‐ Lưu ý: Không có bảng updated vì thao tác cập nhật được xem là bao gồm thao
tác xoá và thêm mới. Khi thực hiện thao tác cập nhật, bảng inserted chứa dữ liệu mới,
bảng deleted chứa dữ liệu cũ.
‐ Trong MS SQL Server, trigger được gọi thực hiện sau khi thao tác tương ứng (insert,
update, delete) được thực hiện trên bảng chính. Người dùng nếu muốn khôi phục lại
dữ liệu trong bảng chính thì gọi lệnh rollback. Ngoài ra sử dụng hàm raiserror để
thông báo lỗi khi phát hiện thấy sự vi phạm RBTV. Xoá Trigger lOMoARcPSD| 41967345
DROP TRIGGER [Tên_trigger] Cập
nhật nội dung Trigger:
ALTER TRIGGER [Tên_trigger] ON [Tên_bảng]
FOR [Các_thao_tác: insert, update hoặc delete] AS
IF UPDATE (Tên thuộc tính) BEGIN
 Thân_của_trigger: Mã nguồn kiểm tra hoặc cập nhật
‐‐‐‐‐‐ TH1: Mã nguồn kiểm tra IF (điều
kiện để RBTV vi phạm ) BEGIN
raiserror (N'Lỗi: XXXX ', 16, 1) rollback END
‐‐‐‐‐‐ TH2: Mã nguồn cập nhật UPDATE … … END
2.3.3 Một số ví dụ:
Ví dụ 2: Cài đặt RBTV “Lương của giáo viên phải >= 1000” sử dụng kỹ thuật trigger.
Nhận xét: RBTV này liên quan đến bảng GIAOVIEN ( ON GIAOVIEN), khi
thêm mới một dòng (insert) hoặc cập nhật thuộc tính LUONG (update) thì RBTV
này có khả năng bị vi phạm. Khi xoá thì sẽ không ảnh hưởng đến RBTV này (FOR insert, update). T X S GIAOVIEN + ‐ +(LUONG)
Sử dụng trigger để kiểm tra những dữ liệu mới đưa vào, nếu vi phạm quy
địnhbáo lỗi và khôi phục lại dữ liệu.
CREATE TRIGGER trgLuong ON GIAOVIEN
FOR insert, update AS if update(LUONG) BEGIN if exists (select * from
inserted where LUONG < 1000) begin if exists (select * from inserted
where LUONG < 1000) begin raiserror (N'Lỗi: Lương của giáo viên phải >= 1000 ', 16, 1) rollback end END
Giả sử có bảng CTHD (MaHD, MaSP, SoLuong, DonGia, ThanhTien)
Ví dụ 3: Cài đặt RBTV sau “Thành tiền phải bằng Số Lượng * Đơn giá” lOMoARcPSD| 41967345
Nhận xét: RBTV này liên quan đến bảng CTHD, khi thêm mới một dòng dữ
liệu hoặc khi cập nhật các thuộc tính như SoLuong, DonGia thì cần cập nhật lại ThanhTien tương ứng. T X S CTHD + – + (SoLuong, DonGia, ThanhTien)
Sử dụng trigger để cập nhật dữ liệu đúng với RBTV.
CREATE TRIGGER trgCapNhatThanhTien ON CTHD FOR insert, update AS
IF update(SoLuong, DonGia, ThanhTien) BEGIN Update CTHD
Set ThanhTien = SoLuong * DonGia
Where EXISTS (select * from inserted I where i.MAHD=CTHD.MAHD AND i.MASP = CTHD.MASP) END
Ví dụ 4: Cài đặt RBTV sau “Giáo viên làm trưởng bộ môn thì phải thuộc bộ môn đó” T X S GIAOVIEN ‐ ‐ + (MABM) BOMON ‐ ‐ + (TRBOMON)
Giả sử đã có các RBTV khoá chính, khoá ngoại.
CREATE TRIGGER trgTruongBoMon_BOMON ON BOMON FOR update AS IF update(TRBOMON) BEGIN IF exists (SELECT * FROM INSERTED I WHERE I.TRBOMON IS NOT NULL
AND I.TRBOMON NOT IN ( SELECT G.MAGV FROM GIAOVIEN G
WHERE G.MABM=I.MABM ) ) BEGIN raiserror (N'Lỗi: Trưởng bộ
môn phải là người trong bộ môn ', 16, lOMoARcPSD| 41967345 1) rollback END END
CREATE TRIGGER trgTruongBoMon_GIAOVIEN ON GIAOVIEN FOR update AS IF update(MABM) BEGIN IF exists (SELECT * FROM BOMON B, INSERTED I
WHERE B.TRBOMON=I.MAGV AND B.MABM <> I.MABM) BEGIN
raiserror(N'Lỗi: Trưởng bộ môn phải là người trong bộ môn', 16,1) rollback END END
3 Bài tập tại lớp Yêu cầu:
1. Cài đặt một số RBTV miền giá trị sử dụng kỹ thuật CHECK, RULE
a. Giới tính của Giáo viên phải là Nam hoặc Nữ
b. Lương của giáo viên phải là một số tròn chục.
c. Tuổi của giáo viên phải từ 18 tuổi đến 60 tuổi.
2. Cài đặt các ràng buộc toàn vẹn R1, R3, R5, R7, …, R13 sử dụng TRIGGER (quản lý đề tài).
Thời lượng: 02 giờ.
4 Bài tập về nhà
Yêu cầu: Cài đặt các ràng buộc toàn vẹn R2, R4, R6, …, R14, R15,…, R19 sử dụng
TRIGGER (quản lý đề tài).
Thời lượng: 04 giờ.