Estou tentando entender melhor como o SQL Server usa estatísticas em SQL Servers remotos (por exemplo, um servidor vinculado). Entendo que o usuário precisa dos direitos db_owner/db_ddladmin para poder usar as estatísticas na caixa remota. A princípio, isso parece muito direto com base no texto abaixo da Microsoft.
Para criar os melhores planos de consulta ao usar uma tabela em um servidor vinculado, o processador de consulta deve ter estatísticas de distribuição de dados do servidor vinculado. Os usuários que têm permissões limitadas em qualquer coluna da tabela podem não ter permissões suficientes para obter todas as estatísticas úteis e podem receber um plano de consulta menos eficiente e ter um desempenho insatisfatório. Se o servidor vinculado for uma instância do SQL Server, para obter todas as estatísticas disponíveis, o usuário deve possuir a tabela ou ser membro da função de servidor fixa sysadmin, da função de banco de dados fixa db_owner ou da função de banco de dados fixa db_ddladmin no servidor vinculado .
A parte que está me confundindo é a palavra "Usuário". Usamos um contexto de segurança padrão para todas as conexões, em vez do login do usuário. Este login/usuário possui as permissões necessárias conforme definido acima sobre os bancos de dados em questão. Além disso, não usamos representação.
Tentei executar consultas e capturar os rastreamentos em ambas as extremidades usando contas com e sem permissões elevadas no servidor de remoção. Parece-me que o servidor remoto não está coletando estatísticas, a menos que o usuário real (o cara no teclado) tenha os direitos elevados. Acredito que isso seja verdade porque só estou vendo chamadas para sys.sp_table_statistics2_rowset quando o usuário tem os direitos necessários.
Eu realmente espero que isso faça sentido.
Alguém tem uma compreensão de como isso realmente funciona no SQL 2008 R2 e abaixo?
O que eu faço é este 'truque':
Dê a leitura a este 'linkuser', tudo o que for necessário e
ddl_admin
privilégios, e execute o seguinte script para garantir que nenhum dosddl_admin
privilégios possa realmente ser usado.Mas, por ser tecnicamente membro do
ddl_admin
usuário, agora pode ver as estatísticas no banco de dados remoto! (nota: a partir do SQL2012SP1 não há necessidade deste hack, as estatísticas estão visíveis como deveriam estar)Bem, realmente depende de como você configura o contexto de segurança do servidor vinculado, certo? Se o cara sentado ao teclado não tiver nenhum direito no servidor remoto, então como a conexão é feita: será cortada, usará o contexto de segurança atual ou representará um login específico no remoto servidor? Acho que é aqui que você precisa focar sua atenção. Em nosso ambiente PROD, configuramos um usuário que possui privilégios de administrador de leitura, gravação e ddl e todas as conexões são feitas usando o contexto de segurança desse login/senha remoto. Eu espero que isso ajude.