2016-06-01 2 views
0

업데이트 커서를 사용하여 ASE (버전 15.7 ESD 15.2)의 이상한 동작에 직면했습니다.
마지막으로 나는 근본 원인을 찾았지만 유용 할 수 있고 여기 누군가가 이미 그것을 마주 쳤기 때문에 여기에 게시하는 것에 대해 thougth합니다. 업데이트 커서가 충돌하는 Sybase ASE

DECLARE c_contactrule 
CURSOR FOR 
SELECT a.id 
FROM FTContactRule a, Client b, ClientContact c 
WHERE /* join conditions */ 
AND a.client_id IN (bla bla bla) 
AND a.message_subtype_id (bla bla bla) 
AND /* and so on */ 
for update of a.preferred_medium_id 
go 

(나는이 게시물에 대한 약간에게 쿼리를 요약이 더 많은 읽을 수하기)

이하 물론, 내가 읽어

나는이 간단한 "업데이트"커서를 썼다 끝까지 커서 값.

open c_contactrule 
fetch c_contactrule into @rule_to_update 
while @@sqlstatus = 0 
begin 
    /* do something */ 
end 
close c_contactrule 
deallocate c_contactrule 
go 

나는 당신이 어딘가에 현재 update preferred_medium_id where current of

, 매우 구체적인 방식이 쿼리 충돌이 있음을 짐작 생각한다 던진 메시지는 "ASE는이 과정을 termintaed"실제로, 그는 나의 세션을 죽입니다 !

조사한 결과 나쁜 코드 줄이 처음으로 fetch into 문이었습니다.

답변

0

나는 마침내이 오류 메시지의 원인을 발견했지만 충돌은 서버에서 너무 힘들어서 여전히 버그라고 생각합니다. 사용자 친화적 인 메시지 또는 구문 분석 오류가 있어야하지만 자동 종료는 없어야합니다. ,

select a.id 
.... 
for update of a.preferred_medium_id 

난 그냥 선택 목록에서 필드를 추가 :

어쨌든, 내 테스트는 문제 때문에 내가 커서의 SELECT 문에없는 필드를 업데이트한다는 사실에 있음을 보여줍니다 물론 가져 오기에 변수를 추가했는데 제대로 작동했습니다.

select a.id, a.preferred_medium_id 
.... 
for update of a.preferred_medium_id 

그러나, 당신이 그것으로 아무것도 할 필요가 없을 때 변수에 값을 유지해야하는 다소 이상하다.

또한 세션을 종료해도 서버의 응답이 좋지 않습니다. 이에 대한 구문 규칙이있는 경우 "업데이트하지 않은 커서에 대해 선택 목록을 선택하지 않은 필드를 업데이트 할 수 없습니다"라는 구문 오류가 표시되어야합니다.

1

ASE가 세션을 종료하면 나쁜 ASE에서 버그를 치는 행운. 유일한 해결책은 수정 사항이 포함 된 최신 버전으로 업그레이드하는 것입니다. 버그를 식별 할 수 있으면 (오류 로그에 스택 추적이 있어야 함) 사용 가능한 수정 사항이 있는지 TechSupport에 확인하십시오.

다른 방법으로 쿼리를 다시 작성하면 쿼리 계획이 달라져서 버그가 발생하지 않을 수도 있지만 이는 보장 할 수 없으며 매우 위안이되지 않을 수도 있습니다.

관련 문제