2009-05-20 4 views
2

は、私は次のようなレイアウトを持つテーブルがあると言いますこの質問。確保正しいデータが

私がしたいことは、ユーザーごとに、「ピリオド」が重複しないようにすることです。つまり、2009年5月15日から2009年5月18日の場合、データベースには、これらの日付のいずれかを含む行はありません(2009年5月15日〜18日の両方の日付が含まれます)。

どうすればこのように最善の方法で対応できますか?私の最初の考えはトリガーを使うことでしょうが、どうやってどうやったらこのような "カスタム"なデータ検証をするより良い方法があるのでしょうか?

答えて

2

私の友人私はあなたにスポットがあると信じています。トリガーは、ビジネスルールを実装するために、このような理由で設計されています。

Books Onlineのドキュメントには、始めるための参考になるいくつかの例があります。

http://msdn.microsoft.com/en-us/library/ms189799.aspx

1

あなたはINSERT/UPDATEトリガを使用する必要があります。一度に複数の行が挿入または更新されている場合を処理するトリガーを書き込むときは必ず確認してください。

+0

私は現時点でINSERTトリガを書いていますが、UPDATEを処理する方法のアイデアを考え始めています(最終結果のチェックをすべて実行する必要があるので見ています)が、 UPDATEトリガーのデッドエンドに、何かヒント? – kastermester

1

よくある問題です。あなたは、制約を使用することができます。そのような場合は、あなたは、SQL Server 2008のなら、あなたの粒度は日レベル(で、途中である場合は特に、それを行うには

http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/03/08/storing-intervals-of-time-with-no-overlaps.aspx

+0

これは非常にうまく見えました。ここでの唯一の問題は、シーケンスの途中で行を削除できないことです。テーブル自体に外部キーの関係があるためです。 – kastermester

+0

2008年にMERGEを使用できます。 その前に、削除する行を最初に移動してから削除します。 –

+0

私はこれをどのように使うことができるのか分かりますが、トリガーとは対照的に、これはいくつかの否定的な点をもたらします: 1.それ以外の場合は不要な余分な列の使用。 2.ハードな挿入、更新、削除ロジック - おそらく私のアプリケーションの残りの部分でやや落ち着いたストアドプロシージャを使用する必要があります。トリガで私は通常のステートメントを使用することができます。 私はテーブル内のレコードが重複しないように、必要な順序で行を挿入、更新、削除できるようにしたい - トリガーで許可されているので、今すぐ動作しているようです。 – kastermester

0

一つの方法を、あなたは UserId int、 日時、 主キー(UserId、Day) 次に、任意の日付のユーザーのすべての日を挿入、削除、更新します。挿入、削除、更新するだけで、PKのサーバーの一意性制約によって検証が行われます。

関連する問題