Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Lỗi NULL cột Diem_Thi /Quan_Ly_Sinh_Vien sau khi thực thi & nhập liệu các TRIGGER/PROC/FUNC
Chào HowKTeam!
Sau khi mình làm FUNC, PROC, TRIGGE cho các bài tập đầy đủ, thì mình mở Bảng Điểm để kiểm tra lại các lệnh truy vấn có sai sót gì ko, thì phát hiện ra cột Diem_Thi của bảng Điểm bị thay đổi NULL toàn bộ, sau đó mình có nhập lại điểm, phù hợp theo các TRIGGE đã tạo, nhưng khi tắt & mở lại bảng Điểm thì vẫn NULL, 1 số dòng thì lại có nhưng kết quả ko đúng như ban đầu mình đã nhập.
Hình ảnh lỗi:
https://drive.google.com/open?id=1W8FonI9V4zk4LvQ5JI7ZRxPNbn064uEi
Câu truy vấn FUNC:
CREATE FUNCTION TVDF_Lam_Tron_Diem_Thi
(@Diem_Ban_Dau FLOAT)
RETURNS FLOAT
AS
BEGIN
DECLARE @Diem_Lam_Tron FLOAT;
SET @Diem_Lam_Tron = FLOOR(@Diem_Ban_Dau);
IF (@Diem_Ban_Dau - @Diem_Lam_Tron < 0.25)
SET @Diem_Ban_Dau = @Diem_Lam_Tron
ELSE IF (@Diem_Ban_Dau - @Diem_Lam_Tron >= 0.25 AND @Diem_Ban_Dau - @Diem_Lam_Tron < 0.75)
SET @Diem_Ban_Dau = @Diem_Lam_Tron + 0.5
ELSE
SET @Diem_Ban_Dau = @Diem_Lam_Tron + 1
RETURN @Diem_Ban_Dau
END
GO
Câu truy vấn TRIGGER:
CREATE TRIGGER TVDT_Nhap_Moi_Diem_Thi
ON dbo.Ket_Qua
FOR INSERT, UPDATE
AS
BEGIN
UPDATE dbo.Ket_Qua
SET Diem_Thi = dbo.TVDF_Lam_Tron_Diem_Thi(INS.Diem_Thi) FROM dbo.Ket_Qua AS KQ
LEFT JOIN Inserted AS INS ON INS.MaSV = KQ.MaSV
--AND INS.MaMH = KQ.MaMH
--AND INS.Lan_Thi = KQ.Lan_Thi
--AND INS.Diem_Thi = KQ.Diem_Thi
IF EXISTS (SELECT * FROM Inserted
WHERE Inserted.Diem_Thi > 10 OR Inserted.Diem_Thi < 0)
BEGIN
RAISERROR(N'Điểm thi được chấm theo thang điểm 10 !', 16, 1)
ROLLBACK TRANSACTION
END
END
GO
Rất mong các bạn hỗ trợ, chia sẽ. Cảm ơn HowKTeam rất nhiều.
Mình đã tìm ra được lỗi, do mình thiếu mệnh đề WHERE trong câu truy vấn UPDATE:
ALTER TRIGGER TVDT_Nhap_Moi_Diem_Thi
ON dbo.Ket_Qua
FOR INSERT, UPDATE
AS
BEGIN
UPDATE dbo.Ket_Qua
SET Diem_Thi = dbo.TVDF_Lam_Tron_Diem_Thi(INS.Diem_Thi) FROM dbo.Ket_Qua AS KQ
LEFT JOIN Inserted AS INS ON INS.MaSV = KQ.MaSV
AND INS.MaMH = KQ.MaMH
AND INS.Lan_Thi = KQ.Lan_Thi
AND INS.Diem_Thi = KQ.Diem_Thi
WHERE KQ.MaSV=INS.MaSV
IF EXISTS (SELECT * FROM Inserted
WHERE Inserted.Diem_Thi > 10
OR Inserted.Diem_Thi < 0)
BEGIN
RAISERROR(N'Điểm thi được chấm theo thang điểm 10 !', 16, 1)
ROLLBACK TRANSACTION
END
END
GO
Cảm ơn các bạn rất nhiều.