3

我有这两张桌子

桌子:Guards

  • 身份证号码
  • 名称 varchar
  • 排名整数

桌子:Squads

  • 小队编号
  • 领导者
  • 队名

Leader列指向表中的IDGuard,我正在尝试创建一个约束,以检查Rank链接到作为领导者提供的警卫 id 的列是否是特定值(在本例中为 1)

这是可能的还是我必须使用触发器?

4

1 回答 1

4

您需要添加一个CHECK约束。我会将约束包装到一个函数中,因为您需要检查另一个表的值。

CREATE FUNCTION CheckLeaderRank
(@LeaderID INTEGER)
RETURNS INTEGER
AS 
BEGIN
DECLARE @value INTEGER;
DECLARE @MinimumRank INTEGER = 3;

SET @value = CASE WHEN (SELECT RANK FROM Guards WITH(NOLOCK) WHERE Id = @LeaderID) >= @MinimumRank THEN 1 ELSE 0 END

RETURN @value
END

该函数将检查警卫Rank是否足够高:确保设置@MinimumRank为正确的值,或者更好的是,从另一个表中获取它。

现在将约束添加到您的Squads表中。

ALTER TABLE Squads
ADD CONSTRAINT chk_rank CHECK (dbo.CheckLeaderRank(i) = 1)
于 2013-05-30T17:49:07.190 回答