클래식 ASP를 통해 다른 저장 프로시저에서 저장 프로시저를 호출하는 데 문제가 있습니다.

StackOverflow https://stackoverflow.com/questions/107585

문제

우리는 간단하게 작동하는 고전적인 ASP 응용 프로그램을 가지고 있으며 오래전에 죽은 그리스 신들의 분노를 불러일으키지 않도록 코드를 수정하는 것을 싫어했습니다.

최근에 애플리케이션에 기능을 추가해야 한다는 요구 사항이 있었습니다.기능 구현은 실제로 UI에 대한 최소한의 변경이 필요한 데이터베이스 작업일 뿐입니다.

UI를 변경하고 sproc 호출(sproc1)에 새 데이터 값을 제출하도록 약간 수정했습니다.

ASP에서 직접 호출되는 sproc1에서는 다른 서버인 sproc2에 있는 다른 sproc에 대한 새로운 호출을 추가했습니다.

어쨌든 이것은 ASP 앱을 통해서는 작동하지 않지만 SQL Management Studio에서는 작동합니다.

기술적인 세부 사항은 다음과 같습니다.

  1. 두 데이터베이스 서버 모두에 SQL 2005가 있습니다.
  2. SQL 로그인은 ASP 응용 프로그램에서 SQL 2005 Server 1로 인증됩니다.
  3. 서버 1에서 서버 2로 연결된 서버가 작동 중입니다.
  4. SQL Management Studio에서 sproc1을 실행하면 정상적으로 작동합니다.우리 코드에서 사용하는 동일한 사용자(애플리케이션 SQL 로그인)로 자격 증명을 받은 경우에도 마찬가지입니다.
  5. sproc2는 SQL Management Studio에서 sproc1과 독립적으로 호출될 때 작동합니다.
  6. VBScript(ASP)는 XML로 클라이언트에 다시 내보내지는 오류를 캡처합니다.오류 번호는 0이고 오류 설명은 비어 있습니다.ADODB.Connection 개체와 ASP 측의 VBScript에서 생성되는 Err.Number/Err.Description 모두에서 발생합니다.

따라서 오류나 재현성이 전혀 없습니다(예:SQL Mgmt Studio를 통해) - 문제를 아는 사람이 있습니까?

현재 계획은 ASP 측의 코드를 분석하여 sproc1을 통해 피기백하는 대신 ASP에서 직접 Server 2.sproc2를 완전히 별도로 호출하는 것입니다.

도움이 되었습니까?

해결책

내 첫 번째 반응은 이것이 서버 간 호출의 문제가 아니라 첫 번째 프로세스에서 두 번째 프로세스를 호출하는 문제일 수 있다는 것입니다. 이것 서로 다른 두 환경에서 다르게 행동하는 것일 수도 있습니다.

내 첫 번째 질문은 다음과 같습니다.방정식에서 서버 간 측면을 제거하면 어떻게 되나요?첫 번째 proc이 두 번째 proc을 호출하는 테스트 시스템을 설정할 수 있지만 두 번째 proc이 동일한 서버 및/또는 동일한 데이터베이스에 있는 경우에도 여전히 동일한 문제가 발생합니까?

같은 맥락에서:제 경험상 애플리케이션과 SSMS가 이렇게 서로 다른 결과를 얻었을 때 저장 프로시저의 설정 문제인 경우가 많았습니다.Luke가 말했듯이 NOCOUNT일 수 있습니다.PRINTed 값이 오류 설명의 일부가 된 것을 기억하는 것 같지만(매우 반직관적으로) 코드의 외부 PRINT 문에서 이런 종류의 일이 발생했습니다.

만약에 아무것 SSMS에서 이를 실행하면 메시지 창에 이 반환됩니다. 어디서 오는지 찾아 중지하세요.기술적인 용어를 찾아봐야 할 것 같지만, 쿼리 환경이 다르면 "오류"에 대한 민감도가 다르며, SSSM을 통한 기본 연결은 스크립팅 언어의 ADO 연결이 특정 시간에 오류를 발생시키지 않는다는 것입니다. .

마지막 생각:환경 문제인 경우 ASP 페이지의 연결 문자열에서 다른 설정을 시도해 보십시오.예를 들어 OLEDB 연결이 있는 경우 ODBC를 사용해 보세요.기본 및 비기본 SQL Server 드라이버를 사용해 보세요.공급자가 지원하는 연결 문자열 옵션이 무엇인지 확인하고 시도해 볼 가치가 있을 것 같은 옵션을 시도해 보십시오.

다른 팁

얻었 니 카운트 안함 설정 두 저장 프로시저에 모두 설정되어 있나요?비슷한 문제가 한 번 있었는데 지금은 어떻게 해결했는지 정확히 기억할 수 없지만 그 문제와 관련이 있다는 것은 알고 있습니다!

당신은 고통을 겪을 수 있습니다 이중 홉 문제

이중 홉 문제는 ASP/X 페이지가 IIS 서버와 다른 서버에 있는 리소스를 사용하려고 할 때 발생합니다.

Windows NT 챌린지/응답 지원하지 않습니다 이중 홉 가장(IIS 서버에 전달된 후에는 인증을 위해 동일한 자격 증명을 백엔드 서버에 전달할 수 없음)

SQL 프로파일러를 사용하여 두 번째 연결 시도를 확인해야 합니다.

수동 테스트에서는 IIS를 통해 인증하지 않습니다.이 문제는 ASP/X 페이지를 통해 SQL을 시작할 때만 나타납니다.

추가 리소스:

비슷한 문제가 있었는데 nocount를 설정하고 인쇄 명령을 제거하여 문제를 해결했습니다.

예제 코드가 도움이 될 수 있습니다. 저장 프로시저에서 두 테이블을 반환하려고 하시나요?ADO 2.6에서는 반환되는 여러 테이블을 처리할 수 없다고 생각합니다.

나는 그것을 (이중 홉) 고려했지만 내가 언급하는 것과 같은 sproc-in-a-sproc 호출과 sproc 호출의 차이점은 무엇입니까?INNER JOIN을 통한 일반적인 서버 간 조인?둘 다 연결된 서버 자격 증명을 사용하고 서버 2에 인증하여 Server1에서 실행됩니다.

sproc 교차 서버를 호출하는 것이 데이터 테이블에 조인을 수행하는 것과 다르다는 것을 누가 확인할 수 있습니까?그리고 왜?

연결된 서버 구성이 SQL 계정인 경우 이중 홉으로 간주됩니까?(NTLM 이중 홉을 참조하기 때문입니까?)

여러 결과 집합이 다시 나오는지 여부에 대해서는 아니요.Server1.Sproc1과 Server2.Sproc2는 모두 .net 세계에서 "ExecuteNonQuery()"이며 아무것도 반환하지 않습니다(결과 집합 및 반환 값 없음).

연결 문자열에 지정된 사용자의 데이터베이스에 대한 권한을 확인해보세요.sql mgmt studio를 사용하는 동안 데이터베이스에 로그인하려면 연결 문자열에 동일한 사용자 이름을 사용하십시오.

애플리케이션을 디버깅하는 효과적인 방법이 될 수 있으므로 임시 테이블을 만들어 중간 값과 예외를 작성하세요.

그냥 확인해도 될까요:sproc2를 추가하셨나요?그 전에는 오랫동안 잘 작동했습니다.

sproc2를 호출하는 위치를 변경할 수 없나요?sproc1 내부에서 호출하는 대신 ASP에서 호출할 수 있습니까?이렇게 하면 코드에서 SQL에 대한 인증을 제어할 수 있으며 서버에서 신뢰 설정이나 공유 원격 인증에 의존할 필요가 없습니다.

연결된 서버는 어떻게 설정되어 있나요?일반적으로 현재 로그인된 사용자로 로그인하거나 항상 사용할 SQL 로그인을 지정하는 등 원격 서버에 인증하는 방법에 대한 몇 가지 옵션이 있습니다.항상 특정 계정을 사용하도록 설정해 보셨나요?그러면 원격 프로시저를 호출할 때 발생할 수 있는 권한 문제가 제거됩니다...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top