2007~2011/SQL Server2008. 6. 16. 15:00

sysadmin이 아닌 일반 사용자 계정으로 OPENROWSET 쿼리를 사용하여 원격 데이터 엑세스를 시도하였을 때 엑세스 거부와 관련하여 아래와 같이 정리하였습니다. 


[환경]
SQL Server 2000 SP4

 
[현상]
사용자 계정으로 OPENROWSET 쿼리를 사용하여 원격 데이터 엑세스 할 때 오류 발생  

SELECT * FROM  
  OPENROWSET ('MSDASQL', 'Driver={Microsoft Excel Driver (*.xls)};
  DBQ=D:\DATA;', 'SELECT * from SELECT * from member.txt')

서버: 메시지 7415, 수준 16, 상태 1, 줄 1
OLE DB 공급자 'MSDASQL'에 대한 임의 액세스가 거부되었습니다. 연결된 서버를 통해 이 공급자에 액세스해야 합니다.

 
[원인]

이 방법은 OLE DB를 사용하여 원격 데이터에 연결하고 액세스하는 일회성의 임시 방법이며 연결된 서버에서 테이블을 액세스하는 방법의 대안입니다. OLE DB 데이터 원본을 자주 참조하려면 연결된 서버를 사용합니다.
지정한 공급자에 대해 DisallowAdhocAccess 레지스트리 옵션을 명시적으로 0으로 설정하고 Ad Hoc Distributed Queries 고급 구성 옵션을 활성화한 경우에만 OPENROWSET를 사용하여 OLE DB 데이터 원본의 원격 데이터에 액세스할 수 있습니다. 임시 이름 사용을 설정하면 SQL Server 2000에 대한 모든 인증된 로그인에서 공급자에 액세스할 수 있습니다. (보안상 권장하지 않는다는 의미가 됩니다)

SQL Server 관리자는 모든 로컬 로그인에서 액세스해도 안전한 신뢰할 수 있는 공급자에 대해서만 이 기능을 설정해야 합니다.
만약 원격 엑세스 허용이 필요하다면 아래 방법으로 연결을 허용할 수 있습니다. 

 
[조치방법]
레지스트리를 편집하여 DisallowAdHocAccess Value를 추가합니다.

[시작] - [실행] - REGEDIT.EXE
 
1. MSDASQL

  Locate, and then click the following key in the registry:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\MSDASQL

  On the Edit menu, click Add Value, and then add this registry value:

 Value name: DisallowAdHocAccess
 Data type:  REG_DWORD
 Radix:      Hex
 Value data: 0



2. Microsoft.Jet.OLEDB.4.0

  Locate, and then click the following key in the registry:
  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\Microsoft.Jet.OLEDB.4.0
 
  On the Edit menu, click Add Value, and then add this registry value:

Value name: DisallowAdHocAccess
Data type:  REG_DWORD
Radix:      Hex
Value data: 0



[참고자료]
OPENROWSET(T-SQL)
http://msdn.microsoft.com/ko-kr/library/ms190312.aspx
 
HOW TO: Use the DisallowAdHocAccess Setting to Control Access to Linked Servers
http://support.microsoft.com/kb/327489


작성자 : Lai Go / 작성일자 : 2008.06.15

Posted by Lai Go