1

UserId、RoleId、FromDate、および Todate という列がある Sql Server にテーブルがあります。同じ RoleId と UserId が同じ日付に存在しないことをチェックする制約を書きたいと思います。

前もって感謝します....

4

1 に答える 1

1

時間部分がない場合、または時間部分がすべてのレコードで同じである場合は、UNIQUE制約を使用できます。

ALTER TABLE yourSchema.yourTable 
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, FromDate);

このように、date、RoleId、およびUserIdの組み合わせは、テーブル内で1回だけ発生する可能性があり、同じ組み合わせを挿入する他の試みは失敗します。

これは、日付フィールドの時間部分の値がすべてのレコードで同じである場合(たとえば、0)、またはフィールドのデータ型がDATE(時間部分を削除する)である場合に機能することに注意してください。

日付フィールドにレコード間で異なる時間部分がある場合は、次のいずれかの方法を試してください。

A)定義の計算列を追加します

ALTER TABLE yourSchema.yourTable 
ADD constraintCheckDate AS CAST(FromDate AS DATE)

UNIQUE定義の制約を追加します

ALTER TABLE yourSchema.yourTable 
ADD CONSTRAINT uniqueConstraint1 UNIQUE (RoleId, UserId, constraintCheckDate)

B)データを挿入する前にトリガーを使用してデータを検証します。データは、まだ存在しない場合にのみ入力されます。

CREATE TRIGGER trig1 ON yourSchema.yourTable
INSTEAD OF INSERT
AS
BEGIN

    IF NOT EXISTS
    (
        SELECT  *
        FROM    yourSchema.yourTable t
        JOIN    inserted i ON 
                CAST(t.FromDate AS DATE) = CAST(i.FromDate AS DATE) 
        AND     t.RoleId =  i.RoleId 
        AND     t.UserId =  i.UserId
    )
        INSERT  yourTable(RoleId, UserId, FromDate, ToDate)
        SELECT  RoleId, UserId, FromDate, ToDate
        FROM    inserted
    ELSE
        RAISERROR('Error', 16, 0)

END
GO
于 2013-02-27T07:27:55.080 に答える