2011-01-04 3 views
2

Я хочу добавить Check Constraint в таблицу для сервера 2005, но не могу ее решить.Проверить ограничение на два столбца

MemberId ClubId MeetingId 
1  100 10 
2  100 10 
3  100 10 
7  101 10 <-This would throw a check constraint 
1  100 11 
2  100 11 

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

Как это достичь?

+1

Является ли эта таблица денормализованной по соображениям эффективности? Является ли 'MeetingID' FK? Если да, есть ли в таблице собраний столбец «ClubId»? – outis

+1

Если это так, не является ли ClubId атрибутом определенного собрания, а не атрибутом этой таблицы (Attendees?)? –

+0

Причина для идентификатора клуба - это устаревшая система, в которой создатель решил создать ПК на основе этих трех полей! Ужасно, но это так, как это – Rippo

ответ

4

Использование функции в проверочном ограничении является одним из вариантов, но вы можете создать INDEXED VIEW, который выполняет то же самое ограничение.

CREATE VIEW VIEW_UNIQUE_MEETINGID WITH SCHEMABINDING AS 
    SELECT ClubID 
      , MeetingID 
      , COUNT_BIG(*) 
    FROM YourTable 
    GROUP BY 
      ClubID 
      , MeetingID 
GO 

CREATE UNIQUE CLUSTERED INDEX UIX_VIEW_UNIQUE_MEETINGID ON VIEW_UNIQUE_CLUBID (MeetingID) 
+0

+1, который выглядит очень элегантно –

+0

Получил ошибку 'Can not schema bind view 'VIEW_UNIQUE_MEETINGID', потому что имя 'MemberMeetings' недопустимо для привязки схемы. ' – Rippo

+1

@Rippo - вам нужно использовать имя из двух частей, чтобы ссылаться на вашу таблицу, например 'dbo.MemberMeetings', если он находится в схеме' dbo'. –

2

вытекает из msdn

EDIT: попробовал код и установил его после @rippos комментарий

CREATE FUNCTION CheckFnctn() 
RETURNS int 
AS 
BEGIN 
    DECLARE @retval int 
    SELECT @retval = (select max(cnt) from (select COUNT(distinct ClubID) cnt FROM CheckTbl group by MeetingId) as t) 
    RETURN @retval 
END; 
GO 

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() <= 1); 
GO 
+0

+1, но если память мне хорошо помогает, это произойдет, если вы «ОБНОВЛЯЕТ» ClubId или MeetingID. Чтобы решить эту проблему, вы должны передать как ClubID, так и MeetingID функции. –

+0

Это тоже может произойти при изоляции снимка. Посмотрите на статьи Хьюго Корнелиса или Алекса Кузнецова. –

+0

@Lieven и @Martin Спасибо за комментарии. Я только сделал специальный поиск Google. Я никогда не использовал контрольные ограничения в практике. –

 Смежные вопросы

  • Нет связанных вопросов^_^