2013-01-24 2 views
0

데이터베이스를 태평양 표준시로 UTC로 저장하는 것을 전환하고 있지만 동시에 모든 코드를 변경하지는 않습니다.SQL 트리거가 발생하지만 원래 값이 삽입되지 않았습니다.

두 열에 입력 된 시간을 업데이트하고 변환 한 다음 다른 열에 삽입하는 트리거를 작성하려고합니다.

예. OriginalTime 열에 태평양 시간을 삽입하면 시간이 UTC로 변환되고 NewTime 열이 UTC로 시간으로 업데이트됩니다. 반대로, NewTime에 값을 삽입/업데이트하면 태평양으로 다시 변환하여 OriginalTime에 넣어야합니다.

잘못되었거나 뭔가 반복되고 있습니까?

현재의 트리거가 변환 된 값을 올바르게 입력하고 있지만 트리거를 시작한 삽입이 실패한 것처럼 보입니다.

내가 값을 삽입하는 경우 : 삽입 UPDATE(column)

+-----------------+--------------------------+ 
| CreateDate |  CreateDateUTC  | 
+-----------------+--------------------------+ 
|  NULL  | 2013-01-24 20:27:13.510 | 
+-----------------+--------------------------+ 
+2

커서와 트리거 ... 내 눈, 내 눈 ... 화상. 나는 하나의 업데이트와 case 문을 기반으로 설정을 변경하지 않고 다시 작성하려고합니다. – RThomas

+0

하하 나는 그 감정을 많이 보았지만 그것을 뒷받침 할 정도는 아니다. (그렇지 않다는 말은하지 않습니다.) 레코드가 추가/수정 될 때마다 실행해야하기 때문에 트리거가 적절하지 않습니까? 커서/집합 토론에 관한 한, 집합 기반 모델로 변환하는 방법을 보여주는 유용한 자료가 있습니까? – jstim

답변

5

모든 열에 대한 사실이다 :

INSERT INTO Calls (CreateDate) 
VALUES (GETDATE()) -- getdate currently outputs in pacific time 

을 내가 방아쇠 결과가 아니라 삽입 된 가치를 얻을. 두 번째 업데이트가 CreateDate 열에 null을 쓰는 것입니다.

따라서 코드에서와 같이 업데이트와 삽입을 처리하는 두 가지 트리거를 만들어야합니다. CreateDate 만 평가하는 경우 CreateDateUTC는 NULL이며이를 확인할 수 있습니다.

또한 커서를 사용해서는 안됩니다. 대신 다음과 같이 사용하십시오 :

UPDATE c SET 
    CreateDate = ISNULL(CreateDate, dbo.ConvertUTCTimeToPacific(i.CreateDateUTC)), 
    CreateDateUTC = ISNULL(CreateDateUTC, dbo.ConvertPacificTimeToUTC(i.CreateDate)) 
FROM dbo.Calls AS c 
JOIN INSERTED AS i 
ON i.CallId = c.CallId; 

즉 삽입 트리거의 경우. 업데이트의 경우 다음과 같이 사용할 수 있습니다.

UPDATE c SET 
    CreateDate = CASE WHEN UPDATE ([CreateDateUTC]) THEN CreateDate 
        ELSE dbo.ConvertUTCTimeToPacific(i.CreateDateUTC) 
       END, 
    CreateDateUTC = CASE WHEN UPDATE ([CreateDate]) THEN CreateDateUTC 
        ELSE dbo.ConvertPacificTimeToUTC(i.CreateDate) 
        END 
FROM dbo.Calls AS c 
JOIN INSERTED AS i 
ON i.CallId = c.CallId; 

이것은 모두 테스트되지 않은 코드이지만 작동해야합니다.


편집 : 당신이 정말 IF 문 안쪽이 UPDATE을 포장해야하는 이유를 아래 내 더 이상 설명을 참조하십시오.

+0

몇 주 전에 저는 빨간 문 SQLInTheCity Seattle에서 만났습니다. 그게 너라면, 좋은 발표. 대답에 +1. – RThomas

+0

세 바스 챤, 해답을 가져 주셔서 감사합니다. INSERT가 올바르게 보이지만 UPDATE에 대한 질문이 있습니다. 나는 논리가 약간 뒤떨어 졌다고 생각하지만 토론을하지 않고 게시물을 편집하고 싶지는 않습니다. 나는 역 논리와 CASE 문이 필요한지 여부에 대한 질문을했다. 귀하의 의견을 보내 주셔서 감사합니다. https://gist.github.com/4629551 – jstim

+0

@R 토마스, 거기에 선물을주었습니다. 네가 좋다 니 기쁘다. –

관련 문제