我有这两张桌子
桌子:Guards
- 身份证号码
- 名称 varchar
- 排名整数
桌子:Squads
- 小队编号
- 领导者
- 队名
该Leader
列指向表中的ID
列Guard
,我正在尝试创建一个约束,以检查Rank
链接到作为领导者提供的警卫 id 的列是否是特定值(在本例中为 1)
这是可能的还是我必须使用触发器?
我有这两张桌子
桌子:Guards
桌子:Squads
该Leader
列指向表中的ID
列Guard
,我正在尝试创建一个约束,以检查Rank
链接到作为领导者提供的警卫 id 的列是否是特定值(在本例中为 1)
这是可能的还是我必须使用触发器?
您需要添加一个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)