私は取り組んでいますSQL Server 2008R2
、私は次の表を持っています
ID Name date
1 XYZ 2010
2 ABC 2011
3 VBL 2010
IDは異なりますがデータは存在しますが、データがある場合は挿入を防止したい
ID Name date
4 ABC 2011
このトリガーの書き方を教えてください。
私は取り組んでいますSQL Server 2008R2
、私は次の表を持っています
ID Name date
1 XYZ 2010
2 ABC 2011
3 VBL 2010
IDは異なりますがデータは存在しますが、データがある場合は挿入を防止したい
ID Name date
4 ABC 2011
このトリガーの書き方を教えてください。
このようなもの:
CREATE TRIGGER MyTrigger ON dbo.MyTable
AFTER INSERT
AS
if exists ( select * from table t
inner join inserted i on i.name=t.name and i.date=t.date and i.id <> t.id)
begin
rollback
RAISERROR ('Duplicate Data', 16, 1);
end
go
これは挿入のためだけのものです。更新も考慮する必要があるかもしれません。
アップデート
より簡単な方法は、テーブルに一意の制約を作成することです。これにより、更新にも強制され、トリガーの必要がなくなります。ただ行う:
ALTER TABLE [dbo].[TableName]
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED
(
[Name], [Date]
)
そして、あなたはビジネスになります。
テーブルにデータを挿入するストア プロシージャを使用している場合、実際にはトリガーは必要ありません。最初に組み合わせが存在するかどうかを確認してから、挿入しません。
CREATE PROCEDURE usp_InsertData
@Name varchar(50),
@Date DateTime
AS
BEGIN
IF (SELECT COUNT(*) FROM tblData WHERE Name = @Name AND Date=@Date) = 0
BEGIN
INSERT INTO tblData
( Name, Date)
VALUES (@Name, @Date)
Print 'Data now added.'
END
ELSE
BEGIN
Print 'Dah! already exists';
END
END
以下のトリガーは、ストア プロシージャを介してデータを挿入しない場合に使用できます。
CREATE TRIGGER checkDuplicate ON tblData
AFTER INSERT
AS
IF EXISTS ( SELECT * FROM tblData A
INNER JOIN inserted B ON B.name=A.name and A.Date=B.Date)
BEGIN
RAISERROR ('Dah! already exists', 16, 1);
END
GO
これには本当にトリガーは必要ありません。複数の列に一意の制約を設定するだけです。
ALTER TABLE [dbo].[TableName]
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED
(
[ID], [Name], [Date]
)