Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
1,34 MB
Nội dung
9/10/2019 Chương Ràng Buộc Dữ Liệu Nội dung Giới thiệu RBTV SQL Sever User-defined Constraint User-defined Constraint 9/10/2019 Constraints Check constraints Default constraints Rules Defaults Primary constraints Unique constrains Entity Domain Referential Integrity User-defined Foreign key constraints … User-defined Constraint Ví dụ: Cho CSDL gồm bảng: DonHang (MaDH,…,NgayDatHang) PhieuGH (MaPG, MaDH,…,NgayGiaoHang) RBTV : Ngày giao hàng phải sau ngày đặt hàng không trễ tháng kể từ ngày đặt hàng 9/10/2019 Mục tiêu Chuyển trách nhiệm kiểm tra RBDL cho SQL Server làm cách tự động có thay đổi DL (Con người khơng cần kiểm tra thủ công) Nội dung Giới thiệu RBTV SQL Sever Qui tắc chung User-defined Constraint 9/10/2019 RBTV SQL server Rules Primary Foreign Check Unique Default Defaults Trigger Rule CREATE RULE ur_LuongDuong AS @Luong>0 ur_LuongDuong sp_bindRule NHANVIEN MaNV … Luong NV1 … 10000 NV2 … 30 NV3 … -40 sp_unbindRule sp_bindRule ‘ur_LuongDuong’,’NhanVien.Luong’ sp_unbindRule ‘NhanVien.Luong’ 9/10/2019 SQL constraints Có cách tạo Trong câu lệnh tạo bảng Ràng buộc thuộc tính Ràng buộc bảng Ngoài câu lệnh tạo bảng RB thuộc tính Chỉ áp dụng CREATE TABLE Persons cho RB thuộc tính ( P_Id int NOT NULL UNIQUE, LastName varchar(255) NOT NULL, FirstName varchar(255), Address varchar(255), City varchar(255) ) 9/10/2019 RB bảng CREATE TABLE Persons ( P_Id int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Áp dụng cho RB có Address varchar(255), Cho phép đặt thuộc tính tên ràng buộc City varchar(255), CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName) ) RB bên bảng ALTER TABLE Persons ADD CONSTRAINT Uc_Person UNIQUE (P_id, LastName) Cho phép đặt tên ràng buộc Áp dụng cho RB có thuộc tính 9/10/2019 Vơ hiệu hóa RB Vơ hiệu hóa { Check | Foreign } constraint có hiệu lực Alter table Nocheck constraint {ALL | constraint_name [,…n]} Ví dụ : ALTER TABLE SINHVIEN NOCHECK CONSTRAINT C_Phai, chk_Nam Lưu ý: Primary, Unique, Default ln trạng thái hoạt động Hiệu lực hóa RB Hiệu lực hóa { Check | Foreign } constraint hiệu lực Alter table Check constraint {ALL | constraint_name [,…n]} Ví dụ : ALTER TABLE SINHVIEN CHECK CONSTRAINT C_Phai, chk_Nam 9/10/2019 Nội dung Giới thiệu RBTV SQL Sever User-defined Constraint User-defined Constraint User-defined Constraint Mục tiêu Cài đặt RBTV phức tạp Các qui tắc nghiệp vụ Đặc điểm Là thủ tục đặc biệt Khơng có tham số Thuộc bảng Hoạt động Được kích hoạt tự động thông qua thao tác (Insert, Update, Delete) Dựa bảng tạm: Inserted, Deleted 9/10/2019 User-defined Constraint Inserted: Khi có thay đổi DL, có dòng thêm vào bảng X Các dịng đưa vào bảng inserted (có cấu trúc giống X) Deleted: Khi có thay đổi DL, có dịng bị xóa Các dịng đưa vào bảng deleted (cấu trúc giống X) User-defined Constraint Cú pháp Quan hệ bị ảnh hưởng Create trigger tên_trigger On {tên_bảng|tên_view} {For| After| Instead of } { [delete] [,] [insert] [,] [update] } As Thao tác bị ảnh hưởng Begin { lệnh T-sql } Xữ lí có vi End phạm RBTV Go 9/10/2019 User-defined Constraint Nếu thao tác insert/ delete/ update thực nhiều dòng, trigger gọi lần Bảng inserted/ deleted chứa nhiều dòng User-defined Constraint For | After: Trigger gọi thực sau thao tác delete/ insert/ update tương ứng thực thành công bảng • Các dịng thêm chứa đồng thời bảng liệu bảng inserted • Các dịng bị xoá nằm bảng deleted (đã bị xoá khỏi bảng liệu) Có thể xử lý quay lui thao tác thực lệnh rollback transaction 10 9/10/2019 User-defined Constraint Instead of: Trigger gọi thực thay cho thao tác delete/ insert/ update tương ứng • Các dịng thêm chứa bảng inserted • Các dịng bị định xố nằm đồng thời bảng deleted bảng liệu (dữ liệu chưa bị xoá) Trigger Instead of thường dùng để xử lý cập nhật khung nhìn (view) User-defined Constraint Lưu ý: Trên bảng định nghĩa nhiều trigger for/after cho thao tác… Trong thân trigger, sử dụng hàm Update(tên_cột) để kiểm tra xem việc cập nhật/ insert thực cột • Update(tên_cột) = true : có thực cập nhật cột tên_cột 11 9/10/2019 User-defined Constraint Các bước xây dựng trigger Bước 1: xác định bảng tầm ảnh hưởng Bước 2: với quan hệ bảng tầm ảnh hưởng xác định xử lí thao tác vi phạm RBTV Bước 3: thao tác có xử lí viết trigger User-defined Constraint Ví dụ: Cho CSDL có bảng: DonHang (MaDH,…,NgayDatHang) PhieuGH (MaPG, MaDH,…,NgayGiaoHang) RBTV : Ngày giao hàng phải sau ngày đặt hàng không trễ tháng (30 ngày) kể từ ngày đặt hàng 12 9/10/2019 User-defined Constraint Bảng tầm ảnh hưởng insert delete update DonHang (NgayDatHang) PhieuGH (MaDH,NgayGiaoHang) User-defined Constraint Create trigger trg_DH_PGH On DonHang For update As Begin If exists (select * from Inserted I, PhieuGH P Where P.MaDH=I.MaDH And (P.NgayGiaoHang < I.NgayDatHang Or Datediff(MM, I.NgayDatHang, P.NgayGiaoHang) > 1)) Begin Raiserror(‘Ngay dat hang khong hop le’,0,1) Rollback transaction End End Vi phạm RBTV nên phải hủy bỏ thay đổi, trở trạng thái ban đầu 13 9/10/2019 User-defined Constraint Update DONHANG Set NgayDatHang = ’18/5/2002’ Where MaDH = ‘DH1’ INSERTED MaDH … NgayDatHang DONHANG MaDH … NgayDatHang DH1 … 18/3/2002 18/5/2002 DH2 … 1/2/2001 Vi phạm RBTV DELETED MaDH … NgayDatHang PhieuGH MaPG MaDH … PG1 DH1 PG2 NgayGiaoHang … 15/4/2002 … 10/4/2004 User-defined Constraint Update DONHANG Set NgayDatHang = ’18/5/2002’ Where MaDH = ‘DH1’ DONHANG INSERTED MaDH … DH1 NgayDatHang … 18/1/2002 MaDH … NgayDatHang DH1 … 18/3/2002 DH2 … 1/2/2001 DELETED MaDH … DH1 … PhieuGH MaPG MaDH … PG1 PG2 DH1 NgayDatHang 18/3/2002 NgayGiaoHang … 15/4/2002 … 10/4/2004 14 9/10/2019 User-defined Constraint Bảng tầm ảnh hưởng insert delete update DonHang (NgayDatHang) PhieuGH (MaDH,NgayGiaoHang) Viết gộp Viết riêng User-defined Constraint Create trigger trg_PGH On PhieuGH For update, Insert As Begin If exists(select * from Inserted I, DonHang D Where I.MaDH=D.MaDH And (I.NgayGiaoHang < D.NgayDatHang Or Datediff(MM, D.NgayDatHang, I.NgayGiaoHang) > 1)) Begin Raiserror(‘Ngay dat hang khong hop le’,0,1) Rollback transaction End End Vi phạm RBTV nên phải hủy bỏ thay đổi, trở trạng thái ban đầu 15 9/10/2019 User-defined Constraint Thay đổi nội dung trigger: Thay từ khóa create lệnh tạo trigger từ khóa alter User-defined Constraint Alter trigger trg_DH_PGH On DonHang For update, Insert As Begin If exists(select * from Insreted I, PhieuGH P Where P.MaDH=I.MaDH And (P.NgayGiaoHang < I.NgayDatHang Or Datediff(MM, I.NgayDatHang, P.NgayGiaoHang) > 1)) Begin Raiserror(‘Thao tac da bi huy’,16,1) Rollback transaction End End 16 9/10/2019 User-defined Constraint Xóa trigger Drop trigger tên_trigger_cần _xóa [,…n] Ví dụ: Drop trigger trg_DH_PGH Nested trigger Định nghĩa Nested trigger (recursive trigger) trigger kích hoạt làm trigger khác kích hoạt Hệ quản trị hỗ trợ tối đa 32 mức Cú pháp: EXEC SP_CONFIGURE ‘Nested_Triggers', GO RECONFIGURE 17 9/10/2019 Lược đồ CSDL SinhVien (MaSV, HoTen, DiemTB, MaLop, NamSinh, NamBD, NamKT, TinhTrang) LopHoc (MaLop, MaKhoa, SiSo) Khoa (MaKhoa, TenKhoa, NamThanhLap) MonHoc (MaMH, TenMonHoc, SoChi, MaKhoa) KetQua (MaSV, MaMH, LanThi, Diem) Lược đồ CSDL 18 9/10/2019 Bài tập Sinh viên học môn khoa mở Sinh viên thi lại điểm lần thi sau < số lần thi < 3 Số lượng sinh viên (nếu có) số sinh viên lớp Xóa sinh viên phải xóa tất tham chiếu đến sinh viên Điểm trung bình (nếu có) phải tổng điểm / tổng tín Bài tập Sinh viên nhập học từ 18 đến 22 tuổi Năm bắt đầu học sinh viên phải nhỏ năm kết thúc lớn năm thành lập khoa Tình trạng sinh viên ‘Đã tốt nghiệp’ điểm trung bình >=5.0 năm kết thúc < năm hành Tình trạng ‘Đang học’ năm kết thúc >= năm hành Tình trạng ‘Bị thơi học’ điểm trung bình năm hành 19 9/10/2019 Thank You! www.themegallery.com 20