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

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

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

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

Это возможно?

Ответы на вопрос(4)

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

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

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

 GSerg07 окт. 2010 г., 12:45
@Джекcheck (dbo.IsValidRange(project_id, start_date, end_date) = 1)
 GSerg07 окт. 2010 г., 16:25
@onedaywhen Да, если вы хотите изменить даты родительского проекта позже. То, что я никогда не мог себе представить, может иметь место. Смотрите мой комментарий к вашему ответу.
 Jack Johnstone07 окт. 2010 г., 12:38
И как будет выглядеть это проверочное ограничение?
 onedaywhen07 окт. 2010 г., 14:44
GSerg: Предположительно, вам понадобитсяCHECK ограничение с использованием этого UDF наи то и другое столы ...? Пожалуйста, отправьте пример кода.
 onedaywhen07 окт. 2010 г., 16:43
@GSerg: «измените даты родительского проекта ... Я никогда не мог себе представить, что это может быть так». Как сам руководитель проекта, я могу заверить вас, чтоEndDate изменится ;)

Составьте ключ из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...
);
 Jason Pease03 дек. 2018 г., 16:41
GSerg, это хорошее место, чтобы использовать ОБНОВЛЕНИЕ КАСКАД
 Jack Johnstone07 окт. 2010 г., 14:09
Да, это кажется очень прямым! Я думаю, что я на самом деле искал что-то вроде «ССЫЛКИ». Проверим это. Спасибо!
 David Balažic20 мар. 2014 г., 12:40
это соединение позволит разные
 GSerg07 окт. 2010 г., 16:25
Это имеет смысл, только если вы хотите разрешить изменение дат родительского проекта ... что не имеет смысла. Подумайте: основной проект, выполнение которого занимает 1 месяц. Из-за финансового кризиса (так) вы должны были задержать его (обаstartdate а такжеenddate должен получить +1 месяц). Но вы не можете этого сделать, потому что тогда проверка дочернего проекта не удастся (дочерние даты теперь находятся вне родительских дат). И вы не можете изменить даты дочернего проекта, прежде чем изменить даты его родителей. Тупик.

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

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

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

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

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

 Jack Johnstone07 окт. 2010 г., 13:48
Хорошо, я вижу - спасибо!
 Andomar07 окт. 2010 г., 13:41
@ Джек Джонстон: просто измениselect 1 часть? Вы можете передать параметры в функцию
 Jason Pease03 дек. 2018 г., 16:54
Это решение рискует, что строки, измененные в исходной таблице, могут нарушить ссылочную целостность. Вы можете избежать этого риска, добавив в исходную таблицу триггер, который проверяет ограничение проверки для другой таблицы, например, так.CREATE TRIGGER MyTrigger ON dbo.SourceTable AFTER UPDATE AS BEGIN ALTER TABLE dbo.ReferencingTable WITH CHECK CHECK CONSTRAINT TheConstraint END
 Jack Johnstone07 окт. 2010 г., 13:00
и если я в функции хочу относиться к существующей таблице, такой как "ProjectTimeSpan.StartDate", я бы поставил ее как ...?

Ваш ответ на вопрос