2

SQL Sever 데이터베이스에서 흥미로운 동작이 나타납니다. 테이블 X를 선택하는 병합 문이 있습니다. 일치 절에 테이블 X에 대한 subselect가 있습니다. SQL Server 도구에서 저장 프로 시저를 실행하면 올바르게 작동합니다. 하지만 IPC (ETL Tool)에서 실행하면 예외가 발생합니다. Invalid object name 'X'.동일한 저장 프로 시저에서 성공적으로 업데이트 된 테이블의 개체 이름이 잘못되었습니다.

지금까지 아무 것도 특별하지 않았으므로 사용 권한이 잘못되었을 수도 있습니다.

이상한 점 : 병합 문이 try 블록에 있고 catch 블록에서 오류 메시지가 update 문을 통해 테이블 ​​X에 기록됩니다! SQL Server가 테이블 X를 찾을 수 없다는 불만이있을 때 어떻게 가능합니까?

또한 코드 생성을 통해 동일한 방식으로 생성되지만 다른 테이블 집합에서 생성되는 다른 저장 프로 시저와 모두 잘 동작합니다.

코드는 무슨 일이 일어나고 있는지이

merge ... 
    using 
    (select ... 
    from dbo.X 
    where ... 
    when not matched by target 
    and not exists (select 1 from dbo.X q2 where ...) 
    then insert (... 
    ) 
    values (... 
    ) 
    when matched and q.ACTION='D' 
    then delete 
    when matched AND NOT exists (select 1 from dbo.X q3 where ...) 
    then update 
    set 
     ... 

    OUTPUT $action INTO @l_SummaryOfChanges; 
    -- Query the results of the table variable. 
    SELECT ACTION, COUNT(*) AS CountPerChange 
    FROM @l_SummaryOfChanges 
    GROUP BY ACTION; 
    end try 
    begin catch 
    update dbo.X 
    set LAST_ERROR_MSG=ERROR_MESSAGE(), ERROR_COUNTER=ERROR_COUNTER+1 
    where [email protected]_SyncID 
    end catch 

어떤 아이디어처럼 보인다? 잘못된 개체 이름 '싱크 $의 _tabTeiledaten을'.

+1

정확한 메시지를 보내주십시오. 그리고 X의 모든 용도는 dbo로 자격이 부여 된 스키마입니까? – gbn

+0

오류 메시지가 우리가 보는 것과 정확히 일치하도록 업데이트했습니다. dbo 앞에 접두어가 붙은 코드의 모든 항목. 대문자 사용법은 모든 경우에 똑같습니다. 그러나 우리가 오류 메시지에서 보는 것과 다릅니다. (그것은 힌트일지도 모른다) –

답변

2

발견했습니다. gbn의 질문은 X의 사용이 예외와 아무 관련이 없다는 것을 깨닫게했습니다. 실제로 병합 대상 테이블에서 실제로 스키마를 지정하지 않고 다른 스키마에서 X를 참조하는 트리거가있었습니다.

월 누군가가 우리가이 똥을 디버깅하는 방법과 혜택 :

  • 우리가 새 이름 (Y)와 X를 중복 여전히 '잘못된 개체 이름'X '를 말하는 오류 메시지를 받았습니다. 이 시점에서 우리는 뷰 또는 뭔가를 참조 할 수 있다고 생각했습니다.
  • 우리는 병합 성명에서 모든 열을 제거했습니다. 단, 널이 아닌 제약으로 인해 필요한 경우는 제외합니다. 문제가 지속되었습니다.
  • 한 번에 병합 문구의 분기 중 하나를 제거했습니다. 문제는 지속되었다.
  • 완전한 병합 문을 제거했습니다. 오류는 사라졌습니다. 그 시점에서 우리는 목표물 테이블에 물고기 같은 것이 생길지도 모른다는 것을 깨달았습니다.
  • 검사에서 우리는 지옥의 방아쇠를 발견했습니다.
관련 문제