문제

클라이언트 측 JavaScript에서 OpenRowset을 사용하여 SQL Server를 통해 대형 Oracle 데이터베이스에 액세스하려고 노력하고 있으며 운이 좋지 않습니다. 다음은 다음과 같습니다.

  • OpenRowset을 사용하여 Oracle 데이터베이스에 액세스하는 SQL Server보기가 완벽하게 작동하므로 유효한 연결 문자열 매개 변수가 있음을 알고 있습니다. 그러나 새로운 요구 사항은 클라이언트 측 선택에 의존하는 매우 동적 인 Oracle 쿼리에 대한 것이며 SQL Server보기 또는 저장 프로 시저에서 작동하기 위해 동적 (또는 매개 변수화 된) Oracle 쿼리를 얻을 수 없었습니다.
  • SQL Server 데이터베이스에 대한 클라이언트 측 액세스는 동적 및 매개 변수화 쿼리와 완벽하게 작동합니다.
  • Oracle 클라이언트 소프트웨어가있는 클라이언트를 믿을 수 없습니다. 따라서 Oracle 데이터베이스에 대한 액세스는 OpenRowset을 사용하여보기, 저장 프로 시저 또는 동적 쿼리를 사용하여 SQL Server 데이터베이스를 통해 있어야합니다.
  • SQL Server 데이터베이스는 공유 서버에 있으므로 전역으로 연결된 데이터베이스를 사용할 수 없습니다.

내 아이디어는 내 자신의 버전의 매개 변수화 된 Oracle 쿼리를 가져오고 매개 변수 대체를 만들고, OpenRowset에서 쿼리를 래핑하고, SQL Server에서 실행하여 결과 레코드 세트를 반환하는 기능을 정의하는 것이 었습니다. 다음은 샘플 코드입니다.

// db is a global variable containing an ADODB.Connection opened to the SQL Server DB
// rs is a global variable containing an ADODB.Recordset
. . .
ss = "SELECT myfield FROM mytable WHERE {param0} ORDER BY myfield;";
OracleQuery(ss,["somefield='" + somevalue + "'"]);
. . .
function OracleQuery(sql,params) {
  var s = sql;
  var i;
  for (i = 0; i < params.length; i++) s = s.replace("{param" + i + "}",params[i]);
  var e = "SELECT * FROM OPENROWSET('MSDAORA','(connect-string-values)';"
    + "'user';'pass','" + s.split("'").join("''") + "') q";
  try {
    rs.Open("EXEC ('" + e.split("'").join("''") + "')",db);
  } catch (eobj) {
    alert("SQL ERROR: " + eobj.description + "\nSQL: " + e);
  }
}

내가 얻는 SQL 오류는 IS입니다 Ad hoc access to OLE DB provider 'MSDAORA' has been denied. You must access this provider through a linked server. 나에게 말이되지 않는다. 이 오류에 대한 Microsoft 설명은 레지스트리 설정과 관련이 있습니다 (DisallowAdhocAccess). 이것은 내 PC에서 올바르게 설정되지만 반드시 클라이언트 PC가 아닌 DB 서버와 관련이 있으며, 위에서 언급 한보기가 작동하기 때문에 설정이 올바른 것으로 기대합니다.

내가 시도한 대안 중 하나는 공개 성명서에서 Enclosing Exec를 제거하는 것입니다.

rs.Open(e,db);

그러나 이것은 동일한 오류를 생성합니다.

또한 OpenRowset을 저장된 절차에 넣었습니다. 이것은 SQL Server Management Studio 내에서 실행될 때 완벽하게 작동하지만 저장 프로 시저가 JavaScript에서 호출 될 때 동일한 오류 메시지로 실패합니다.

내가하려는 일이 가능합니까? 그렇다면 내 코드를 수정하는 방법을 추천 할 수 있습니까? 아니면 완전히 다른 접근법이 필요합니까?

모든 힌트 또는 관련 정보를 환영합니다. 미리 감사드립니다.

도움이 되었습니까?

해결책

나는 이것을 직접 대답하고있다. 답을 찾았고 결과에 만족하지 않습니다. 작동 한 기능은 개인 사용자 ID에 따라 실행되고 있으며 DB-Owner 권한이 있습니다. 용 애드 혹 일에 대한 액세스, 나는 DisallowAdhocAccess 레지스트리 설정 설정 또는 웹 액세스에 사용되는 사용자 ID에 DB-Owner 권한을 제공합니다. 이것은 보안이 엄격한 공유 서버이기 때문에 레지스트리 설정을 변경할 수 없으므로 데이터베이스보다 훨씬 더 많은 영향을 미칩니다. 그리고 두 번째 옵션은 똑같이 위험하다고 생각합니다.

결과적으로 사용자가 Oracle Instant 클라이언트를 설치하도록 강요하여 클라이언트 측 JavaScript에서 Oracle 데이터베이스에 직접 연결을 열 수 있습니다.

나는 여전히 이것에 대한 대안적인 생각을 환영 할 것입니다.

다른 팁

데이터베이스에 클라이언트 측 ADO 연결을 열는 것은 큰 보안입니다. 본질적으로 사용자에게 데이터베이스에 연결 자격 증명을 제공하고 데이터베이스 보안에서 구멍을 찾도록 대담하게합니다. 청중이 회사 내부에 있더라도 Oracle 드라이버를 설치하지 않은 문제 (또는 이전 버전)와 관련하여 문제를 해결할 수 있습니다. JSON 통화 뒤에 오라클 쿼리를 숨기지 않겠습니까? 이렇게하면 서버 측에서 데이터베이스 입력을 소독 할 수 있으며 사용자는 일반 텍스트로 데이터베이스 연결 자격 증명을받지 못했습니다.

SQLServer 상자에 링크 된 서버를 추천하고http://msdn.microsoft.com/en-us/library/ms188279.aspx Oracle 데이터를 얻는 데 사용됩니다

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