2012-05-31 3 views
4

У меня есть 3 таблицы в SQL Server 2008 R2, которые похожи на них:Как добавить уникальное ограничение, используя столбец из другой таблицы?

DB Model

Компания может иметь множество LSP. У LSP может быть много СЕРВИСОВ.

И я должен убедиться, что SERVICE_CODE однозначно идентифицирует запись SERVICE в рамках КОМПАНИИ. Другими словами, COMPANY_ID + SERVICE_CODE должен однозначно идентифицировать запись SERVICE во всей системе.

Например: КОМПАНИЯ-А НЕ МОЖЕТ иметь 2 услуги (с двумя разными идентификаторами SERVICE_ID) с тем же SERVICE_CODE. Но у КОМПАНИЙ-А и КОМПАНИИ-B могут быть два отдельных СЛУЖБА (опять же, с разными идентификаторами SERVICE_ID) с SERVICE_CODE = "PREMIUM".

мне нужно что-то вроде этого:

alter table "SERVICE" 
add constraint "SERVICE_Index01" 
unique ("COMPANY_ID", "SERVICE_CODE") 

Но (очевидно) это не удается, так как столбец company_id не в таблице услуг.

Заранее благодарим за любую помощь.

+0

Является ли Service_Code уникальным? Сначала я думал, что Service_ID является суррогатным ключом для естественного ключа Service_Code. Но если две компании могут иметь разные идентификаторы службы с кодом обслуживания «Премиум», это предполагает иное. – 8kb

ответ

4

Вы можете использовать indexed view в качестве внешнего ограничения:

CREATE VIEW dbo.CompanyServices 
WITH SCHEMABINDING 
AS 
SELECT 
    c.COMPANY_ID, 
    s.SERVICE_CODE 
FROM  dbo.COMPANY c 
INNER JOIN dbo.LSP  l ON c.COMPANY_ID = l.COMPANY_ID 
INNER JOIN dbo.SERVICE s ON l.LSP_ID  = s.LSP_ID 
GO 

CREATE UNIQUE CLUSTERED INDEX UQ_CompanyServices 
ON dbo.CompanyServices (COMPANY_ID, SERVICE_CODE); 

Индекс будет убедиться, что нет никаких дубликатов (COMPANY_ID, SERVICE_CODE) в ваших данных.

+0

Это выглядит великолепно! Спасибо! дайте знать, как это получилось. –

+0

Это работает. Спасибо! –

1

Является ли каждая компания ограниченной одним LSP? Является ли Service_Code уникальным (или может быть два служебных кода PREMIUM с разными Service_ID)?

CREATE TABLE dbo.Company 
(
    CompanyID INT PRIMARY KEY 
    -- , ... 
); 

CREATE TABLE dbo.LSP 
(
    LSPID  INT PRIMARY KEY, 
    CompanyID INT FOREIGN KEY REFERENCES dbo.Company(CompanyID) -- UNIQUE? 
    -- , ... 
); 

CREATE TABLE dbo.Service 
(
    ServiceID INT PRIMARY KEY 
    -- , ... 
); 

CREATE TABLE dbo.LSP_Service 
(
    LSPID  INT FOREIGN KEY REFERENCES dbo.LSP(LSPID), 
    ServiceID INT FOREIGN KEY REFERENCES dbo.Service(ServiceID), 
    PRIMARY KEY (LSPID, ServiceID) 
); 
+0

У КОМПАНИИ может быть много LSP. Могут быть 2 СЕРВИСА (с разными идентификаторами) с тем же SERVICE_CODE, если они принадлежат к двум различным компаниям. Я обновлю пример, чтобы это было ясно. Благодарю. –

-1

Добавить COMPANY_ID в таблицу обслуживания.

Если вам нужны строки в таблице Service, чтобы быть уникальными по этому идентификатору, имеет смысл сохранить ссылку на внешний ключ в этой таблице.

+1

Это было бы излишним, так как Company_ID уже находится в таблице LSP. –

+0

Спасибо, но я скачу, что есть способ сделать это, не меняя таблицы. –

+0

Если вы не можете изменить какие-либо таблицы, я не думаю, что вы можете достичь своей цели, используя ограничение, потому что ваши таблицы не совсем правильно смоделированы. Возможно, вам придется прибегать к триггерам, поскольку не все бизнес-правила могут быть легко применены с использованием декларативных ограничений. Я не потратил достаточно времени на это, чтобы быть на 100% уверенным, но это мое первое впечатление. –

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