Подтвердить что ты не робот

Может ли ограничение проверки относиться к другой таблице?

Скажем, у меня есть одна таблица с именем ProjectTimeSpan (которой я не являюсь, как пример!), содержащим столбцы StartDate и EndDate strong > .

И у меня есть другая таблица с именем SubProjectTimeSpan, которая также содержит столбцы с именем StartDate и EndDate, где я бы хотел установить ограничение проверки что делает невозможным установить StartDate и EndDate значения "вне" ProjectTimeSpan.StartDate на ProjectTimeSpan.EndDate

Вид ограничения проверки, которое знает о других значениях таблиц...

Возможно ли это?

4b9b3361

Ответ 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) транзакцией, чтобы гарантировать, что ваши данные находятся в допустимом состоянии после нескольких запросов в обеих таблицах!