4

重複の可能性:
単純な CHECK 制約はそれほど単純ではありません

ユーザーのロールを持つテーブルがあります。次のようになります。

Id, RoleId, PersonId, Active

アクティブな列はソフト削除機能に使用されます。ユーザーのロールを削除すると、実際には に設定さactivefalseます。したがって、同じ組み合わせで複数の行を持つことができますがroleid-personid-active、アクティブ ビットが false に設定されている場合のみです。したがって、これは有効なデータです。

Id   RoleId   PersonId   Active
1    1        1          false
2    1        1          false
3    1        1          false
4    1        1          false

ただし、これはそうではありません。アクティブなロールは常に 1 つしか持てないためです (したがって、レコード 3 を挿入しないでください)。

Id  RoleId  PersonId  Active
1   1       1         false
2   1       1         true
3   1       1         true

私の質問は次のとおりです。RoleId, PersonId and Activeactive等しい一意の制約を作成できますtrueか?

ps。SQL サーバーのバージョンは 2005 です

4

1 に答える 1

2

で一意の制約を使用できRoleId、すべての非アクティブなロールとすべてのアクティブなロールPersonIdを保持する計算列を使用できます。Idnull

create table Roles
(
  Id int identity primary key,
  RoleId int not null,
  PersonId int not null,
  Active bit,
  ActiveInt as case Active when 0 then Id end,
  constraint UQ_RolePersonActive unique (RoleId, PersonId, ActiveInt)
)
于 2013-01-23T09:52:04.080 に答える