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

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

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

Вид Проверочного ограничения знает о других табличных значениях ...

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

Ответы [ 4 ]

40 голосов
/ 07 октября 2010

В ответ на ваш комментарий к ответу GSerg вот пример проверки ограничения с использованием функции:

alter table YourTable
add constraint chk_CheckFunction
check (dbo.CheckFunction() = 1)

Где вы можете определить функцию как:

create function dbo.CheckFunction()
returns int
as begin
    return (select 1)
end

Функция может ссылаться на другие таблицы.

15 голосов
/ 07 октября 2010

Вы можете создать пользовательскую функцию , которая выполняет проверку и возвращает 1 или 0, а затем создает ограничение check для нее, предоставляя идентификатор проекта и даты в качестве параметров.

6 голосов
/ 07 октября 2010

Создайте составной ключ из ключа таблицы 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...
);
0 голосов
/ 11 августа 2015

Необходимо добавить ограничение на родительскую и дочернюю таблицу, потому что подпроект не может быть вне диапазона проекта, но диапазон проекта также не может выходить за пределы всего подпроекта.

В этихВ таких ситуациях вам следует отложить проверку ограничения на верхнем уровне (веб-сервис, приложение) с помощью транзакции, чтобы убедиться, что ваши данные находятся в действительном состоянии после нескольких запросов к обеим таблицам!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...