2015-02-05 5 views
0

У меня есть следующий простой БД:SQL Правила зависят от выбранного значения

Table Types: 
- ID int 
- TypeName nvarchar 

Table Users: 
- ID int 
- UserName nvarchar 
- TypeID int 

Table BusyTime 
- ID int 
- UserID int 
- BTime time(0) 

Но одно ограничение - записи в BusyTime должны быть только для пользователей, которые имеют TypeID = 3. Пользователи с TypeID = 1 и с TypeID = 2 не может иметь записи в BusyTime (это противоречит бизнес-логике) Как описать его на уровне MS SQL? Или я должен переделать БД?

+0

Триггеры могут использоваться для обеспечения согласованности данных. – jarlh

ответ

2

Я предполагаю, что ваши первичные ключи в каждой таблице только на ID. Что вам нужно изменить это, добавьте UNIQUE KEY ограничение на какID и TypeID в Users:

ALTER TABLE Users ADD CONSTRAINT UQ_User_Types_XRef (ID,TypeID) 

И создать BusyTime таблицу:

CREATE TABLE BusyTime (
    ID int not null, 
    UserID int not null, 
    BTime time(0) not null, 
    _Type_XRef as 3 persisted, 
    constraint PK_BusyTime PRIMARY KEY (ID), 
    constraint FK_BusyTime_Users FOREIGN KEY (UserID) 
     references Users (ID), 
    constraint FK_BusyTime_Users_XRef FOREIGN KEY (UserID,_Type_XRef) 
     references Users (ID,TypeID) 
) 

Где я предполагал PK_BusyTime и FK_BusyTime_Users были ваши существующие ограничения. Дело в том, стоит ли вам отказаться от FK_BusyTime_Users (что является «реальным» ограничением внешнего ключа) теперь, когда существует FK_BusyTime_Users_XRef.

+0

Ницца, а затем вы создаете представление, которое будет использоваться ежедневно, скрывая эти фиктивные столбцы, необходимые, чтобы сделать fk возможным. – jarlh

0

Вы можете использовать проверочные ограничения, чтобы запретить недопустимых типов: https://technet.microsoft.com/en-us/library/ms188258%28v=sql.105%29.aspx

+0

Связаны ли проверки с ограничениями для нескольких таблиц? – jarlh

+0

Да, вы в основном определяете функцию, которая может запрашивать разные таблицы. Вы можете использовать пример MSDN – Lee

+1

Но вам все равно нужно реализовать триггер в таблице «Пользователи», чтобы исключить «TypeID» из 3 в нечто другое, * если * у пользователя есть какие-либо строки в «BusyTime». –

0

Настройка такое условное ограничение возможно. Один из способов заключается в добавлении составной индекс к users:

create unique index idx_users(type, id) on users(type, id) 

Затем используйте это для ограничения внешнего ключа:

alter table busytime add _type as (3) persisted not null; 
alter table busytime add constraint foreign key (_type, userId) on users(type, id); 

К сожалению, я думаю, что persisted нужно для этого столбца, так что на самом деле занимает место в запись.

К сожалению, я не думаю, что это работает, либо:

alter table busytime add constraint foreign key (3, userId) on users(type, id); 
Смежные вопросы