Ограничить значения в таблице, используя значения столбца в другой таблице - PullRequest
1 голос
/ 17 марта 2012

Итак, у меня есть две таблицы:

Requests
--------
Id
RequestSchemeId
ReceivedByUserId

ForwardedRequests
-----------------
Id
RequestId (FK to Id column of Requests Table)
ForwardedToUserId

Теперь одно бизнес-правило гласит, что пользователь может получить только один запрос для конкретной схемы запросов. Поэтому я создал ограничение UniqueKey для RequestSchemeId + ReceivedByUserId. Который должен решить мою проблему

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

Решение, о котором я могу подумать, - это столбец RequestSchemeId в таблице ForwardedRequests, который является просто копией значения в соответствующей строке таблицы Requests, а затем добавляет уникальное ограничение для ForwardedToUserId + RequestSchemeId.

Это правильный способ сделать это? Если не то, что есть?

Как получить значение RequestSchemeId из запросов в ForwardedRequests, когда в последнем создается новая строка? UDF - это то, на что я смотрел, но, похоже, у него есть некоторые ошибки, и мне нужен стандартный / рекомендуемый способ сделать это, а не что-то странное.

1 Ответ

2 голосов
/ 17 марта 2012

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

CREATE TABLE dbo.Requests 
  ( 
     Id               INT PRIMARY KEY, 
     RequestSchemeId  INT, 
     ReceivedByUserId INT, 
     UNIQUE (RequestSchemeId, ReceivedByUserId) 
  ) 

CREATE TABLE dbo.ForwardedRequests 
  ( 
     Id                INT PRIMARY KEY, 
     RequestId         INT REFERENCES Requests(Id), 
     ForwardedToUserId INT 
  ) 

GO 

CREATE VIEW dbo.ForwardedUserRequestSchemes 
WITH SCHEMABINDING 
AS 
  SELECT ForwardedToUserId, 
         RequestSchemeId 
  FROM   dbo.ForwardedRequests FR 
         JOIN dbo.Requests R 
           ON R.Id = FR.RequestId 

GO 

CREATE UNIQUE CLUSTERED INDEX ix 
  ON dbo.ForwardedUserRequestSchemes(ForwardedToUserId, RequestSchemeId) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...