2

次の列のテント賃料の表があります。

RentID, DateStarted, DateEnded, CustomerID, etc.  

DateStartedは常にレンタル期間の開始時に入力され、最初はDateEndedNULLであり、レンタル期間が終了したときにのみ入力されます。CustomerIDテントを借りた顧客のIDです。

私がする必要があるのはCustomerID、その顧客が。で家賃を持っている場合、ユーザーが特定の顧客(で示される)に新しい行を挿入できないようにすることDateEnded=NULLです。

これを行う方法がわかりません。チェック制約を考えていましたが、他の行を表示できません。一意の制約について考えていましたが、この場合に使用できるかどうかはわかりません。On-Insertトリガーを考えていましたが、条件が満たされない場合に挿入をキャンセルできるかどうかわかりません。

助けてくれてありがとう。

4

3 に答える 3

2

SQLServer2008を使用している場合。

CREATE UNIQUE INDEX ix ON Rents(CustomerID) WHERE DateEnded IS NULL

以前のバージョンでは、インデックス付きビューを使用できます(このオプションSETでは、ベーステーブルを更新する接続に対してさまざまなオプションを正しく構成する必要がありますが、SQL Server 2005ではすでに構成されている可能性があります)。

CREATE VIEW dbo.ConstrainRents
WITH SCHEMABINDING
AS
SELECT CustomerID
FROM dbo.Rents 
WHERE DateEnded IS NULL

GO

CREATE UNIQUE CLUSTERED INDEX ix ON dbo.ConstrainRents(CustomerID)
于 2011-04-04T13:29:17.487 に答える
2

あなたが説明することは、アプリケーションロジックの側でもう少し聞こえます。データベースについて考えるとき、そしてどのような「ルール」を適用したいのかを考えるとき、データレコードを間違ったものにする原因を考えてください。あなたが説明していることから、DateEndedがnullのレコードは有効なレコードです。

私の経験から、トリガーは本当に必要な場合は素晴らしいですが、非常に危険であり、問​​題の複雑さを指数関数的に急速に増大させます。

可能であれば、個人的にトリガーを回避し、アプリケーション側でそのロジックを実行します。

ちょうど私の2セント

于 2011-04-04T12:57:48.087 に答える
0

instead ofMSのトリガーを確認することをお勧めします。ここにドキュメントがあります... http://msdn.microsoft.com/en-us/library/ms175521.aspx

rollback transaction従来の挿入トリガーでを使用することもできます。

于 2011-04-04T12:55:53.650 に答える