私はこれらの2つのテーブルを持っています
テーブル:Guards
- ID 整数
- 名前 varchar
- ランク整数
テーブル:Squads
- SquadID
- リーダー
- SquadName
列はテーブル内のLeader
列を指し、リーダーとして提供されたガード ID にリンクされた列が特定の値 (この場合は 1) であるかどうかをチェックする制約を作成しようとしています。ID
Guard
Rank
これは可能ですか、それともトリガーを使用する必要がありますか?
私はこれらの2つのテーブルを持っています
テーブル:Guards
テーブル:Squads
列はテーブル内のLeader
列を指し、リーダーとして提供されたガード ID にリンクされた列が特定の値 (この場合は 1) であるかどうかをチェックする制約を作成しようとしています。ID
Guard
Rank
これは可能ですか、それともトリガーを使用する必要がありますか?
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)