12

私は取り組んでいますSQL Server 2008R2、私は次の表を持っています

ID     Name     date
 1     XYZ      2010
 2     ABC      2011
 3     VBL      2010

IDは異なりますがデータは存在しますが、データがある場合は挿入を防止したい

 ID    Name     date
  4    ABC      2011

このトリガーの書き方を教えてください。

4

6 に答える 6

22

このようなもの:

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]
)

そして、あなたはビジネスになります。

于 2013-08-29T05:22:47.697 に答える
4

テーブルにデータを挿入するストア プロシージャを使用している場合、実際にはトリガーは必要ありません。最初に組み合わせが存在するかどうかを確認してから、挿入しません。

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  
于 2013-08-29T05:47:58.817 に答える
0

これには本当にトリガーは必要ありません。複数の列に一意の制約を設定するだけです。

ALTER TABLE [dbo].[TableName]    
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED
(
    [ID], [Name], [Date]
)
于 2013-08-29T08:23:25.133 に答える