触发 INSERT 以验证 SQL 服务器中的输入数据?
Trigger for INSERT to validate input data in SQL Server?
我的问题:
table dbo.student
有 StudentID
喜欢 SV001
.
我如何创建一个触发器来检查插入到 dbo.student
中的数据是否具有以 SV
开头且数字在 000 到 100 范围内的 StudentID
?
示例:SV099
是要插入的有效 ID,而 SV101
是无效的
使用SQL约束:
CHECK (CAST(SUBSTRING(StudentID, 3, LEN(StudentID)) AS int) <= 100)
示例:
CREATE TABLE tb
(
StudentID varchar(10)
CHECK (CAST(SUBSTRING(StudentID, 3, LEN(StudentID)) AS int) <= 100)
);
// test data
INSERT INTO tb VALUES ('sv000'); //valid
INSERT INTO tb VALUES ('sv100'); //valid
INSERT INTO tb VALUES ('sv101'); //invalid
演示在 db<>fiddle
或者如果你想使用触发器:
注意:必须使用inserted
关键字访问刚刚添加的记录
CREATE TRIGGER TriggerStudentID
ON tb
AFTER INSERT
AS
BEGIN
DECLARE @StudentID varchar(10);
SET @StudentID = (SELECT TOP 1 StudentID FROM inserted);
IF (CAST(SUBSTRING(@StudentID, 3, LEN(@StudentID)) AS int) > 100)
ROLLBACK TRANSACTION
END
演示在 db<>fiddle.
或者您可以使用以下触发器
Create Trigger TriggerStudentID
On tb
AFTER INSERT
As
Begin
Declare @StudentID varchar(10);
DECLARE my_Cursor CURSOR FOR SELECT StudentID FROM INSERTED;
OPEN my_Cursor;
FETCH NEXT FROM my_Cursor INTO @StudentID;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM my_Cursor INTO @StudentID;
If (CAST(SUBSTRING(@StudentID,3,LEN(@StudentID)) AS int) > 100)
RollBack Transaction
END
CLOSE my_Cursor;
DEALLOCATE my_Cursor;
END
演示在 db<>fiddle.
我的问题:
table dbo.student
有 StudentID
喜欢 SV001
.
我如何创建一个触发器来检查插入到 dbo.student
中的数据是否具有以 SV
开头且数字在 000 到 100 范围内的 StudentID
?
示例:SV099
是要插入的有效 ID,而 SV101
是无效的
使用SQL约束:
CHECK (CAST(SUBSTRING(StudentID, 3, LEN(StudentID)) AS int) <= 100)
示例:
CREATE TABLE tb
(
StudentID varchar(10)
CHECK (CAST(SUBSTRING(StudentID, 3, LEN(StudentID)) AS int) <= 100)
);
// test data
INSERT INTO tb VALUES ('sv000'); //valid
INSERT INTO tb VALUES ('sv100'); //valid
INSERT INTO tb VALUES ('sv101'); //invalid
演示在 db<>fiddle
或者如果你想使用触发器:
注意:必须使用inserted
关键字访问刚刚添加的记录
CREATE TRIGGER TriggerStudentID
ON tb
AFTER INSERT
AS
BEGIN
DECLARE @StudentID varchar(10);
SET @StudentID = (SELECT TOP 1 StudentID FROM inserted);
IF (CAST(SUBSTRING(@StudentID, 3, LEN(@StudentID)) AS int) > 100)
ROLLBACK TRANSACTION
END
演示在 db<>fiddle.
或者您可以使用以下触发器
Create Trigger TriggerStudentID
On tb
AFTER INSERT
As
Begin
Declare @StudentID varchar(10);
DECLARE my_Cursor CURSOR FOR SELECT StudentID FROM INSERTED;
OPEN my_Cursor;
FETCH NEXT FROM my_Cursor INTO @StudentID;
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM my_Cursor INTO @StudentID;
If (CAST(SUBSTRING(@StudentID,3,LEN(@StudentID)) AS int) > 100)
RollBack Transaction
END
CLOSE my_Cursor;
DEALLOCATE my_Cursor;
END
演示在 db<>fiddle.