UserId、RoleId、FromDate、および Todate という列がある Sql Server にテーブルがあります。同じ RoleId と UserId が同じ日付に存在しないことをチェックする制約を書きたいと思います。
前もって感謝します....
UserId、RoleId、FromDate、および Todate という列がある Sql Server にテーブルがあります。同じ RoleId と UserId が同じ日付に存在しないことをチェックする制約を書きたいと思います。
前もって感謝します....
時間部分がない場合、または時間部分がすべてのレコードで同じである場合は、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