2016-11-30 1 views
0

Ich versuche einen Trigger zu erstellen, der überprüft, ob der Autor bereits in einer Tabelle basierend auf einer Kombination von Vor- und Nachnamen existiert. Nach dem, was ich gelesen habe, sollte dieser Trigger funktionieren, aber wenn ich versuche, einen neuen Autor in die Tabelle einzufügen, gibt es den "Autor existiert in der Tabelle bereits!" Fehler, obwohl ich einen Autor einfüge, der in der Tabelle nicht existiert.MS SQL Check für Duplikate in zwei Feldern

ist hier der Auslöser

USE [WebsiteDB] 
GO 
CREATE TRIGGER [dbo].[tr_AuthorExists] ON [dbo].[Authors] 
AFTER INSERT 
AS 

if exists (select * from Authors 
    inner join inserted i on i.author_fname=Authors.author_fname AND i.author_lname=Authors.author_lname) 
begin 
    rollback 
    RAISERROR ('Author exists in table already!', 16, 1); 
End 

Hier ist der Tisch Jede Hilfe würde geschätzt

CREATE TABLE [dbo].[Authors](
    [author_id] [int] IDENTITY(1,1) NOT NULL, 
    [author_fname] [nvarchar](50) NOT NULL, 
    [author_lname] [nvarchar](50) NOT NULL, 
    [author_middle] [nvarchar](50) NULL, 
CONSTRAINT [PK_Authors] PRIMARY KEY CLUSTERED 
(
    [author_id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

ist!

+0

Sie sollten wirklich einen Primärschlüssel auf Ihrem Tisch haben. Die Kombination dieser beiden Spalten sollte eine eindeutige Einschränkung sein, anstatt dies mit einem Trigger zu versuchen. –

+0

Die author_id ist der Primärschlüssel, vergaß das zu schreiben. Dies ist für ein College-Datenbank-Projekt, und wir sind verpflichtet, ein paar Trigger – dbs1crew

+1

@cbranch im Gegenteil zu erstellen. Sie möchten hier keine explizite Transaktion starten. Eine Transaktion wird IMMER in einem Trigger gestartet. –

Antwort

1

Sie müssen dies als INSTEAD des Triggers tun. Dies bedeutet auch, dass Sie den Einsatz tatsächlich innerhalb des Auslösers durchführen müssen. Etwas in dieser Richtung.

CREATE TRIGGER [dbo].[tr_AuthorExists] ON [dbo].[Authors] 
instead of insert 
AS 
    set nocount on; 

    if exists 
    ( 
     select * from Authors a 
     inner join inserted i on i.author_fname = a.author_fname AND i.author_lname = a.author_lname 
    ) 
    begin 
     rollback 
     RAISERROR ('Author exists in table already!', 16, 1); 
    End 
    else 
     insert Authors 
     select i.author_fname 
      , i.author_lname 
      , i.author_middle 
     from inserted i 
+0

Das hat perfekt funktioniert! Vielen Dank! – dbs1crew