SQL Server如何创建INSERT触发器校验dbo.student表StudentID合规性
针对SQL Server环境的StudentID校验触发器实现
因为表使用了dbo默认架构,以下方案适配SQL Server数据库,直接满足你的校验需求。
触发器完整代码
CREATE TRIGGER trg_student_check_studentid ON dbo.student INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON; -- 批量校验所有待插入的StudentID格式 IF EXISTS ( SELECT 1 FROM inserted WHERE LEN(StudentID) != 5 -- 固定长度为5位:2位前缀+3位数字 OR LEFT(StudentID, 2) != 'SV' -- 前缀必须为大写SV OR TRY_CAST(RIGHT(StudentID, 3) AS INT) NOT BETWEEN 0 AND 100 -- 后三位数字在000-100范围内,非数字自动校验失败 ) BEGIN RAISERROR('StudentID格式非法,要求为SV后跟000-100的三位数字,合法示例:SV000、SV099、SV100', 16, 1); ROLLBACK TRANSACTION; RETURN; END -- 校验通过后执行实际插入,替换下方字段为你表的实际字段即可 INSERT INTO dbo.student (StudentID, Name, Age, 其他字段) SELECT StudentID, Name, Age, 其他字段 FROM inserted; END
规则说明
- 兼容批量插入场景:一次性插入多条数据时只要有一条不符合规则,全部拦截
- 无需额外判断非数字:
TRY_CAST在转换失败时会返回NULL,自动命中不符合条件的逻辑,适配SQL Server 2012及以上版本 - 如果需要支持小写sv前缀,可将前缀判断改为
UPPER(LEFT(StudentID, 2)) != 'SV'
更高性能的替代方案(无需触发器)
如果没有其他触发器联动逻辑,直接加CHECK约束性能更好,实现更简单:
ALTER TABLE dbo.student ADD CONSTRAINT chk_student_studentid_format CHECK ( LEN(StudentID) = 5 AND LEFT(StudentID, 2) = 'SV' AND TRY_CAST(RIGHT(StudentID, 3) AS INT) BETWEEN 0 AND 100 );
内容的提问来源于stack exchange,提问作者hoangtd
相关产品推荐
相关产品推荐

