我有以下数字范围表
Create table Ranges {
Id int identity(1,1) primary key,
RangeFrom int not null,
RangeTo int not null
}
Insert into Ranges(RangeFrom, RangeTo) VALUES (1,4)
Insert into Ranges(RangeFrom, RangeTo) VALUES (5,9)
Insert into Ranges(RangeFrom, RangeTo) VALUES (10,14)
-- here is free space (15 - 19)
Insert into Ranges(RangeFrom, RangeTo) VALUES (20,24)
例如,我想插入一条新记录
Insert into Ranges(RangeFrom, RangeTo) VALUES (15,19) -- Ok
Insert into Ranges(RangeFrom, RangeTo) VALUES (15,30) -- Fail
问题是,在插入之前,我需要检查插入语句中范围之间的数字是否尚未用于表中的任何其他范围。
任何想法 ?
如果 count(*) 是一,那么您可以插入
这是您要问的问题吗?
您可以使用插入触发器根据表数据检查插入的值,如果范围已存在则失败。
但是由于您使用的是存储过程,因此您可以签入过程。像这样的东西:
如果您可以确保仅通过存储过程进行插入,这将起作用。如果有人通过 t-sql 插入,只有触发器可以阻止它。
正如其他人所提到的,触发器可以正常工作。您不需要更改存储过程,只需
INSTEAD OF INSERT
在表上放置一个触发器。触发器将查看插入的 RangeFrom 值是否在任何已经在相同范围内的范围之间,然后对 RangeTo 值执行相同的操作。如果它通过该逻辑,它将插入。
如果失败,它将回滚。请注意,这仅在您像发布的那样进行单独插入时才有效。如果您希望能够插入超过 1 行数据,则需要对此进行调整。