1

Я столкнулся с базой данных в моей текущей позиции, которая нуждается в распределении TLC, чтобы сказать, что существует множество перекрестных справочных таблиц, имеющих одинаковые структурная схема, и все, используя триггеры для принудительной реализации бизнес-логики или целостности домена, казалось бы. Я пытаюсь выяснить, могу ли я заменить некоторые триггеры ограничениями. Ниже приведено типичное определение таблицы, соответствующее этому шаблону. Существует около 400 таких таблиц, которые все используют одно и то же решение на основе триггеров.Как настроить дополнительное ограничение для отношений «один-ко-многим» без использования триггеров

CREATE TABLE dbo.FooXRef 
(
FooXRefID INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
BarID INT NOT NULL CONSTRAINT [fk_Bar] FOREIGN KEY REFERENCES dbo.Bar(BarID), 
DefaultRecord BIT NOT NULL CONSTRAINT [DF_FooXRef_Default] DEFAULT(1) 
); 

Правило быть может существовать бесконечное число записей с одинаковым значением в BarID и DefaultRecord = 0, но только одна запись может существовать, где BarID находится в таблице и DefaultRecord = 1.

Какое ограничение мне нужно настроить для этой комбинации?

Эта структура таблицы и триггер для принудительной реализации этой комбинации - 400 в текущей базе данных, а в следующем я берусь в тысячах. Невозможно ли установить ограничение, которое будет работать для этого случая?

+0

К сожалению, на основании примера вы должны поддерживать это программно. –

+0

Имеет ли пример [здесь] (https://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx) какие-либо идеи? – HABO

ответ

2

Вот один из возможных вариантов без использования триггера.

Создайте отфильтрованный уникальный индекс на (BarID, DefaultRecord) с условием фильтра WHERE ([DefaultRecord]=(1)).

С таким индексом вы можете вставить только один ряд на BarID, который имеет DefaultRecord = 1.

Возможно иметь нулевое количество строк, которые имеют DefaultRecord = 1.

Возможно иметь любое количество строк, которые имеют DefaultRecord = 0.

CREATE UNIQUE NONCLUSTERED INDEX [IX_DefaultRecord] ON [dbo].[FooXRef] 
(
    [BarID] ASC, 
    [DefaultRecord] ASC 
) 
WHERE ([DefaultRecord]=(1)) 
+0

Да, возможно иметь 0 строк, которые имеют запись по умолчанию = 1. Да, также возможно иметь любое количество строк, где по умолчанию установлена ​​запись = 0. Я попытаюсь применить ваше предложение и посмотреть, где я получу. – SSISPissesMeOff

+0

работал как шарм. Большое спасибо. Я даже не думал об уникальном индексе, а не о контрольном ограничении. – SSISPissesMeOff

+0

Добро пожаловать. Я рад, что вы нашли этот ответ полезным. Я отредактировал название вопроса и попытался сделать его более наглядным. –