Como criar uma função de servidor somente leitura no SQL Server 2012?

15

Estou concedendo a permissão "Visualizar qualquer banco de dados" ao criar uma nova função de servidor, mas percebi que essa permissão permite apenas ao usuário exibir os bancos de dados do sistema.

Estou tentando criar uma função de servidor que seja somente leitura e possa ler qualquer banco de dados.

Existe uma maneira de criar uma função de servidor definida pelo usuário para ler os bancos de dados do usuário? Ou preciso fazer isso através do mapeamento de usuários por usuário?

joha
fonte

Respostas:

16

Postar isso como resposta apenas porque é muito longo para um comentário e porque será relevante para outros usuários em breve.

O SQL Server 2014 adiciona algumas novas permissões no nível do servidor que ajudarão exatamente nesse tipo de cenário - elas foram projetadas com a auditoria em mente, mas esse tipo de requisito parece se encaixar também nessa conta. Você pode simplesmente adicionar as duas permissões a seguir em um logon no nível do servidor:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

O primeiro, como parece, permite que o login se conecte a qualquer banco de dados. O bom disso é que ele permitirá isso mesmo para bancos de dados criados no futuro (desde que você não defina negação explícita, é assim que você pode proteger certos bancos de dados de usuários de logons com essa permissão). O último permite que o logon execute operações de leitura em qualquer banco de dados ao qual eles tenham acesso - para que possam a SELECTpartir de tabelas, visualizações, UDFs etc., mas não poderão executar nenhuma UPDATEoperação (não testei se essa permissão entende quando um procedimento armazenado executa DML). Eles funcionam muito bem em combinação, se você deseja conceder acesso de leitura totalmente aberto a todo o servidor ou, para ser mais refinado, pode conceder CONNECTprivilégios tradicionais a determinados bancos de dados, e o SELECT ALL USER SECURABLESdireito seráfunciona apenas para os bancos de dados aos quais o logon tem acesso explícito.

As alterações de segurança de 2014 estão documentadas aqui - bem, parcialmente; eles esqueceram a permissão no nível do banco de dados ALTER ANY DATABASE EVENT SESSION- embora isso não seja relevante aqui.

Aaron Bertrand
fonte
Obrigado por esta resposta estendida para os próximos servidores. Sendo que esta operação / verificação está no nível do servidor. Existem comentários sobre o nível de compatibilidade do banco de dados? Portanto, se o DB CL for 2012, o recurso 2014 ainda funcionará?
SnapJag
O nível de compatibilidade do @SnapJag não tem nenhuma influência sobre os recursos de segurança, é principalmente sobre como o T-SQL é analisado e como o otimizador gera planos de consulta.
Aaron Bertrand
@AaronBertrand Você sabe se existe uma permissão que podemos definir em funções no nível do servidor para permitir atualizações em qualquer banco de dados também? (sysadmin fixo função pode, com certeza, mas podemos fazê-lo para uma função de servidor definida pelo usuário?)
MaxiWheat
@MaxiWheat Não, não consigo pensar em nenhuma maneira trivial de fazer isso, desculpe.
Aaron Bertrand
FWIW, isso não funcionará no Banco de Dados SQL do Azure. CONCESSÃO CONECTE QUALQUER BASE DE DADOS AO [NameOfUserOrGroup] Classe 'servidor' protegível não suportada nesta versão do SQL Server.
Dzejms 20/02/19
8

Não há permissão 'ler qualquer banco de dados' no nível do servidor e as funções no nível do servidor não podem receber permissões no nível do banco de dados

Então, sim, você precisará mapear os usuários para os bancos de dados individualmente. Se você estiver usando o Active Directory, poderá criar um grupo do Windows, fazer logon nesse grupo no SQL Server e aplicar db_datareader em todos os bancos de dados desse grupo (você precisará criar usuários em cada banco de dados).

Simon Righarts
fonte