Chào mọi ng, e là thành viên mới, hiện tại e mới học Procedure, Function và Trigger nên muốn nhờ mọi ng giúp 1 tí ạ. Hiện tại e đang có 1 câu hỏi về Trigger như này ạ:
Viết 1 … tư động update tất cả Điểm Trung Bình của bảng Điểm ạ. Tức là k cần làm gì nó cũng tự update ấy ạ. Moi ng giúp e với ạ.
Tự động update tất cả điểm trung bình của bảng điểm
k cần làm gì thì nó vẫn tự update là sao? * đoạn này mình bị nhầm lẫn * chắc bạn nhầm với hành động của trigger, trigger chạy tự động, chứ k phải là k làm gì nó cũng chạy
trigger phân ra 2 loại, dml (thao tác) và ddl (định nghĩa ) trigger
dạng của bạn cần viết là dml , trên bảng DIEM
trigger dml thì có 3 hành động, INSERT , DELETE, UPDATE
bạn làm gì đó với bảng DIEM thì trigger nó mới chạy
ví dụ sau mỗi lần xóa điểm,thêm điểm, sửa điểm 1 môn học thì phải cập nhật lại điểm tb
Thực ra cái này cũng phải xem logic thì mới có hướng viết trigger được. Vì bạn thiết kế mỗi học sinh có quan hệ 1-1 với điểm nên có thể có 1 số action sau:
1- Chỉ có vài điểm như Toán, hoặc Lý, … còn các điểm # null thì vẫn có record và lúc đó có tính trung bình không? Hay phải full 4 điểm thì mới tính.
2- Có delete row trong bảng điểm không?
3- Có cho phép 1 điểm cập nhật thành null không?
4- Ngoài ra, có thể có logic là nếu cập nhật nhưng điểm không đổi thì k cần tính trung bình nữa.
CREATE TRIGGER tr_TrungBinh
ON Diem
FOR UPDATE
AS
BEGIN
//lấy giá trị old và new sau khi update. Trong MSSQL có 2 magic table là inserted và deleted
//khi updated, nó sẽ ghi vào cả 2 bảng này, giờ phải lấy ra và so sánh
//trong MySQL thì chỉ cần gọi new.Toan và old.Toan, nhung với MSSQL phải lấy ra hơi củ chuối
DECLARE @oldToan, @oldLy, @oldHoa, @oldVan int
DECLARE @newToan, @newLy, @newHoa, @newVan int
DECLARE @MaHS varchar(15)
SELECT @oldToan = d.Toan, @oldLy = d.Ly, @oldHoa = d.Hoa, @oldVan = d.Van,
@newToan = i.Toan, @newLy = i.Ly, @newHoa = i.Hoa, @newVan = i.Van,
@maHS = i.MaHS
FROM inserted i
JOIN deleted d on (i.id = d.id)
//chỉ check là có thay đổi, chưa check các case như bị null, bị set về null, ...
IF (@oldToan != @newToan || @oldLy != @newLy || @oldHoa != @newHoa || @oldVan != @newVan)
BEGIN
UPDATE Diem SET DTB = (@newToan + @newLy + @newHoa + @newVan)/4 WHERE MaHS = @MaHS
END
END
GO
Trong đoạn trigger trên có kiểm tra logic là giá trị mới phải # với giá trị cũ, nếu không cần thì chỉ lấy MaHS xong dùng câu lệnh UPDATE là được.
Dạ tức là mình nhập tất cả điểm Toán Lý Hóa Anh vào cho 100 bản ghi rồi xong chỉ cần chạy 1 trigger nó sẽ tự tính hết 100 điểm trung bình chứ k cần update hay gì ấy ạ
Như này thì mình vẫn phải update 1 điểm nào đó thì nó mới tính ĐTB cho mình đúng k ạ?
Theo mình đọc cái bảng SQL này thì để tính điểm trung bình bạn chỉ cần dùng function chứ sao lại dùng trigger. Trigger là là ràng buộc khi INSERT, UPDATE hay DELETE 1 cột nào đó (Ví dụ bạn nhập điểm vào là 11 thì Trigger nó sẽ báo sai).
Trigger chỉ cần kết hợp trong function để kiểm tra điều kiện là các đầu điểm đều được nhập
dạ vâng ạ. Hình như phải dùng function ạ. Để e xem sao ạ. Cô giáo e gợi ý dùng con trỏ ^^
Nếu chỉ cần tính toán điểm trung bình thì làm một cái Query là đủ
UPDATE Diem SET DTB = (Toan + Ly + Hoa + Van)/4
nó sẽ update cả table luôn, kể cả những record đã được tính toán từ trước.
Còn nếu chỉ muốn update 100 cái mới được insert vào thì bảng điểm bạn nên có một id auto-increment, sau đó xem cái id lần cuối là bao nhiêu, rồi dùng:
UPDATE Diem SET DTB = (Toan + Ly + Hoa + Van)/4 WHERE id> @id_lan_cuoi
Chứ cần gì viết procedure / function làm gì.