4

テーブルでは、5 列のキーに一意の値のみが存在するようにしたいと考えています。

Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511   1234    2010511    1              INSERT
2010511   1234    2010511    4              INSERT
2010511   1234    2010511    7              INSERT
2010511   1234    2010511    1              INSERT   <---duplicate

しかし、 EventActionが次の場合にのみ、一意の制約を行間に適用したいINSERT:

Timestamp Account RatingDate TripHistoryKey EventAction
========= ======= ========== ============== ===========
2010511   1234    2010511    1              INSERT
2010511   1234    2010511    1              UPDATE
2010511   1234    2010511    1              UPDATE   <---not duplicate
2010511   1234    2010511    1              UPDATE   <---not duplicate
2010511   1234    2010511    1              DELETE   <---not duplicate
2010511   1234    2010511    1              DELETE   <---not duplicate
2010511   1234    2010511    1              INSERT   <---DUPLICATE

可能?

4

4 に答える 4

5

はい

  • SQL Server 2008: フィルター選択されたインデックスを使用する
  • SQL Server 2005: トリガーまたはインデックス付きビューを使用する

編集:

于 2010-05-12T17:11:37.270 に答える
2

EventAction とは何ですか?

ここでは設計上の問題があり、EventAction のタイプごとにテーブル/リレーションを作成することを検討する必要があるのではないかと思います。これにより、たとえば、InsertEventAction テーブルに一意の制約を作成できます。

おそらく、質問にビジネス コンテキストを提供できます。

コメントの返信に続いて:データ ソースの性質と実装したい解析アクティビティを考えると、gbn が最適なオプションを提案したと思います。

トリガーを使用して独自の監査メカニズムを実装できるため、ソース データベースも SQL Server ではないのは残念です。このようなソリューションには、トリガー内に「フィルター」ロジックを含めることができます。

于 2010-05-12T17:14:46.573 に答える
1

チェック制約を使用してこれを行うことを検討します。従来の一意の制約は機能しないと思います。

于 2010-05-12T17:09:35.697 に答える
0

これは、「INSTEAD OF INSERT」トリガーの例です。EXISTS は、同じ値を持つ既存の行があるかどうかをチェックしますが、EventAction が INSERT の場合のみです。

CREATE TRIGGER [dbo].[YourTriggerName] ON [dbo].[YourTableName] 
   INSTEAD OF INSERT
AS 
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
  SET NOCOUNT ON;

  IF NOT EXISTS (
    SELECT 1
    FROM [YourTableName] L
    INNER JOIN inserted I ON
           I.Timestamp = L.Timestamp
       AND I.Account = L.Account
       AND I.RatingDate = L.RatingDate
       AND I.TripHistoryKey = L.TripHistoryKey
       AND I.EventAction = 'INSERT'
  )
  BEGIN
      INSERT INTO [YourTableName]
      SELECT * FROM inserted
  END
END
于 2010-05-12T19:19:33.910 に答える