Триггер для предотвращения вставки повторяющихся данных двух столбцов

Я работаю над SQL Server 2008R2, у меня есть следующая таблица

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

Теперь я хочу предотвратить вставку, если у меня есть данные, хотя идентификатор отличается, но данные присутствуют

 ID    Name     date
  4    ABC      2011

любезно направьте меня, как я должен написать этот триггер.

4 ответов


что-то вроде этого:

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

попробуй такое

 CREATE TRIGGER trg ON TableName
 AFTER INSERT 
 AS
  Begin
  Declare @id int,@name varchar(10),@date DateTime
  Declare @cnt1 int,@cnt2 int,@cnt3 int

  INSERT INTO TableName(ID, Name, Date) VALUES(4,'ABC',2011)
  select @id=ID,@name=Name,@date=Date from inserted

  select @cnt2=Count(*) from TableName where Name=@name
  select @cnt3=Count(*) from TableName where Date=@date

  if(@cnt2>1 or @cnt3>1)
    Rollback
  else 
    Commit

  end