2017-07-18 5 views
0

je ce déclencheur dans SQL Server:Trigger reconnaissant les données que les doublons quand il est pas

CREATE TRIGGER MyTrigger ON [dbo].[practiseduplicates] 
AFTER INSERT 
AS 
    IF EXISTS (SELECT * 
       FROM [practiseduplicates] t 
       INNER JOIN inserted i ON i.[money] = t.[money] 
            AND i.[Name] = t.[Name] 
            AND i.[year month] = t.[year month]) 
    BEGIN 
     ROLLBACK 
     RAISERROR ('Duplicated Data', 16, 1); 
    END 

j'insère alors ces valeurs (qui sont déjà dans le tableau de données):

insert into [practiseduplicates] 
values ('2017-02', 'buzzlightyear', '10.09') 

Lorsque je clique sur Exécuter je m'attendais à ce que le message d'erreur apparaisse ... ce qu'il a fait, cependant quand je change les valeurs en information que je sais ne pas dans le tableau de données

'2056-12', 'mr potato head', '12345.09' 

Le message d'erreur apparaît toujours en place, alors qu'en réalité il aurait dû simplement insérer les données dans la table, personne ne sait pourquoi est-ce le cas? Je suppose que c'est à faire avec ma déclaration de jointure interne, mais je ne suis pas sûr.

+0

J'espère que cela est un apprentissage sur les déclencheurs excercise, car le maintien des doublons en est le travail de contrainte unique. –

+0

Eh bien c'est plus de garder des doublons, qu'un exercice de déclenchement. Donc je suppose que je suis en train d'utiliser la mauvaise technique? – VS1SQL

+0

Oui, mauvaise technique. –

Répondre

0

Donc, fondamentalement, j'ai utilisé une contrainte pour résoudre ce plutôt qu'une déclaration de déclenchement.

ALTER TABLE [dbo].[practiseduplicates]  
ADD CONSTRAINT [constraintforduplicates] UNIQUE NONCLUSTERED 
([column name], 
[column name], etc etc 
) 

Cela arrête les doublons en utilisant les colonnes que vous dites dans la déclaration de contrainte que les données à comparer et le drapeau si elles sont en double et ne pas insérer les données dans la table.

Notez que les colonnes de l'instruction ont une contrainte de 900 octets elles-mêmes. Ainsi, si vous aviez une colonne varchar (max), la contrainte ne s'exécuterait pas car le maximum qu'elle peut faire est de 900 octets. Dans mon script j'ai mis varchar (800).

1

cité de votre question

Lorsque je clique exercerai je me attendais le message d'erreur de pop-up ... ce qu'il a fait, mais quand je change les valeurs à l'information que je connais est pas dans les données Table

Cette partie italique de la déclaration n'est pas tout à fait exact, car même si ces valeurs ne sont pas dans la table avant, après avoir exécuté insert, ils sont là-dedans. Et le déclencheur va tirer.

En bref, vous créez un déclencheur APRÈS INSERT et vérifier si les données insérées à la table est déjà dans la table (après l'insertion est couru). Bien sûr, le déclencheur se déclenchera à chaque fois car si les données se trouvent dans la table insérée, elles se trouvent dans la table (car elle vient juste d'être insérée).

+0

Je vois, alors quelle serait la bonne technique pour cela, Shannon a suggéré une contrainte unique? – VS1SQL

+0

Basé sur ce que vous avez posté, oui, il semble que la contrainte unique sur ces 3 colonnes ferait ce que vous voulez sur cette table (à condition qu'il n'y ait pas eu de doublon jusqu'à présent). – DVT