Может ли ограничение проверки относиться к другой таблице?
Скажем, у меня есть одна таблица с именем ProjectTimeSpan (которой я не являюсь, как пример!), содержащим столбцы StartDate и EndDate strong > .
И у меня есть другая таблица с именем SubProjectTimeSpan, которая также содержит столбцы с именем StartDate и EndDate, где я бы хотел установить ограничение проверки что делает невозможным установить StartDate и EndDate значения "вне" ProjectTimeSpan.StartDate на ProjectTimeSpan.EndDate
Вид ограничения проверки, которое знает о других значениях таблиц...
Возможно ли это?
Ответы
Ответ 1
В ответ на ваш комментарий к ответу GSerg, здесь пример проверки с помощью функции:
alter table YourTable
add constraint chk_CheckFunction
check (dbo.CheckFunction() = 1)
Где вы можете определить такую функцию, как:
create function dbo.CheckFunction()
returns int
as begin
return (select 1)
end
Эта функция позволяет ссылаться на другие таблицы.
Ответ 2
Вы можете создать пользовательскую функцию, которая выполняет проверку и возвращает 1 или 0, а затем создает ограничение check
на нем, предоставление идентификатора проекта и дат в качестве параметров.
Ответ 3
Составьте составной ключ таблицы ProjectTimeSpan
в сочетании с столбцами StartDate
и EndDate
, затем используйте этот составной ключ для ссылки на внешний ключ в таблице SubProjectTimeSpan
. Это даст вам возможность написать необходимые ограничения на уровне строки CHECK
в таблице SubProjectTimeSpan
, например.
CREATE TABLE ProjectTimeSpan
(
project_ID INTEGER NOT NULL UNIQUE, -- key
StartDate DATE NOT NULL,
EndDate DATE NOT NULL,
CHECK (StartDate < EndDate),
UNIQUE (project_ID, StartDate, EndDate) -- compound key
-- other project columns here...
);
CREATE TABLE SubProjectTimeSpan
(
project_ID INTEGER NOT NULL,
StartDate DATE NOT NULL,
EndDate DATE NOT NULL,
FOREIGN KEY (project_ID, StartDate, EndDate)
REFERENCES ProjectTimeSpan (project_ID, StartDate, EndDate)
ON DELETE CASCADE
ON UPDATE CASCADE,
sub_StartDate DATE NOT NULL,
sub_EndDate DATE NOT NULL,
CHECK (sub_StartDate < sub_EndDate),
CHECK (StartDate <= sub_StartDate), -- sub project can't start before main project
CHECK (sub_EndDate <= EndDate) -- sub project can't end after main project
-- other sub project columns here...
);
Ответ 4
Вам нужно добавить ограничение для родительской и дочерней таблиц, потому что подпроект не может быть вне диапазона проекта, но диапазон проекта также не может перемещаться из всего подпроекта.
В таких ситуациях вы должны отложить проверку ограничения на верхнем уровне (webservice, application) транзакцией, чтобы гарантировать, что ваши данные находятся в допустимом состоянии после нескольких запросов в обеих таблицах!