Триггер или ограничение T-SQL для пробелов в интервалах

#sql-server #tsql #triggers #constraints #gaps-in-data

#sql-сервер #tsql #раздражители #ограничения #пробелы в данных

Вопрос:

У меня есть таблица идентификаторов, IntervalFrom и IntervalTo :

Идентификатор Интервал между ИнтервалТо
1 0 2
1 2 4
2 0 2
2 2 4

У меня уже есть триггер, который НЕ позволяет интервалам перекрываться.

Я ищу триггер или ограничение, которое не допустит пробелов в данных. У меня есть поиск, и информация, которую я нашел, относится к пробелам в запросах и данных, а не к тому, чтобы не допускать их в первую очередь. Я не могу найти ничего в связи с этим в качестве триггера или ограничения.

Возможно ли это с помощью T-SQL?

Заранее спасибо.

Комментарии:

1. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или где-либо еще) и почему это не соответствовало вашим потребностям.

2. Речь идет не о поиске точного решения вашей проблемы, а о разработке подхода, а затем о поиске компонентов, которые позволят вам реализовать ваш подход, например, если вы найдете запрос, который обнаруживает пробелы, вы можете использовать его в триггере и выдать ошибку, если обнаружен пробел. Существуют учебные пособия по созданию триггеров и учебные пособия по обнаруженным пробелам.

3. Но [0, 2] перекрывается с [2, 4]

Ответ №1:

Вы можете создать таблицу, которая автоматически защищена от перекрытий и пробелов:

 create table T (  ID int not null,  IntervalFrom int null,  IntervalTo int null,  constraint UQ_T_Previous_XRef UNIQUE (ID, IntervalTo),  constraint UQ_T_Next_XRef UNIQUE (ID, IntervalFrom),  constraint FK_T_Previous FOREIGN KEY (ID, IntervalFrom) references T (ID, IntervalTo),  constraint FK_T_Next FOREIGN KEY (ID, IntervalTo) references T (ID, IntervalFrom) ) go create unique index UQ_T_Start on T (ID) where IntervalFrom is null go create unique index UQ_T_End on T(ID) where IntervalTo is null go  

Обратите внимание, что для этого требуется несколько иное соглашение для первого и последнего интервалов — они должны использоваться null вместо 0 или (несколько произвольно) 4 .

Обратите также внимание, что изменение данных в такой таблице может быть сложной задачей — если вы вставляете новый интервал, вам также необходимо обновить другие интервалы, чтобы учесть новый. MERGE здесь твой друг.


Учитывая вышесказанное, мы можем вставить ваши (измененные) данные образца:

 insert into T (ID, IntervalFrom, IntervalTo) values (1,null,2), (1,2,null), (2,null,2), (2,2,null) go  

Но мы не можем вставить перекрывающееся значение (это ошибка).:

 insert into T(ID, IntervalFrom, IntervalTo) values (1,1,3)  

Вы также должны видеть, что внешние ключи предотвращают существование пробелов в последовательности