Триггер для предотвращения вставки повторяющихся данных двух столбцов
Я работаю над 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