2014-12-03 4 views
2

SQL Server는 처음이 아니지만 트리거가 처음입니다. 나는 약간의 튜토리얼을 읽었으며 구문이 조금 혼란 스럽다는 것을 솔직히 알기 원합니다.SQL Server 2008 트리거

특정 값으로 설정된 필드를 확인한 다음 동일한 테이블의 다른 필드를 업데이트하는 트리거를 만들려고합니다.

는 희망 아래 코드 자체에 대한 이야기되고 문제는 사람

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
    IF UPDATE(status) 
    BEGIN 
     UPDATE projects 
     SET date_complete = GETDATE() 
     FROM inserted 
     WHERE inserted.status = 'Completed' 
      AND projects.date_complete = '1900-01-01' 
END 

위의 코드는 내가 바라던 효과가 없습니다에게 명백 할 것이다. 행을 업데이트하고 상태를 Completed으로 설정하면 date_complete 열이 기본값 인 1900-01-01으로 유지됩니다.

감사

은 marc_s의 의견에 따라 경찰 지금 작동 다음에 트리거를 수정했습니다. 수정 사항은 where 절에 AND inserted.id = projects.id이 추가 된 것입니다.

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
IF UPDATE(status) 
BEGIN 
    UPDATE projects 
    SET projects.date_complete = GETDATE() 
    FROM inserted 
    WHERE inserted.status = 'Completed' 
    AND inserted.id = projects.id 
    AND projects.date_complete = '1900-01-01' 
END 

모두에게 감사드립니다.

+1

난 당신이 * *은'삽입 업데이트 삽입 된 해당 행을/연결있어 표시되지 않습니다 다음 WHERE 절에 같은

inserted.ID = projects.ID 

같은 또는 무언가가 있어야한다 'pseudo table을'Projects' 테이블의 행에 추가하십시오. WHERE 절에는'inserted.ID = projects.ID' 또는 이와 비슷한 것이 있어야합니다. 또한 :'date_complete'는 실제로 그 값입니까, 아니면 데이터베이스에서'NULL'입니까? 그리고 GUI에서'1900-01-01'로 표시 되었습니까? 또한 ** ** ** ** ** 부분을 포함하기 때문에'DATETIME' 열과 **주의 **하십시오! –

+1

먼저 "AND projects.date_complete = '1900-01-01'"조건없이 트리거를 사용해보십시오. 완벽하게 작동하면 문제는 날짜 비교와 관련이 있습니다. – Veera

+0

건배. marc_s - 일자 필드의 디폴트는 '1900-01-01'입니다. null이 아닙니다. 내가 꽤 많이 트리거했기 때문에 where 절의 inserted.id = projects.id 비교를 살펴볼 것입니다. Veera - 감사합니다. – Urbley

답변

1

당신이 당신의 Projects 테이블의 행에 Inserted 의사 테이블에 업데이트 삽입 된 해당 행을/연결하고 어떻게 표시되지 않습니다.

UPDATE p 
SET 
    p.date_complete = GETDATE() 
FROM 
    dbo.Projects p 
INNER JOIN 
    inserted i ON inserted.id = projects.id 
WHERE 
    i.status = 'Completed' 
    AND p.date_complete = '1900-01-01' 
+0

위의 예제를 시도하지는 않았지만 삽입 된 테이블과 프로젝트 테이블을 연결하는 것과 관련된 원래 주석이 솔루션 이었기 때문에이 질문에 답을 표시합니다. – Urbley

0

아래의 트리거 변경을 시도하십시오. 방금 약간의 변경을했습니다.

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    IF UPDATE(status) 
    BEGIN 
     DECLARE @status AS VARCHAR(20) 
     DECLARE @ID AS INT 

     SELECT @status = status, @ID = ID FROM INSERTED 

     UPDATE projects 
     SET date_complete = GETDATE() 
     WHERE @status = 'Completed' 
     AND id = @ID 
     AND CONVERT(CHAR(10), date_complete, 101) = '1900-01-01' 
    END 
END 
+0

안녕하세요 Veera이 불행히도 나를 위해 작동하지 않았지만 marc_s의 의견을 기반으로 작동하도록 관리했습니다. 둘 다 고맙습니다. 수정 사항을 포함하도록 질문을 수정하겠습니다. – Urbley