You are on page 1of 6

Bài tập 1: Cho cơ sở dữ liệu về quản lý học sinh (file QLHocSinh.

sql):
1. Viết một Trigger gắn với bảng DIEM dựa trên sự kiện Insert, Update để tự động
cập nhật
điểm trung bình của học sinh khi thêm mới hay cập nhật bảng điểm
Điểm trung bình= ((Toán +Văn)*2+Lý+Hóa)/6
ALTER TABLE DSHS add DiemTB float

CREATE OR ALTER TRIGGER updateDiemTb


ON DIEM
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE DIEM
SET DiemTB = ((Toan + Van) * 2 + Ly + Hoa) / 6
WHERE MaHS IN (SELECT MaHS FROM inserted);
END;

Insert DSHS(MAHS,HO,TEN,NU,NGAYSINH,MALOP) values (1,'Nguyen Van','B',0,'2000-02-


03','10A2')

Insert DIEM(MAHS,TOAN,LY,HOA,VAN) values ('1',7,8,9,7)

select * from DSHS

2. Viết một Trigger gắn với bảng DIEM dựa trên sự kiện Insert, Update để tự động
xếp loại
học sinh, cách thức xếp loại như sau
- Nếu Điểm trung bình>=5 là lên lớp, ngược lại là lưu ban
CREATE OR ALTER TRIGGER updateXepLoaiHS
ON DIEM
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE DSHS
SET XepLoai = CASE WHEN DSHS.DiemTB >= 5 THEN N'Lên lớp' ELSE 'Lưu ban' END
FROM DSHS INNER JOIN inserted ON DSHS.MaHS = inserted.MaHS;
END;
Insert DIEM(MAHS,TOAN,LY,HOA,VAN) values ('ab125',7,8,9,7)

select * from DSHS

3. Viết một Trigger gắn với bảng DIEM dựa trên sự kiện Insert, Update để tự động
xếp loại
học sinh, cách thức xếp loại như sau
- Xét điểm thấp nhất (DTN) của các 4 môn
- Nếu DTB>=5 và DTN>=4 là “Lên Lớp”, ngược lại là lưu ban

CREATE OR ALTER TRIGGER updateDTNHS


ON DIEM
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE DSHS
SET XepLoai = CASE WHEN DSHS.DiemTB >= 5 AND (SELECT MIN(v) FROM (VALUES (Toan),
(Van), (Ly), (Hoa)) AS value(v)) >= 4 THEN 'Lên lớp' ELSE 'Lưu ban' END
FROM DSHS JOIN inserted ON DSHS.MaHS = inserted.MaHS;
END;

Insert DIEM(MAHS,TOAN,LY,HOA,VAN) values ('12121',2,8,9,9)

select * from DSHS

4. Viết một trigger xóa tự động bản ghi về điểm học sinh khi xóa dữ liệu học sinh
đó trong DSHS

CREATE OR ALTER TRIGGER DeleteTuDong


ON DSHS
FOR DELETE
AS
BEGIN
DELETE FROM DIEM
WHERE MaHS IN (SELECT MaHS FROM deleted);
END;

DELETE FROM DIEM WHERE MAHS ='12121';

select * from DSHS

Bài tập 2:
1. Viết truy vấn tạo bảng doanh thu (tDoanhThu)
CREATE TABLE tDoanhThu (
MaDK VARCHAR(255),
LoaiPhong VARCHAR(255),
SoNgayO INT,
ThucThu FLOAT
);

2. Tạo Trigger tính tiền và điền tự động vào bảng tDoanhThu như sau:
Các trường lấy thông tin từ các bảng và các thông tin sau:
Trong đó:
(a) Số Ngày Ở= Ngày Ra – Ngày Vào
(b) ThucThu: Tính theo yêu cầu sau:
Nếu Số Ngày ở <10 Thành tiền = Đơn Giá * Số ngày ở
Nếu 10 <=Số Ngày ở <30 Thành Tiền = Đơn Giá* Số Ngày ở * 0.95 (Giảm5%)
Nếu Số ngày ở >= 30 Thành Tiền = Đơn Giá* Số Ngày ở * 0.9 (Giảm10%)
CREATE TRIGGER trg_After_Insert
ON tDangKy
AFTER INSERT
AS
BEGIN
DECLARE @SoNgayO int, @DonGia float, @ThucThu float;
DECLARE @MaDK int, @LoaiPhong nvarchar(50), @NgayVao datetime, @NgayRa datetime;

SELECT @MaDK = MaDK, @LoaiPhong = LoaiPhong, @NgayVao = NgayVao, @NgayRa = NgayRa


FROM inserted;
SELECT @DonGia = DonGia FROM tLoaiPhong WHERE LoaiPhong = @LoaiPhong;

SET @SoNgayO = DATEDIFF(DAY, @NgayVao, @NgayRa);

IF (@SoNgayO < 10)


SET @ThucThu = @DonGia * @SoNgayO;
ELSE IF (@SoNgayO >= 10 AND @SoNgayO < 30)
SET @ThucThu = @DonGia * @SoNgayO * 0.95;
ELSE
SET @ThucThu = @DonGia * @SoNgayO * 0.9;

INSERT INTO tDoanhThu(MaDK, LoaiPhong, SoNgayO, ThucThu)


VALUES (@MaDK, @LoaiPhong, @SoNgayO, @ThucThu);
END;

select* from tDoanhThu


3. Thêm trường DonGia vào bảng tDangKy, tạo trigger cập nhật tự động cho
trường này.
ALTER TABLE tDangKy ADD DonGia float

CREATE OR ALTER TRIGGER updateDonGia


ON tDangKy
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE tDangKy
SET DonGia = (SELECT DonGia FROM tLoaiPhong WHERE tLoaiPhong.LoaiPhong =
inserted.LoaiPhong)
FROM inserted
WHERE inserted.MaDK = tDangKy.MaDK;
END;

INSERT INTO tDangKy (MaDK, SoPhong, NgayVao, NgayRa,LoaiPhong)


VALUES (100, 201, '2023-11-02', '2023-11-10', 'A');

select * from tDangKy

4. Thêm trường tổng tiêu dùng (TongTieuDung) và bảng khách hàng và tính tự
động tổng tiền khách hàng đã trả cho khách sạn mỗi khi thêm, sửa, xóa bản
tDangKy

ALTER TABLE tChiTietKH


ADD TongTieuDung MONEY;

CREATE OR ALTER TRIGGER UpdateTongTieuDung


ON tDangKy
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE tChiTietKH
SET TongTieuDung = (SELECT SUM(tDoanhThu.ThucThu)
FROM tDoanhThu
WHERE tDoanhThu.MaDK = tChiTietKH.MaDK)
END;
INSERT INTO tDangKy (MaDK, SoPhong, LoaiPhong, NgayVao, NgayRa)
VALUES ('017', '601', 'B', '2023-11-04', '2023-11-10');

select * from tChiTietKH

You might also like