2017-05-17 17 views
0

SQL Manager Studio에서 다른 SQL 서버에 연결된 서버를 만들었습니다. 내가 만든 연결된 서버의 이름은 "linkedserver"입니다. 연결된 서버는 Microsoft OLE DB 공급자를 사용합니다. 그러나 아래 설명 된 문제는 다른 공급자에게도 발생합니다.직접 연결된 서버 쿼리 openquery를 통한 VS 쿼리

원격 SQL 서버에는 스키마 [스키마]에 [db] 데이터베이스와 [table] 테이블이 있습니다. [table]에는 [column]과 [column2]라는 두 개의 열이 있습니다.

[column]에 대해서만 읽기 권한 만 있고 [column2]에는없는 SQL 사용자 'user'가 원격 SQL 서버에 있습니다. 문제는 아래 예제와 같이 데이터를 쿼리하려고하면 [column2]가 쿼리에 나타나지 않지만 [column2]에서 액세스 권한이 없다는 오류가 발생합니다. 내 주위에 대신 열기 쿼리를 만드는 것입니다 있지만이 편리하지 않습니다.

-- Fetch one column via the linked server - DOES NOT WORK 
SELECT TOP 1 [column] 
FROM [linkedserver].[db].[schema].[table] 

첫 번째 실패 쿼리의 오류 메시지는 다음과 같습니다

Msg 2557, Level 16, State 7, Procedure sp_table_statistics2_rowset, Line 105 
User 'user' does not have permission to run DBCC SHOW_STATISTICS for object '[db].[schema].[table]'. 
Msg 230, Level 14, State 1, Procedure sp_table_statistics2_rowset, Line 105 
The SELECT permission was denied on the column 'column2' of the object 'table', database 'db', schema 'schema'. 

OPENQUERY와 해결 방법은 다음과 같습니다

-- Fetch one column via the linked server through an openquery - WORKS 
SELECT * 
FROM OpenQuery (linkedserver 
'SELECT TOP 1 [column] 
FROM [db].[schema].[table]') 

당신은 이것을 극복하는 방법을 알고, 또는 왜이 이루어집니다 마십시오 ? 내 가정은 첫 번째 쿼리가 [테이블]의 모든 열을 가져오고 SQL Manager Studio에서 필터를 적용하려고한다는 것입니다. 내가 옳은가? 어떻게 든이 문제를 극복 할 수 있습니까?

답변

1

연결된 서버에서 쿼리를 실행하면 sp_table_statistics2_rowset이 연결된 서버에서 호출됩니다. 당신은 당신이 코드를 찾을 수 있습니다 코드 커서 (라인 105)을 볼 수

exec sp_helptext 'sp_table_statistics2_rowset' 

을 실행할 수 있습니다 :이 작업을 실행하기위한

dbcc show_statistics(@qtbl, @statname) with stat_header join density_vector 

을 그래서 권한이 있어야합니다 연결된 서버에서 사용자 SP dbcc show_statistics를 실행하려면이 명령은 다른 버전의 SQL Server에서 동일하지 않습니다. SQL Server 2012 SP1 이전에는 사용자가 테이블을 소유해야하거나 사용자가 sysadmin 고정 서버 역할, db_owner 고정 데이터베이스 역할 또는 db_ddladmin 고정 데이터베이스 역할의 구성원이어야합니다. (사용자가 연결된 서버의 db_owner가 아닐 때) 이전 공급자가이 오류를 자동으로 처리하고 쿼리를 통계를 사용하지 않고 최적화했습니다. SQL 서버 2012 SP1이 동작을 변경, 다음과 같이 변경되었습니다 필요한 권한 :

SQL 서버 2012 SP1이 권한 제한을 수정하고이 명령을 사용하려면 SELECT 권한이 사용자를 할 수 있습니다. 명령을 실행하려면 SELECT 사용 권한이 이되어야합니다. 모든 사용자는 모든 열에 대한 사용 권한이 있어야합니다. 통계 개체 필터 조건의 모든 열에 대한 사용 권한이 있어야합니다 (있는 경우). 테이블에 행 수준 보안 정책을 사용할 수 없습니다.

서버 버전이> = 2012 SP1이고 사용자가 일부 열에 대한 권한이 없으므로 요구 사항을 통과하지 못했다고 생각됩니다. 사례가 제대로 작동하는 SQL Server 2008 R2가 있으므로 문제를 재현 할 수 없습니다. 따라서 이전 db 공급자를 사용하고, SQLNCLI10을 사용하여 다른 연결된 서버를 만들고 문제가 없는지 테스트 할 수 있습니다. dbcc 사용 권한을 확인하는 링크 : https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-show-statistics-transact-sql

이 문서에서는 TF9485를 사용하여이 동작을 끌 수는 있지만, dbcc 실행에 필요한 권한에 영향을 주는지 또는 네이티브에 영향을 주는지는 알 수 없습니다 클라이언트 행동도

+0

답장을 보내 주셔서 감사합니다. 속성을 볼 때 원격 서버 버전은 "11.0.6567.0"인 것처럼 보입니다. 아쉽게도 연결된 서버를 만든 SQL 서버에 SQLNCLI10 공급자를 설치할 권한이 없습니다. SQLNCLI11 제공자 만 설치됩니다. 당신의 솔루션은 유망한 것으로 들리지만, 나는 그것을 시도 할 수 있으면 좋겠다. – aragorn

+0

SQL Server 2012 SP3의 테이블에서 단 하나의 열에 대한 권한이있는 사용자와 동일한 상황을 만들면서 오류를 재현하려고 시도했습니다. 2014에서 링크를 만들고 그 자체에서 루프백이 가능하지 않았습니다. 해당 사용자가 대상 2012에서 해당 테이블에 대해 직접 sp_table_statistics2_rowset을 실행해도 오류가 발생하더라도 동일한 오류를 링크 된 서버에서 직접 선택하거나 열기 쿼리를 사용하지 마십시오. 그래서 그것이 문제가 서버 정확한 버전인지 궁금 해서요 그리고 나는 그것을 검색하고 연결 항목을 찾으십시오 : – sepupic

+0

https://connect.microsoft.com/SQLServer/feedback/details/796349/distributed-query-fails-on-tables 부분 액세스와 함께 – sepupic