我有这两个表
表:Guards
表:Squads
Leader
列指向ID
表中的Guard
列,我正在尝试创建一个约束,检查Rank
列是否与警卫相关联作为领导者提供的id是特定值(在这种情况下为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)