Eu tenho a seguinte tabela de intervalos de números
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)
E eu quero inserir um novo registro por exemplo
Insert into Ranges(RangeFrom, RangeTo) VALUES (15,19) -- Ok
Insert into Ranges(RangeFrom, RangeTo) VALUES (15,30) -- Fail
A questão é que antes da inserção preciso verificar se os números entre o intervalo na instrução de inserção já não são usados em nenhum outro intervalo da tabela.
Qualquer ideia ?
Se count(*) for um, então você pode inserir
É essa a pergunta que você está fazendo?
Você pode usar um gatilho de inserção para verificar os valores inseridos nos dados da tabela e falhar se o intervalo já existir.
Mas, como você está usando um Stored Proc, pode verificar no proc. Algo assim:
Isso funcionará se você puder garantir que as inserções ocorram apenas por meio do procedimento armazenado. Se alguém inserir via t-sql, apenas o gatilho poderá impedir isso.
Como outros já mencionaram, um gatilho funcionaria bem. Você não precisa alterar o procedimento armazenado, basta colocar um
INSTEAD OF INSERT
gatilho na tabela.O gatilho irá verificar se o valor RangeFrom que está sendo inserido está entre algum dos intervalos já existentes no mesmo e, em seguida, fará o mesmo para o valor RangeTo. Se passar dessa lógica, ele vai inserir.
Se falhar, ele reverterá. Observe que isso só funciona quando você faz inserções individuais como você postou. Se você quiser fazer inserções de mais de 1 linha de dados, precisará ajustar isso.