2010-07-06 3 views
1

만료 된 파일을 보관하지 않도록 트리거에 IF 문을 호출하려고합니다. (삭제되었지만 만료되지 않은 파일 만 보존하고 싶음)SQL IF 문을 가져올 수 없습니다. 다중 부분 식별자 "d.ExpiryDate"를 바인딩 할 수 없습니다.

내 실수는 "d.ExpiryDate"라는 멀티 파트 식별자를 바인딩 할 수 없습니다.

내 코드 : 도움을

ALTER TRIGGER [dbo].[ArchiveDB] 
    ON [dbo].[TBL_Content] 
    AFTER DELETE 
AS 

BEGIN 

declare @ContentID int 

set @ContentID = (select ContentID from deleted) 

IF (d.ExpiryDate > getDate()) 
    begin 
     insert into ArchiveBackup.dbo.TBL_Deleted_Content 
     (ContentID, StartDate, ExpiryDate, Title... etc) 
     select 
     d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
     from deleted as d 
    end 

END 

감사합니다!

답변

1

당신은 같은 곳 ExpiryDate를 찾을 수 SQL Server를 얘기해야 할 것 :

if ((select ExpiryDate from deleted) > getdate()) 

여러 행이 곳을 삭제할 때 트리거가 경우에 호출 할 수 있음을 유의하십시오. 쿼리 전체 if contruct를 대체 할 더 좋을 수 있습니다

insert into ArchiveBackup.dbo.TBL_Deleted_Content 
(ContentID, StartDate, ExpiryDate, Title... etc) 
select 
d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
from deleted as d 
where ExpiryDate > getdate() 

또는 더 나은이 테이블에서 직접 삭제하는 대신 행을 삭제하는 저장 프로 시저를 작성합니다. 저장 프로 시저는 트리거보다 이해하고 유지하기가 쉽습니다.

+0

where 문이 실제로 더 효과적이었습니다. 감사합니다! – Spooks

1

별칭이 d 인 곳 어디에도 테이블이나 뷰가 없으므로 찾을 수 없습니다.

당신은이 경우 전체 테이블 이름을 사용해야합니다 :

ALTER TRIGGER [dbo].[ArchiveDB] 
    ON [dbo].[TBL_Content] AFTER DELETE 
AS BEGIN 

declare @ContentID int 

set @ContentID = (select ContentID from deleted) 

IF (deleted.ExpiryDate > getDate()) 
BEGIN 
     insert into ArchiveBackup.dbo.TBL_Deleted_Content 
     (ContentID, StartDate, ExpiryDate, Title... etc) 

     select 
     d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
     from deleted as d 
END 
END 

별명 d는 오직 선언 내부 BEGIN ... END 블록을 을 사용 - 그것은 그 블록 외부에 표시되지입니다! 테이블 별명은 선언하는 명령문에서만 사용할 수 있습니다. 전역 적으로 표시되지 않습니다.

+1

+1 : 당신의 trigger-fu가 내 것보다 낫다. –

+1

'if'처럼 필드를 직접 사용할 수 없다. 먼저 변수에 '선택'해야한다. 그리고 만약 당신이 그렇게해도, 둘 이상의 행을 "삭제"하면 (OP의 방아쇠가 여러 행으로 같은 문제를 가지고 있음을 알 수 있습니다.) – Donnie

+0

Donnie와 동의하면 오류가 발생합니다. 멀티 파트 식별자 "deleted.ExpiryDate"를 바인딩 할 수 없습니다. " – Andomar

0

나는 이것이 한 번에 둘 이상의 행을 삭제할뿐만 아니라 각 행에 대해 원하는 조건을 확인하는 경우를 적절히 처리하기 때문에 이것이 필요한 것이라고 생각합니다.

ALTER TRIGGER [dbo].[ArchiveDB] 
ON [dbo].[TBL_Content] 
AFTER DELETE 
AS 

BEGIN 

insert into ArchiveBackup.dbo.TBL_Deleted_Content (ContentID, StartDate, ExpiryDate, Title... etc) 
    select 
    d.ContentID,d.StartDate,d.ExpiryDate,d.Title... etc 
    from 
    deleted as d 
    where 
    d.ExpiryDate > getDate() 

END 
관련 문제