3

私はこれらの2つのテーブルを持っています

テーブル:Guards

  • ID 整数
  • 名前 varchar
  • ランク整数

テーブル:Squads

  • SquadID
  • リーダー
  • SquadName

列はテーブル内のLeader列を指し、リーダーとして提供されたガード ID にリンクされた列が特定の値 (この場合は 1) であるかどうかをチェックする制約を作成しようとしています。IDGuardRank

これは可能ですか、それともトリガーを使用する必要がありますか?

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 に答える