对外键值的约束检查

时间:2013-05-30 16:09:32

标签: sql sql-server constraints

我有这两个表

表:Guards

  • ID int
  • 名称varchar
  • Rank int

表:Squads

  • SquadId
  • 领导
  • SquadName

Leader列指向ID表中的Guard列,我正在尝试创建一个约束,检查Rank列是否与警卫相关联作为领导者提供的id是特定值(在这种情况下为1)

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

1 个答案:

答案 0 :(得分:2)

您需要添加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)