Я хочу создать контрольное ограничение для моей таблицы, где вы не можете добавить новую строку, если новый диапазон бронирования (start_date, end_date) пересекается с уже представленной строкой. Но я не могу разместить запрос в контрольном ограничении. У вас есть идея, как это сделать?select in check constraint
Таблицы:
APARTMAN
id INT
price INT
BOOKINGS
id INT
start_date DATE
end_date DATE
apartman_id INT
[apartman_id] IN (SELECT [id] FROM [dbo].[APARTMAN]
WHERE [id] NOT IN (
SELECT [apartman_id] FROM
[dbo].[BOOKINGS]
WHERE
([start_date] <= "requested end_date" AND
[end_date] >= "requested start_date")
OR
([start_date] <= "requested start_date" AND
[end_date] >= "requested end_date")
OR
(([start_date] <= "requested end_date" AND [end_date] >= "requested start_date")
OR
([end_date] <= "requested start_date" AND [end_date] >= "requested end_date"))
)
)
Чтобы посмотреть на него с другого направления, было бы приемлемым, чтобы вставка выполнялась через хранимую процедуру? – Hotchips
Я бы рекомендовал триггер, а не ограничение на уровне таблицы. Вам также нужно следить за обновлениями? –
@Hotchips вы не можете использовать хранимую процедуру для защиты данных, потому что люди могут получить доступ к таблице, не пройдя хранимую процедуру. Конечно, люди тоже могут отключать триггеры, но это преднамеренная злоба (и если это худшее, кто-то с такой большой привилегией вредит вашей базе данных, подумайте, что вам очень повезло). Вы также можете использовать хранимые процедуры *, но они не должны быть единственной защитой. –