2013-08-29 6 views
9

sto lavorando su SQL Server 2008R2, sto avendo la seguente tabellatrigger per evitare un inserimento per i dati duplicati su due colonne

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

Ora voglio impedire l'inserimento se ho un dati anche se l'ID è diverso, ma i dati è presente

ID Name  date 
    4 ABC  2011 

Gentilmente guidami come devo scrivere questo trigger.

+1

Hai davvero bisogno di un trigger? Hai provato indice o vincolo univoci? – Elmer

+0

e come applicare quando la mia chiave primaria è ID ?? – WiXXeY

+2

CREARE UNICO INDICE NONCLUSTERED XXTable_Unq ON xxTable (nome ASC, [data] ASC) – Elmer

risposta

16

Qualcosa di simile a questo:

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 

Questo è solo per l'inserimento, si potrebbe prendere in considerazione gli aggiornamenti anche.

Aggiornamento

Un modo più semplice sarebbe quella di creare solo un vincolo univoco sul tavolo, questo sarà anche farla rispettare per gli aggiornamenti troppo e rimuovere la necessità di un trigger. Basta fare:

ALTER TABLE [dbo].[TableName]  
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED 
(
    [Name], [Date] 
) 

e poi sarai in affari.

+1

Un semplice vincolo univoco sarebbe meglio. – Namphibian

+0

anche se questo fa sorgere l'errore ma non riesco a fermare l'inserimento, il mio problema è ancora lì – WiXXeY

+0

Oh sì, è perché ho perso la linea ROLLBACK - quindi aggiungila come ho appena fatto. Ma dai un'occhiata alla risposta di James, forse un vincolo unico è quello che stai cercando. – Rocklan

2

Se si sta utilizzando una procedura di archiviazione inserendo dati nella tabella, non è realmente necessario un trigger. Per prima cosa controlla se la combinazione esiste quindi non inserire.

Il trigger di seguito può essere utilizzato se non si inseriscono dati tramite la procedura di memorizzazione.

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 
+1

il trigger può sollevare l'errore ma i dati si stanno ancora inserendo nella tabella, come smettere di inserire i dati – WiXXeY

-3

Prova questa

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 [email protected] 
    select @cnt3=Count(*) from TableName where [email protected] 

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

    end 
+0

Questo è pieno di bug e non funzionerà. La tua frase di inserimento ha valori hard codificati, inoltre non consentirà dati con nomi duplicati o date o persino ID. – Rocklan

+0

Il requisito non è quello di consentire duplicati anche id diversi, giusto? – Kalyan

0

non si ha realmente bisogno di un trigger per questo. Basta impostare un vincolo univoco per più colonne.

ALTER TABLE [dbo].[TableName]  
ADD CONSTRAINT [UQ_ID_Name_Date] UNIQUE NONCLUSTERED 
(
    [ID], [Name], [Date] 
) 
+2

Il vincolo non dovrebbe essere solo sulle colonne Nome e Data? – Rocklan

Problemi correlati