Bài Thực hành Số 11
Mục tiêu: Tạo triggers
CSDL mẫu : ToyWorld, HeadHunt, Pubs
A. CSDL ToyWorld
1. Thực tập hàm RAISERROR
a. Xem nội dung bảng sysmessages của CSDL master. Thêm 1 message của
người dùng vào bảng sysmessages bằng lệnh sau:
USE master
EXEC sp_addmessage 50001, 16, ‘Mặt hàng có tên %s đã có trong bảng
%s.'
b. Sử dụng thông báo lỗi vùa tạo bằng lệnh RAISERROR như sau:
declare @s1 char(10) , @s2 varchar(20)
set @s2 =’Toys’
set @s1 = 'Large Duck'
raiserror (50001, 16, 1, @s1,@s2)
2. Khi có một hóa đơn mới, chi tiết của hóa đơn được lưu trữ trong bảng
OrderDetail. Hệ thống phải giảm số lượng tồn kho của những đồ chơi nào
được mua trong hóa đơn bằng với số lượng được đặt mua. Hãy tạo trigger
cho việc cập nhật tự động này khi phát sinh một hoá đơn mới
3. Nếu khách mua hàng (shopper) thay đổi số lượng mua trong hóa đơn,thì
số tiền mua cũng phải tự động thay đổi theo. Công thức tính như sau:
Toy cost = Quantity * Toy Rate. Hãy tạo trigger cho lệnh cập nhật này
4. Khi khách hàng quyết định gói quà cho 1 món đồ chơi nào đó và đã chọn
được kiểu gói quà thích hợp, thì kiểu gói này phải được cập nhật bằng
lệnh UPDATE vào trường cWrapperID của bảng Order details. Hãy tạo 1
trigger cho lệnh này để thực hiện tự động các bước tiếp theo sau khi lệnh
UPDATE trên được thực hiện:
• Thay đổi trường cGiftWrap từ ‘N’ sang ‘Y’
• Cộng thêm phí gói quà mWrapperRate (từ bảng Wrapper) vào
thành tiền của món đồ chơi đó theo công thức sau:
Toycost = Toycost + mWrapperRate
AS
SELECT cShopperID, vFirstName + ' ' + vLastName AS CombinedName
FROM Shopper
Hãy tạo 1 trigger loại INSTEAD OF INSERT cho view vừa tạo, nếu đã có quy
ước là khi dùng view để nhập 1 khách mua hàng mới thì trường CombineName
luôn được nhập theo định dạng sau 'first_name;last_name'
B. CSDL Headhunt
1. Khi có 1 nhân viên nghỉ việc thì cần cập nhật ngày nghỉ việc (Resignation
Date) vào bảng Employee. Hãy tạo trigger cho lệnh này để thực hiện tự
động việc giảm đi 1 cho trường quân số hiện hành (iCurrentStrength) của
bảng Position
C. CSDL Pubs
1. Khi phát sinh 1 hoá đơn bán sĩ mới, một bản ghi mới được nhập vào bảng
sales, số lượng bán này cần được cộng dồn vào trường ytd_sales của
bảng titles. Hãy tạo trigger cho lệnh insert của bảng sales
2
2. Hãy tạo 1 trigger để ngăn không cho phép xoá bất kỳ bản ghi nào của
bảng titles, authors và publishers
Bài tập làm thêm
Kiểm tra hoạt động của các bảng magic có tên là inserted và deleted theo các
bước sau:
- Tạo bảng tên là Test_Trigger có các trường sau:
Tên trường Kiểu dữ liệu Thuộc tính
c_date Datetime Not null
Old_ID Char(6) Not null
New_ID Char(6) Not null
- Tạo trigger sau:
create trigger update_trigger
on shopper for update
as