Professional Documents
Culture Documents
CHỦ ĐỀ
TÀI LIỆU THỰC HÀNH CSDL Nguyễn Minh Nhựt – HTCL2017 -17520867
A. TRIGGER
Trigger là một thủ tục SQL được thực thi ở phía server khi có một sự kiện
insert, update, delete.
Trigger dùng để ràng buộc chặt chẽ dữ liệu nhiếu quan hệ.
Cách để thực hiện ràng buộc toàn vẹn trên nhiều quan hệ
Bước 1: Xác định, bối cảnh, nội dung, bảng tầm ảnh hưởng
Bước 2: Xác định tham số, bảng tham gia vào trigger
Bước 3: Viết trigger, xác định trigger có liên quan đến nhiều record
và sử dụng con trỏ hay không?
Bước 4: Kiểm tra câu trigger bằng các trường hợp
Cách xác định ràng buộc toàn vẹn, bối cảnh nội dung, bảng tầm ảnh hưởng
Cho lược đồ CSDL sử dụng cho tất cả bài thực hành về trigger
KHACHHANG (MaKH, HoTen, NgaySinh, SoDT, GioiTinh)
Tân từ: Khách hàng có mã khách hàng (MaKH), họ và tên khách hàng
(HoTen), ngày sinh của khách hàng (NgaySinh), số điện thoại (SoDT), giới
tính của khách hàng (GioiTinh).
DICHVU (MaDV, TenDV, LoaiDV, Phi, MoTa)
Tân từ: Nhà cung cấp có rất nhiều dịch vụ khác nhau để khách hàng đăng kí
để phân biệt các dịch vụ với nhau người ta thông qua mã dịch vụ (MaDV),
ngoài ra còn các thông tin khác là tên dịch vụ (TenDV), loại dịch vụ mà nhà
cung cấp (LoaiDV) loại dịch vụ gồm 3 loại chủ yếu là {Internet, TV, Thuê bao
điện thoại}, phí phải trả cho dịch vụ đó (Phi), mô tả ngắn gọn về dịch vụ
(MoTa).
1
TRANGTHAI varchar(5),
CONSTRAINT PK_CTHD PRIMARY KEY(MAHD,MADV)
)
BẢNG DỊCH VỤ
INSERT INTO DICHVU VALUES('DV01','Internet toc do cao','Internet',220000,'Toc do
upload: 5Mb/s, download: 10Mb/s')
INSERT INTO DICHVU VALUES('DV02','Internet toc do thuong','Internet',165000,'Toc
do upload: 1Mb/s, download: 5Mb/s')
INSERT INTO DICHVU VALUES('DV03','MyTV++','Truyen hinh cap',200000,'Xem duoc 200
kenh HD')
select * from dichvu
Vì một hợp đồng chỉ thuộc về một khách hàng nên khi thêm mới hoặc sửa
hợp đồng KHÔNG dùng con trỏ (cursor), nếu chúng ta sửa bảng khách
hàng ảnh hưởng đến một loạt hợp đồng thì sẽ dùng con trỏ (cursor) để
giải quyết vấn đề đó.
GO
CREATE TRIGGER <TenTrigger> ON <Bang>
FOR [INSERT, UPDATE, DELETE]
AS
BEGIN
……
END
Thành công!
Câu trigger hoàn chỉnh
GO
CREATE TRIGGER themsua_hdong ON HOPDONG
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @NGAYKY SMALLDATETIME, @NGAYSINH SMALLDATETIME,
@MAKH int
SELECT @MAKH =MAKH, @NGAYKY =NGAYKY
FROM INSERTED
6
Trường hợp 2: Ngày hợp đồng > ngày sinh khách hàng không báo lỗi và
được lưu vào CSDL
7
B. CURSOR
Con trỏ cursor hoạt động linh hoạt cho những câu trigger khi sửa một
record ảnh hưởng đến nhiều record giả sử ta sửa ngày sinh của khách
hàng mà khách hàng đó kí nhiều hợp đồng thì phải check hết hợp đồng
của khách hàng đó nên sử dụng con trỏ
Câu lệnh khai báo con trỏ
OPEN cursorDK
FETCH NEXT FROM cursorDK into @MAHD
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @NGAYKY = NGAYKY
FROM HOPDONG
WHERE MAHD = @MAHD
IF(@NGAYKY < @NGAYSINH)
BEGIN
PRINT 'ERROR: LOI NGAY DANG KI!'
ROLLBACK TRANSACTION
END
DEALLOCATE cursorTOUR
GO
CREATE TRIGGER sua_khachhang ON KHACHHANG
FOR UPDATE
AS
BEGIN
DECLARE @NGAYKY SMALLDATETIME, @NGAYSINH SMALLDATETIME,
@MAKH int, @MAHD varchar(10)
SELECT @MAKH =MAKH, @NGAYSINH = NGAYSINH
FROM INSERTED
DECLARE cursorDK CURSOR FOR
SELECT MAHD FROM HOPDONG WHERE MAKH = @MAKH
OPEN cursorDK
FETCH NEXT FROM cursorDK into @MAHD
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @NGAYKY = NGAYKY
FROM HOPDONG
WHERE MAHD = @MAHD
IF(@NGAYKY < @NGAYSINH)
BEGIN
PRINT 'ERROR: LOI NGAY DANG KI!'
ROLLBACK TRANSACTION
END
ELSE
BEGIN
FETCH NEXT FROM cursorDK -- Đọc dòng tiếp
INTO @MAHD
END
END
CLOSE cursorDK
PRINT 'Thanh cong'
DEALLOCATE cursorDK
END
9
Kiểm thử
SELECT * FROM HOPDONG
UPDATE ngày sinh của khách hàng 2 là ngày ‘27/7/2020’ sẽ báo lỗi