2016-11-30 2 views
0

작성자가 성과 이름의 조합에 따라 테이블에 이미 있는지 확인하는 트리거를 만들려고합니다. 필자가 읽은 글에서이 트리거가 작동해야하지만, 테이블에 새로운 작성자를 삽입하려고하면 "작성자가 이미 테이블에 있습니다!"라는 메시지가 나타납니다. 테이블에 존재하지 않는 작성자를 삽입하더라도 오류가 발생합니다.MS SQL 두 필드에서 중복 확인

여기 여기에 테이블에 어떤 도움을 주시면 감사하겠습니다

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] 

가 트리거
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 

입니다!

+0

테이블에 기본 키가 있어야합니다. 이 두 열의 조합은 트리거로이를 수행하는 대신 고유 한 제한 조건이어야합니다. –

+0

author_id가 기본 키이므로 작성하는 것을 잊어 버렸습니다. 이것은 대학 데이터베이스 프로젝트를위한 것이므로 반대로 약간의 트리거를 생성해야합니다. – dbs1crew

+1

여기서 명시적인 거래를 시작하고 싶지는 않습니다. 트랜잭션은 항상 트리거로 시작됩니다. –

답변

1

트리거 대신 사용하면됩니다. 이것은 또한 실제로 트리거 내에서 삽입을 수행해야한다는 것을 의미합니다. 이 라인을 따라 뭔가.

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