2016-11-30 35 views
0

我想创建一个触发器,检查作者是否已经存在于一个基于他们的名字和姓氏的组合中的表中。从我读过的这个触发器应该可以工作,但是当我尝试插入任何新的作者时,它会给出“作者已经存在于表格中!”错误,即使我插入表中不存在的作者。MS SQL检查两个字段中的重复

这里是触发

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 

下面是表

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] 

任何援助将不胜感激!

+0

你真的应该在你的桌子上有一个主键。这两列的组合应该是一个唯一的约束,而不是试图用触发器来做到这一点。 –

+0

author_id是主键,忘记了写入。这是针对大学数据库项目的,我们需要创建几个触发器 – dbs1crew

+1

@cbranch恰恰相反。你不想在这里开始一个明确的交易。交易将始终以触发器启动。 –

回答

1

您需要将其作为INSTEAD触发器来执行此操作。这也意味着您需要在触发器内实际执行插入。沿着这些线路的东西。

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

这工作完美!谢谢! – dbs1crew