2017-08-09 5 views
1

私は物事を試してみて、そこに外来キーを持つテーブルがある状況を考え出しました。私はこのテーブルに他のテーブルから特定の値が現れる回数を制限したいと思います。私は、 'local'テーブルがその外部テーブルの値を受け入れることを望んでいますが、最大で4回です。私はこれはトリガで行うことができると思うが、このルールを強制するために置くことができる何らかの他の制約やチェックがあるかどうかを知りたい。その理由は、私が記述しているオブジェクトには最大4つの記述子を関連付けることができ、すべてのアイテムがその制限に達するとは限らないため、メインテーブルに4つの列を保存したくないからです。実際、ほとんどの人が2つを持っていないと私は信じています。テーブルに値が表示される回数を制限する方法

+1

。複合キーを使用し、2番目の列に値を制限することによって、他のオプションもあります。しかし、その場合、2列目の値の増分はビジネスレイヤーで維持する必要があります。 – MKR

+0

トリガーに同意します。関数を呼び出すテーブルにチェック制約を置くことはできますが、それは理想的ではありません。また、ロジックを含むストアドプロシージャを書き込むこともできます。 – squillman

答えて

2

ユーザー定義関数でチェック制約を使用します。使用してトリガーを超える本の2つの利点があります

  1. これは、制約がために設計されているチェックするものです。
  2. トリガを使用するには、挿入トリガと更新トリガの代わりに、トリガを使用する必要があります。その結果、コードが長くなり、書き込みやメンテナンスが難しくなります。ここで

簡単な例です:

は、テストテーブルを作成します。

CREATE TABLE Test 
(
    Col1 int 
) 
GO 

は、検証関数を作成します。

CREATE FUNCTION dbo.IsValueAllowed 
(
    @Value int 
) 
RETURNS bit 
AS 
BEGIN 

IF (SELECT COUNT(*) FROM Test WHERE Col1 = @Value) > 4 RETURN 0 

RETURN 1 

END 
GO 

は、テーブルに

ALTER TABLE Test 
    ADD CONSTRAINT ck_RestrictCol1 CHECK (dbo.IsValueAllowed(Col1) = 1) 
GO 
をチェック制約を追加します。 の

テスト:トリガーがどうなる

INSERT INTO Test VALUES 
(1), (1), (1), (1), 
(2), (2), (2) 

INSERT INTO Test VALUES (2) 

SELECT * 
FROM Test 

INSERT INTO Test VALUES (1) -- This will fail with an error message: The INSERT statement conflicted with the CHECK constraint "ck_RestrictCol1" 

see a live demo on rextester.

関連する問題