Nội'dung'chi'@ết'

!  Khái&niệm" !  Các"đặc"trưng"của"RBTV" !  Phân"loại" !  Cài"đặt"

CHƯƠNG'7'' Ràng'buộc'toàn'vẹn'(Integrety' Constraints)'

Slide&bài&giảng&môn&Cơ&sở&dữ&liệu&& ©"Bộ"môn"Hệ"Thống"Thông"Tin"/"Khoa"Công"Nghệ"Thông"Tin"/"Trường"Đại"học"Khoa"học"Tự"nhiên"""

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

2&

Khái'niệm'

Nội'dung'chi'@ết'

!  RBTV"(Integrety"Constraints)"được"phát"hiện"từ"ngữ"nghĩa" của"dữ"liệu"hoặc"thể"hiện"của"dữ"liệu"trong"thực"tế"(1)."

!  Khái"niệm"và"phân"loại" !  Các&đặc&trưng&của&RBTV&

!  RBTV"nhằm"đảm"bảo"(1):"

!  Tính"đúng"của"dữ"liệu"và"mô"hình"dữ"liệu." !  Ngữ"nghĩa"của"CSDL"

-  Bối"cảnh" -  Nội"dung" -  Bảng"tầm"ảnh"hưởng"

!  Khi"RBTV"được"khai"báo,""mọi"thể"hiện"của"quan"hệ"đều"

!  Phân"loại" !  Cài"đặt"

phải"thỏa"các"RBTV"này"ở"bất"kỳ"thời"điểm"nào"(1)." !  RBTV"được"phát"hiện"và"khai"báo"bởi"các"thiết"kế"viên"

trong"quá"trình"thiết"kế"dữ"liệu"(1)."

!  RBTV"được"định"nghĩa"trên"một"quan"hệ"hoặc"liên"quan"

đến"nhiều"quan"hệ"(1)."

" (1)""Trích"từ"sách:"Fundamental*of*Databases*4th*,*Ramez*Elmasri*&*Shamkant*B.*Navathe,*ISBN*

0A321A12226A7,*2003"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

3&

4&

Bối'cảnh'

Bối'cảnh'(I)'

!  Bối"cảnh"của"một"RBTV"

!  Ví"dụ"(R2)"

-  Người"quản"lý"trực"tiếp"(của"một"giáo"viên)"phải"là"một"giáo"

-  Là"những"quan"hệ"có"khả"năng"bị"vi"phạm"RBTV"khi"thực" hiện"các"phép"cập"nhật"dữ"liệu"(thêm,"xóa,"sửa"dữ"liệu)"

viên"trong"cùng"bộ"môn" •  Các"phép"cập"nhật""

!  Ví"dụ"(R1)"

–  Cập"nhật"người"quản"lý"trực"tiếp"của"một"giáo"viên" –  Thêm"mới"một"giáo"viên"

-  Mức"lương"của"một"người"giáo"viên"không"được"vượt"quá"

•  Bối"cảnh:"GIAOVIEN"

trưởng"bộ"môn" •  Các"phép"cập"nhật""

–  Cập"nhật"lương"cho"giáo"viên" –  Thêm"mới"một"giáo"viên"vào"một"bộ"môn" –  Bổ"nhiệm"trưởng"bộ"môn"cho"một"bộ"môn"

•  Bối"cảnh:"GIAOVIEN,"BOMON"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

5&

6&

Nội'dung'

Nội'dung'(I)'

!  Nội"dung"của"một"RBTV"được"phát"biểu"bằng"

!  Ví"dụ"(R1)"

-  Ngôn"ngữ"tự"nhiên"

-  Ngôn"ngữ"tự"nhiên"

•  Dễ"hiểu"nhưng"thiếu"tính"chặt"chẽ"

•  Mức"lương"của"một"người"giáo"viên"không"được"vượt"quá"

trưởng"bộ"môn"của"giáo"viên"đó."

-  Ngôn"ngữ"hình"thức"

-  Ngôn"ngữ"hình"thức""

(∀t)(GIAOVIEN(t) ∧ (∃s)(BOMON(s) ∧

(∃u)(GIAOVIEN(u) ∧

s.TRUONGBM = u.MAGV ∧

•  Cô"đọng,"chặt"chẽ"nhưng"đôi"lúc"khó"hiểu" •  Biểu"diễn"thông"qua"" –  Đại"số"quan"hệ" –  Phép"tính"quan"hệ"(biến"bộ)" –  Mã"giả"(pseudo"code)"

s.MABM = t.MABM ∧

t.LUONG ≤ u.LUONG )))

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

7&

8&

Nội'dung'(I)'

Bảng'tầm'ảnh'hưởng'

!  Ví"dụ"(R2)"

!  Bảng"tầm"ảnh"hưởng"

-  Ngôn"ngữ"tự"nhiên"

-  Xác"định"thao"tác"cập"nhật"nào"cần"phải"kiểm"tra"RBTV"khi"

được"thực"hiện"trên"quan"hệ"bối"cảnh"

•  Người"quản"lý"trực"tiếp"của"một"giáo"viên"phải"là"một"giáo"

viên"trong"cùng"bộ"môn"

!  Có"2"loại"

-  Ngôn"ngữ"hình"thức"

&

-  Bảng"tầm"ảnh"hưởng"cho"một"RBTV" -  Bảng"tầm"ảnh"hưởng"tổng"hợp"

∀(t)(GIAOVIEN(t) ∧ (t.GVQLCM ≠ null ⇒

(∃s)(GIAOVIEN(s) ∧ s.MABM = t.MABM

∧ s.MAGV = t.GVQLCM )))

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

9&

10&

Bảng'tầm'ảnh'hưởng'một'RBTV'

Bảng'tầm'ảnh'hưởng'tổng'hợp'

Ràng buộc 1 Ràng buộc 2 Ràng buộc m Tên_RB Thêm Xóa Sửa T X S T X … … … T X S S Quan hệ 1 - + + (Thuộc tính) Quan hệ 1 + + + - + + - - + Quan hệ 2 - - + Quan hệ 2 + - - … - + - + Quan hệ 3 - - Quan hệ n - - … + - + - - - Quan hệ n +

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

(+) Vi phạm RBTV (-) Không vi phạm RBTV

11&

12&

Phân'loại'

!  RBTV"được"chia"làm"3"loại"chính"(1):"

•  RBTV"bắt"buộc"liên"quan"đến"mô"hình"dữ"liệu"(inherent"

model"based"contraints)."" •  Ví"dụ:"Một"quan"hệ"không"được"chứa"các"bộ"dữ"liệu"trùng"nhau."

Nội'dung'chi'@ết' !  Khái"niệm" !  Các"đặc"trưng"của"RBTV" !  Phân&loại& !  Cài"đặt"

•  RBTV"liên"quan"đến"lược"đồ"của"mô"hình"dữ"liệu"

(schema"based"contraints)."" •  Ví"dụ:"Ràng"buộc"miền"giá"trị,"ràng"buộc"trên"khóa,"ràng"buộc"

trên"giá"trị"rỗng,"ràng"buộc"tham"chiếu."

•  RBTV"dựa"trên"ứng"dụng"(application"based"

contraints)."" •  Ví"dụ:"Mức"lương"của"một"người"giáo"viên"không"được"vượt"

quá"trưởng"bộ"môn"

(1)""Trích"từ"sách:"Fundamental*of*Databases*4th*,*Ramez*Elmasri*&*Shamkant*B.*Navathe,*ISBN*

0A321A12226A7,*2003"

"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

13&

14&

Phân'loại'

RBTV'V'Miền'giá'trị'

!  Ràng"buộc"qui"định"các"giá"trị"cho"một"thuộc"tính"

!  RBTV"liên"quan"đến"một"quan"hệ:"

R

A

B

C

D

1

1

α

α

•  Miền"giá"trị" •  Liên"bộ" •  Liên"thuộc"tính"

5

7

α

β

12

3

β

β

!  RBTV"liên"quan"đến"nhiều"quan"hệ:"

23

9

β

β

!  Miền"giá"trị" -  Liên"tục" -  Rời"rạc"

•  Tham"chiếu" •  Liên"bộ"liên"quan"hệ" •  Liên"thuộc"tính"liên"quan"hệ" •  Thuộc"tính"tổng"hợp" •  Chu"trình"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

β ∈ {α, β, γ} 9 ∈ {1..10}

15&

16&

Ví'dụ'3''

Ví'dụ'4''

!  Giới"tính"của"giáo"viên"phải"là"(cid:2)Nam(cid:3)(cid:1)hoặc"(cid:2)Nữ(cid:3)(cid:1)"

!  Phụ"cấp"của"mỗi"công"việc"trong"đề"tài"không"được"vượt"

quá"20"triệu."

-  Bối"cảnh:&

GIÁOVIÊN

-  Bối"cảnh:&

THAMGIAĐT

-  Biểu"diễn:"

-  Biểu"diễn:"

∀(t )(GIAOVIEN(t) ∧ (t.PHAI = 'Nam' ∨ t.PHAI = (cid:2)Nữ(cid:2)))

∀(t )(THAMGIAĐT(t) ∧ t.PHỤCẤP ≤ 20)

DOM(PHAI) = {(cid:2)Nam(cid:3), (cid:2)Nữ(cid:3)}

-  Bảng"tầm"ảnh"hưởng:"

-  Bảng"tầm"ảnh"hưởng:"

hay

Thêm Xóa Sửa Thêm Xóa Sửa R3 R4

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

GIÁOVIÊN - THAMGIAĐT - + (PHAI) + (PHỤCẤP) + +

17&

18&

RBTV'V'Liên'bộ'

Ví'dụ'5''

!  Sự"tồn"tại"của"một"hay"nhiều"bộ"phụ"thuộc"vào"sự"tồn"tại"

!  Tên"bộ"môn"là"duy"nhất."""

của"một"hay"nhiều"bộ"khác"trong"cùng"quan"hệ"

BOMON

-  Bối"cảnh:"" -  Biểu"diễn:"

R

A

B

C

D

∀(t1, t2) (BOMON(t1) ∧ BOMON(t2) ∧

1

1

α

α

5

7

α

β

(t1≠ t2 ⇒ t1.TENBM ≠ t2.TENBM))

12

3

β

β

""

23

9

β

β

∀(t1)(BOMON(t1) ∧ ¬(∃t2)(BOMON(t2) ∧

t1≠ t2 ∧ t1.TENBM = t2.TENBM) )

" " -  Bảng"tầm"ảnh"hưởng:"

!  Trường"hợp"đặc"biệt" -  RB"khóa"chính" -  RB"duy"nhất"(unique)"

hay

Thêm Xóa Sửa R5

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

BOMON - + (TENBM) +

19&

20&

Ví'dụ'6''

RBTV'V'Liên'thuộc'bnh'

!  Một"giáo"viên"được"tham"gia"tối"đa"5"công"việc"trong"tất"cả"

!  Là"ràng"buộc"giữa"các"thuộc"tính"trong"cùng"quan"hệ"

đề"tài" -  Bối"cảnh:"

THAMGIAĐT

R

A

B

C

D

-  Biểu"diễn:"

1

1

α

α

5

7

α

β

(∀t)(THAMGIADT(t) ∧

12

3

β

β

card({ s | THAMGIADT(s) ∧ s.MAGV = t.MAGV}) ≤ 5 )

23

9

β

β

-  Bảng"tầm"ảnh"hưởng:"

Thêm Xóa Sửa R6

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

THAMGIADT - + (MAGV) +

21&

22&

Ví'dụ'8''

Ví'dụ'9''

!  Một"giáo"viên"không"trực"tiếp"quản"lý"chuyên"môn""chính"

!  Ngày"bắt"đầu"của"đề"tài"luôn"nhỏ"hơn"ngày"kết"thúc"của"đề"

mình""

tài."

-  Bối"cảnh:""

GIAOVIEN

-  Bối"cảnh:""

ĐỀTÀI

-  Biểu"diễn:"

-  Biểu"diễn:"

(∀t)( GIAOVIEN(t) ∧ (t.GVQLCM = null ∨ t.GVQLCM ≠ t.MAGV) }

(∀t)( ĐỀTÀI(t) ∧ t.NGÀYBĐ ≤ t.NGÀYKT)

-  Bảng"tầm"ảnh"hưởng:"

-  Bảng"tầm"ảnh"hưởng:"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Thêm Sửa Xóa R9 Thêm Sửa Xóa R8 - ĐỀTÀI + + (NGÀYBĐ, NGÀYKT) GIAOVIEN - + + (GVQLCM)

23&

24&

Ví'dụ'10''

RBTV'V'Tham'chiếu'

!  Ngày"bắt"đầu"của"một"công"việc"luôn"nhỏ"hơn"ngày"kết"thúc"

!  Giá"trị"xuất"hiện"tại"các"thuộc"tính"trong"một"quan"hệ"nào"

của"công"việc"đó."

đó"phải"tham"chiếu"đến"giá"trị"khóa"chính"của"một"quan"hệ" khác"cho"trước"

-  Bối"cảnh:""

CÔNGVIỆC

R

A

B

C

D

S

E

F

1

1

α

α

7

1

5

7

-  Biểu"diễn:"

α

β

3

2

12

3

β

β

23

9

β

β

(∀t)( CÔNGVIỆC(t) ∧ t.NGÀYBĐ ≤ t.NGÀYKT)

-  Bảng"tầm"ảnh"hưởng:"

Bắt buộc phải tồn tại trước

!  Trường"hợp"đặc"biệt" -  RB"khóa"ngoại"

Thêm Sửa Xóa R10

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

- CÔNGVIỆC + + (NGÀYBĐ, NGÀYKT)

25&

26&

Ví'dụ'11''

Ví'dụ'12''

!  Mọi"giáo"viên"phải"thuộc"về"một"bộ"môn"cụ"thể."

!  Trưởng"bộ"môn"phải"là"một"giáo"viên""

BOMON, GIAOVIEN

BOMON, GIAOVIEN

-  Bối"cảnh:"" -  Biểu"diễn:"

-  Bối"cảnh:"" -  Biểu"diễn:"

(∀t)(GIAOVIEN(t) ∧ ∃s(BOMON(s) ∧ s.MABM = t.MABM))

(∀t)(BOMON(t) ∧ ∃s(GIAOVIEN(s) ∧ s.MAGV = t.TRUONGBM))

-  Bảng"tầm"ảnh"hưởng:"

-  Bảng"tầm"ảnh"hưởng:"

Thêm Xóa Sửa Thêm Xóa Sửa R11 R12 - + GIAOVIEN GIAOVIEN + - + (MABM) + (MAGV)

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

- + +(MABM) + - +(TRUONGBM) BOMON BOMON

27&

28&

RBTV'V'Tham'chiếu'(I)'

RBTV'V'Liên'bộ,'liên'quan'hệ'

!  Là"ràng"buộc"xảy"ra"giữa"các"bộ"trên"nhiều"quan"hệ"khác"

nhau"

!  Còn"gọi"là"phụ"thuộc"tồn"tại" !  Thường"có"bối"cảnh"là"hai"quan"hệ"

R

A

B

C

D

-  Nhưng"có"trường"hợp"suy"biến"thành"một"quan"hệ" -  Ví"dụ"(R2)"

1

1

α

α

5

7

α

β

•  Người"quản"lý"trực"tiếp"của"một"giáo"viên"phải"là"một"giáo"

12

3

β

β

viên"trong"cùng"bộ"môn"

23

9

β

β

•  Bối"cảnh:"GIAOVIEN" •  Biểu"diễn:"

∀(t)(GIAOVIEN(t) ∧ (t.GVQLCM ≠ null ⇒

S

A

B

C

2

7

α

4

7

α

"  Bảng"tầm"ảnh"hưởng"

2

3

β

(∃s)(GIAOVIEN(s) ∧ s.MABM = t.MABM ∧ s.MAGV = t.GVQLCM )))

2

10

γ

Thêm Sửa Xóa R2

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

GIAOVIEN + + + (GVQLCM, MABM)

29&

30&

Ví'dụ'13''

Ví'dụ'14''

!  Mỗi"đề"tài"phải"có"ít"nhất"một"công"việc"thuộc"về"đề"tài"đó"

!  Mỗi"bộ"môn"phải"có"ít"nhất"một"giáo"viên"

DETAI, CONGVIEC

GIAOVIEN, BOMON

-  Bối"cảnh:" -  Biểu"diễn:"

-  Bối"cảnh:" -  Biểu"diễn:"

(∀t) (DETAI(t) ∧ (∃s)(CONGIVEC(s) ∧ t.MADT = s.MADT))

(∀t) (BOMON(t) ∧ (∃s)(GIAOVIEN(s) ∧ t.MABM = s.MABM))

-  Bảng"tầm"ảnh"hưởng:"

-  Bảng"tầm"ảnh"hưởng:"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Thêm Xóa Sửa Thêm Xóa Sửa R13 R14 - - DETAI +(MADT) BOMON +(MABM) + + - - CONGVIEC GIAOVIEN + + (MADT) + + (MABM)

31&

32&

RBTV'V'Liên'thuộc'bnh,'liên'quan'hệ'

Ví'dụ'15''

!  Là"ràng"buộc"xãy"ra"giữa"các"thuộc"tính"trên"nhiều"quan"hệ"

!  Ngày"sinh"của"trưởng"bộ"môn"phải"nhỏ"hơn"ngày"nhận"

khác"nhau"

chức:""

GIAOVIEN, BOMON

-  Bối"cảnh:"" -  Biểu"diễn:"

R

S

A

B

C

D

A

B

C

(∀t)(BOMON(t) ∧ ∃s(GIAOVIEN(s) ∧ s.MAGV = t.TRUONGBM

1

1

2

7

α

α

α

5

7

4

7

α

β

α

∧ s.NGAYSINH < t.NGAYNHANCHUC))

12

3

2

3

β

β

β

-  Bảng"tầm"ảnh"hưởng:"

23

9

2

10

β

β

γ

Thêm Xóa Sửa R15

-

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

GIAOVIEN - + (NGAYSINH) - BOMON + + (NGAYNHANCHUC, TRUONGBM)

33&

34&

Ví'dụ'16''

RBTV'V'Thuộc'bnh'tổng'hợp'

!  Phụ"cấp"của"một"công"việc"trong"đề"tài"luôn"luôn"nhỏ"hơn"

!  Thuộc"tính"tổng"hợp"(còn"gọi"là"thuộc"tính"suy"diễn)"

kinh"phí"của"đề"tài"đó.""

-  Là"thuộc"tính"có"giá"trị"được"tính"toán"từ"các"thuộc"tính"khác"

THAMGIADT, DETAI

!  Khi"CSDL"có"thuộc"tính"tổng"hợp"

-  Bối"cảnh:"" -  Biểu"diễn:"

-  RBTV"bảo"đảm"quan"hệ"giữa"thuộc"tính"tổng"hợp"và"các"

thuộc"tính"nguồn"

(∀t)(THAMGIADT(t) ∧ ∃s(DETAI(s) ∧ s.MADT = t.MADT

∧ t.PHUCAP < s.KINHPHI))

-  Bảng"tầm"ảnh"hưởng:"

Thêm Xóa Sửa R16

+

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

THAMGIADT - + (PHUCAP) + - DETAI + (KINHPHI)

35&

36&

Ví'dụ'17''

RBTV'–'Chu'trình'

!  BOMON(MABM,"TENBM,"TRUONGBM,"NGAYNHANCHUC,"

!  Lược"đồ"CSDL"có"thể"được"biểu"diễn"bằng"đồ"thị"

SO_GV)"

-  Đỉnh"

Tên quan hệ

!  Số"giáo"viên"của"một"bộ"môn"phải"bằng"tổng"số"lượng"giáo"

Tên thuộc tính

•  Quan"hệ" •  Thuộc"tính"

GIAOVIEN, BOMON

-  Cạnh"

viên"thuộc"bộ"môn"đó"đó" -  Bối"cảnh:" -  Biểu"diễn:"

•  Đường"nối"một"đỉnh"quan"hệ"với"một"đỉnh"thuộc"tính"

trong"lược"đồ"CSDL"

(∀t)(BOMON(t) ∧ t.SO_GV = card({ s|GIAOVIEN(s) ∧

Tên thuộc tính

Tên quan hệ

s.MABM = t.MABM}))

-  Bảng"tầm"ảnh"hưởng:"

!  Chu"trình"

-  Đồ"thị"xuất"hiện"đường"đi"khép"kín"~"Lược"đồ"CSDL"có"chu"

Thêm Xóa Sửa R17

trình"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

+ GIAOVIEN + (MABM) + - - BOMON + (SO_GV)

37&

38&

Ví'dụ'17''

Ví'dụ'17'(I)''

!  Nhân"viên"chỉ"được"phân"công"vào"các"đề"án"do"phòng"ban"

!  Nhân"viên"chỉ"được"phân"công"vào"các"đề"án"do"phòng"ban"

của"mình"phụ"trách"

NHANVIEN, DEAN, PHANCONG

PHG=PHONG PHG=PHONG

của"mình"phụ"trách" -  Bối"cảnh:" -  Biểu"diễn:"

NVDA ← NHANVIEN PHG=PHONG DEAN

DEAN DEAN

MANV, MADA

(∀t) (PHANCONG(t) ∧ (∃s)(NVDA(s) ∧

NHANVIEN NHANVIEN

t.MA_NVIEN = s.MANV ∧ t.MADA = s.SODA ))

-  Bảng"tầm"ảnh"hưởng:"

MANV=MA_NVIEN

SODA=MADA

MA_NVIEN, SODA

PHANCONG PHANCONG

Thêm Sửa R17 Xóa - NHANVIEN -

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

- + DEAN + (MANV,PHG) + (MADA,PHONG) - PHANCONG + + (MA_NVIEN,SODA)

39&

40&

Ví'dụ'18'

Nội'dung'chi'@ết'

!  Khái"niệm" !  Các"đặc"trưng"của"RBTV" !  Phân"loại" !  Cài&đặt"

!  DDH"(SODDH,"NGAYDH,"MAKH)" !  CT_DDH"(SODDH,"MAMH,"SOLUONG,"DONGIA)"" !  GIAOHANG(MAGH,"NGAYGH,"TONGTIEN,"SODDH)" !  CT_GH"(MAGH,&MAMH)" !  Chỉ"được"phép"giao"các"mặt"hàng"mà"khách"hàng"có"đặt."

MAGH=MAGH

GIAOHANG

MAGH, MAMH

CT_DDH

-  Assertion" -  Trigger" -  Transaction"(giao"tác)" -  Stored"Procedure"(thủ"tục"lưu"trữ"nội)"

MAMH = MAMH

SODDH=SODDH

SODDH, MAMH

CT_DDH

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

41&

42&

Cài'đặt'

Asser@on'

!  Các"RBTV"được"cài"đặt"bởi"

!  Là"một"biểu"thức"SQL"luôn"mang"giá"trị"TRUE"tại"mọi"thời"

điểm." -  Người"sử"dụng"cần"cho"biết"cái"gì"phải"đúng"

-  Primary"key" -  Foreign"key" -  Check"contraint"

!  Cú"pháp"

-  Assertion" -  Trigger" -  Transaction"

CREATE ASSERTION CHECK (<Điều_kiện>)

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

DROP ASSERTION

43&

44&

Ví'dụ'15'

Ví'dụ'19'

!  Ngày"sinh"của"trưởng"bộ"môn"phải"nhỏ"hơn"ngày"nhận"

!  Lương"của"trưởng"bộ"môn"phải"lớn"hơn"50000"

chức"

CREATE ASSERTION R15 CHECK (

NOT EXISTS ( CREATE ASSERTION R12 CHECK ( SELECT * NOT EXISTS ( FROM GIAOVIEN, BOMON SELECT * WHERE MAGV=TRUONGBM FROM GIAOVIEN, BOMON AND LUONG < 50000 ) WHERE MAGV=TRUONGBM ) AND NGAYSINH > NGAYNHANCHUC )

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

)

45&

46&

Ví'dụ'19'(I)'

Ví'dụ'16'

!  Lương"của"trưởng"bộ"môn"phải"lớn"hơn"50000"

!  Số"lượng"giáo"viên"của"mỗi"bộ"môn"không"quá"20"người"

Check Constraint ALTER TABLE BOMON (

CREATE ASSERTION R16 CHECK ( TENBM NVARCHAR(50) UNIQUE,

20 >= ALL ( SELECT COUNT(MAGV) MABM CHAR(10) NOT NULL,

FROM GIAOVIEN TRUONGBM CHAR(10),

GROUP BY MABM ) NGAYNHANCHUC DATETIME,

) CONSTRAINT CHK_BM_LUONGTRUONGBM CHECK (

TRUONGBM NOT IN (SELECT MAGV FROM GIAOVIEN

WHERE LUONG <= 50000 ))

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

)

47&

48&

Ví'dụ'16'(I)'

Trigger'

!  Số"lượng"giáo"viên"của"mỗi"bộ"môn"không"quá"20"người"

!  Là"tập"hợp"các"lệnh"được"thực"hiện"tự"động"khi"xuất"hiện"

một"biến"cố"nào"đó"

thêm xóa sửa

trước sau

Check Constraint ALTER TABLE GIAOVIEN ADD Biến cố CONSTRAINT CHK_GV_SLGVBM CHECK (

20 >= ALL ( SELECT COUNT(MAGV) FROM GIAOVIEN

Thỏa

GROUP BY MABM ))

giá trị mới giá trị cũ

Không thỏa

row-level statement-level

Điều kiện Tập hợp các lệnh

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Thông báo lỗi

49&

50&

Trigger'(I)'

Ví'dụ'15'

!  Cú"pháp"

!  Lương"của"trưởng"bộ"môn"phải"lớn"hơn"50000"

CREATE TRIGGER CREATE TRIGGER TR_BM_UPD AFTER|BEFORE INSERT|UPDATE|DELETE ON AFTER UPDATE OF TRUONGBM ON BOMON REFERENCING REFERENCING NEW ROW|TABLE AS NEW ROW AS NewTuple OLD ROW|TABLE AS FOR EACH ROW FOR EACH ROW | FOR EACH STATEMENT WHEN (50000 >= (SELECT LUONG FROM GIAOVIEN WHEN (<Điều kiện>) WHERE MAGV=NewTuple.TRUONGBM)) Thông báo lỗi cho người dùng

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

DROP TRIGGER

51&

52&

Ví'dụ'15'(I)'

Ví'dụ'15'(I)'

!  Lương"của"trưởng"bộ"môn"phải"lớn"hơn"50000"

!  Lương"của"trưởng"bộ"môn"phải"lớn"hơn"50000"

CREATE TRIGGER TR_BM_UPD CREATE TRIGGER TR_BM_UPD

AFTER UPDATE OF TRUONGBM ON BOMON AFTER UPDATE OF LUONG ON GIAOVIEN

REFERENCING REFERENCING

NEW ROW AS NewTuple NEW ROW AS NewTuple

OLD ROW AS OldTuple OLD ROW AS OldTuple

FOR EACH ROW FOR EACH ROW

WHEN (50000 >= (SELECT LUONG FROM GIAOVIEN WHEN (NewTuple.LUONG <= 50000 AND NewTuple.MAGV IN (

WHERE MAGV=NewTuple.TRUONGBM)) SELECT TRUONGBM FROM BOMON ))

UPDATE BOMON UPDATE GIAOVIEN

SET TRUONGBM=OldTuple.TRUONGBM SET LUONG=OldTuple.LUONG

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

WHERE TRUONGBM=NewTuple.TRUONGBM WHERE LUONG=NewTuple.LUONG

53&

54&

Transac@on'

Transac@on'(I)'

!  Là"tập"các"lệnh"thực"hiện"một"xử"lý"nào"đó"trong"một"ứng"

!  Giao"tác"phải"đảm"bảo""

-  Tính"nguyên"tố"(atomicity)" -  Tính"nhất"quán"của"CSDL"(consistency)"

dụng"CSDL,"sao"cho" -  Hoặc"là"tất"cả"các"lệnh"đều"được"thực"hiện"thành"công" -  Hoặc"là"không"có"lệnh"nào"được"thực"hiện"

•  Các"RBTV"không"bị"vi"phạm"

–  Trong"khi"thực"hiện"giao"tác" –  Trước"và"sau"khi"thực"hiện"giao"tác"

!  Ví"dụ:"xử"lý"chuyển"tiền"trong"ngân"hàng"

Giao tác Chuyển_tiền

Giảm tiền trong tài khoản người gửi

Tăng tiền trong tài khoản người nhận

Nếu tất cả đều thành công thì hoàn tất giao tác

Ngược lại quay lui giao tác

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Cuối giao tác

55&

56&

Ví'dụ'7'

Ví'dụ'7'(I)'

!  Mỗi"trận"đấu"là"cuộc"thi"đấu"của"đúng"2"đội"

Giao tác Xóa_trận_đấu(ngay, gio)

Giao tác Thêm_trận_đấu(t, s) Với mọi s∈THIDAU (s.NGAY=ngay ∧ s.GIO=gio)

Xóa s khỏi THIDAU Thêm t vào THIDAU

Cuối với mọi Thêm s vào THIDAU Nếu có một thao tác thất bại thì Nếu có một thao tác thất bại thì

Quay lui giao tác Quay lui giao tác

Ngược lại Ngược lại

Hoàn tất giao tác Hoàn tất giao tác

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Cuối nếu Cuối nếu Cuối giao tác Cuối giao tác

57&

58&

Ví'dụ'11'

Ví'dụ'11'(I)'

!  Mỗi"hóa"đơn"phải"có"ít"nhất"một"chi"tiết"hóa"đơn"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

Giao tác Thêm_hóa_đơn Giao tác Thêm_hóa_đơn Thêm HOADON Thêm HOADON Thêm chi tiết thứ 1 vào CTHD Thêm chi tiết thứ 1 vào CTHD Thêm chi tiết thứ 2 vào CTHD Thêm chi tiết thứ 2 vào CTHD … … Nếu có một thao tác thêm thất bại thì Nếu có một thao tác thêm thất bại thì Quay lui giao tác Quay lui giao tác Ngược lại Ngược lại Hoàn tất giao tác Hoàn tất giao tác Cuối nếu Cuối nếu Cuối giao tác Cuối giao tác

59&

60&

Stored'Procedure'

Ví'dụ'7'

!  Các"DBMS"thương"mại"cung"cấp"cách"thức"lưu"trữ"các"hàm"

!  Mỗi"trận"đấu"là"cuộc"thi"đấu"của"đúng"2"đội"

hay"thủ"tục"" -  Được"lưu"trữ"trong"lược"đồ"CSDL" -  Được"sử"dụng"trong"các"câu"lệnh"SQL"

!  Cú"pháp"

CREATE PROCEDURE Thêm_trận_đấu t THIDAU , s THIDAU AS

begin tran Thêm t vào THIDAU If @@error<>0 rollback tran

CREATE PROCEDURE Thêm s vào THIDAU If @@error<>0 rollback tran AS commit tran Khai báo biến cục bộ GO Thân chương trình

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

GO EXEC Thêm_trận_đấu x, y EXEC

61&

62&

Nhận'xét'

!  DBMS"sẽ"kiểm"tra"RBTV"

-  Sau"khi"một"thao"tác"cập"nhật"diễn"ra"trên"CSDL" -  Cuối"mỗi"giao"tác"

!  Nên"cài"đặt"RBTV"ở"đâu"???"

-  DBMS" -  Application"

-  Trigger"quá"nhiều"→"hệ"thống"chậm"chạm" -  Stored"Procedure"→"hiệu"quả"cao"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

©"Bộ"môn"HTTT"/"Khoa"CNTT"/"Trường"ĐH"KHTN"

63&

64&