使用另一个表中的列的值约束表中的值

时间:2012-03-17 12:14:24

标签: sql sql-server sql-server-2008 tsql

所以我有两张桌子:

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

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

现在,一条业务规则表明用户只能收到一个特定RequestScheme的请求。所以我为RequestSchemeId + ReceivedByUserId创建了一个UniqueKey约束。哪个应该解决我的问题

第二个业务规则是,只有当转发用户在任何其他用户的同一方案下没有转发请求时,才能将请求转发给其他用户。

我能想到的解决方案是ForwardedRequests表中的RequestSchemeId列,它只是Requests表相关行中值的副本,然后在ForwardedToUserId + RequestSchemeId上添加唯一约束。

这是正确的做法吗?如果不是什么?

如果在后者中创建新行,如何从Forquests to ForwardedRequests获取RequestSchemeId的值? UDF是我看过的东西,但它似乎有一些陷阱,我需要标准/推荐的方式来做到这一点,而不是片状。

1 个答案:

答案 0 :(得分:2)

您可以在视图上使用唯一索引来强制执行此约束。示例如下。

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)