在 sc 表上創建兩個觸發器 sc_ai 和 sc_au,當插入資料后或更新資料后,如果有人選修的課程多于 2 門,就中斷操作并自動事務回滾。求大佬講一下怎么中斷操作啊?
uj5u.com熱心網友回復:
USE tempdb
GO
IF OBJECT_ID('sc') IS NOT NULL
DROP TABLE sc
GO
-- 課程表,為簡單起見以 姓名 和 課程名 作為標識,
-- 實際應用應該 學號 和 課程號
CREATE TABLE sc(
scId INT PRIMARY KEY,
stuName NVARCHAR(10),
courseName NVARCHAR(10),
score INT
)
GO
SET NOCOUNT ON
INSERT INTO sc(scId, stuName,courseName,score) VALUES(1,'小明','語文',88)
INSERT INTO sc(scId, stuName,courseName,score) VALUES(2,'小明','數學',68)
INSERT INTO sc(scId, stuName,courseName,score) VALUES(3,'小紅','語文',76)
INSERT INTO sc(scId, stuName,courseName,score) VALUES(4,'小劉','英文',91)
GO
-------------- 以上為測驗表及測驗資料 -------------
------------- 觸發器不需要 2 個, 一個就夠了 ------
-- =============================================
-- Author: yenange
-- Create date: 2019-10-7
-- Description: 當插入資料后或更新資料后,
-- 如果有人選修的課程多于 2 門,就中斷操作并自動事務回滾
-- =============================================
CREATE TRIGGER trig_sc_I_U
ON dbo.sc
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF (
SELECT COUNT(1) FROM
(
SELECT sc.stuName,sc.courseName FROM sc INNER JOIN INSERTED ON sc.stuName=INSERTED.stuName
EXCEPT
SELECT stuName,courseName FROM DELETED
UNION
SELECT stuName,courseName FROM INSERTED
) AS t
) > 2
BEGIN
ROLLBACK TRAN;
RAISERROR ('選修的課程不能多于 2 門',16,1);
END
END
GO
--將小明的 數學 改為 英文
UPDATE sc SET courseName = '英文' WHERE scId=2
GO
--再插入一條小明的記錄
INSERT INTO sc(scId, stuName,courseName,score) VALUES(5,'小明','歷史',68)
GO
/*
訊息 50000,級別 16,狀態 1,程序 trig_sc_I_U,行 27 [批起始行 50]
選修的課程不能多于 2 門
*/
--插入一條小劉的記錄
INSERT INTO sc(scId, stuName,courseName,score) VALUES(6,'小劉','歷史',53)
GO
SELECT * FROM sc
/*
scId stuName courseName score
1 小明 語文 88
2 小明 英文 68
3 小紅 語文 76
4 小劉 英文 91
6 小劉 歷史 53
*/
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/133758.html
標籤:疑難問題
上一篇:RMI
下一篇:備份
