SQL Server: Funções definidas pelo usuário

Com o advento do SQL Server 2012, vem a capacidade de criar funções de servidor definidas pelo usuário, um grande passo para o gerenciamento de SQL.

Denny Cherry

Embora, por décadas, tenha sido possível criar funções de banco de dados definidas pelo usuário para facilitar o processo de conceder permissões no nível de banco de dados, no nível de instância sempre houve apenas nove funções de servidor fixas (oito, caso você esteja usando alguma versão mais antiga que o SQL Server 2000; a função de administrador de operações em massa foi introduzida com o SQL Server 2005). Agora, com o SQL Server 2012, finalmente poderemos criar funções de servidor definidas pelo usuário.

O fato de não ser possível fazer isso por muitos anos criou problemas no gerenciamento do SQL. O que você faz quando precisa conceder direitos a vários usuários ou grupos no nível de instância e deseja manter esses direitos sincronizados? Vamos supor que você quisesse conceder o direito Exibir Estado do Sistema a um grande número de usuários para que eles pudessem exibir informações de bloqueio nos servidores de desenvolvimento. Você teria que fazer a concessão a um usuário de cada vez ou a um grupo de domínio por vez que precisasse desse direito.

Se todos os logons forem baseados nos logons de domínio, a única solução alternativa que poderia ser usada seria a criação de um grupo de domínio para todos os usuários que precisassem desse direito (possivelmente, seria preciso um grupo de domínio para cada servidor caso os usuários não obtivessem o direito em todos os servidores). Você poderia colocar os usuários nesse grupo, criar um logon mapeado para o grupo de domínio e então conceder a esse grupo o direito Exibir Estado do Servidor no servidor. No entanto, isso precisaria ser feito com muito cuidado. Do contrário, você poderia conceder direitos de logon a usuários que antes não os tinham. Poderia até mesmo conceder direitos a usuários que não deseja.

Função com o T/SQL

É possível criar uma função de servidor definida pelo usuário de várias maneiras, por exemplo, com o T/SQL, a interface de usuário do SQL Server Management Studio e o Windows PowerShell. Se eu fosse criar uma função de servidor definida pelo usuário usando o T/SQL, usaria três comandos diferentes. Primeiro, a instrução Criar Função de Servidor criaria a função de servidor definida pelo usuário; segundo, a Função Alterar Servidor adicionaria um usuário à função de servidor; e, por fim, a instrução Conceder concederia os direitos necessários à função.

Essas três instruções são mostradas no código a seguir, que descreve a criação de uma função de servidor definida pelo usuário chamada "ViewServerState". Isso especifica um usuário adicionado à função chamada "SomeFakeLogin" e a função recebe o direito Exibir Estado do Servidor. Para conceder esse direito a outros usuários, basta adicioná-los à função de servidor fixa usando a linha Alterar Função de Servidor:

USE [master] GO CREATE SERVER ROLE [ViewServerState] AUTHORIZATION [sa] GO ALTER SERVER ROLE [ViewServerState] ADD MEMBER [SomeFakeLogin] GO GRANT VIEW SERVER STATE TO [ViewServerState] GO

Você remove um usuário de uma função de servidor definida pelo usuário com Alterar Função de Servidor. Em vez de usar a sintaxe Adicionar Membro, você usa Cancelar Membro:

ALTER SERVER ROLE [ViewServerState] DROP MEMBER [SomeFakeLogin] GO

Quando se trata do tempo para implantação de uma ou mais funções de servidor definidas pelo usuário em várias instâncias do SQL Server, há algumas opções diferentes. Provavelmente, você não deseja se conectar a um servidor por vez para criar as funções de servidor definidas pelo usuário. Uma opção é usar o recurso SQL Server Management Studio. Isso permite executar scripts do T/SQL em várias instâncias.

Também é possível usar os componentes do SQL Server do Windows PowerShell para implantar novas funções de servidor definidas pelo usuário em todas as instâncias do SQL Server em sua organização. (Como há várias maneiras de usar o Windows PowerShell para implantar esses scripts, esse processo está fora do escopo deste artigo.)

SQL Server Management Studio

É possível executar a mesma ação facilmente com a interface de usuário do SQL Server Management Studio. Para criar uma função de servidor definida pelo usuário, conecte-se a instância dentro do Pesquisador de Objetos. Navegue para Nome_da_instância | Segurança | Funções de Servidor no pesquisador de objetos. Clique com o botão direito do mouse em Funções de Servidor e selecione Nova Função de Servidor no menu de contexto. Quando a janela Nova Função de Servidor for aberta, especifique o Nome da função de servidor e o Proprietário; em seguida, selecione os Protegíveis, bem como as Permissões que deseja que os membros da função tenham (veja a Figura 1).

Figura 1 Especifique os direitos que deseja que um usuário específico tenha.

Após preencher os campos na página Geral, selecione a página Membros (veja a Figura 2) e especifique os Logons do SQL Server que se tornarão membros dessa função de servidor definida pelo usuário.

Figura 2 A seleção de membros especificará quais usuários terão acesso à essa função de servidor.

Após selecionar os Membros da Função, selecione a página Associações. Isso especificará as funções de servidor das quais essa função de servidor definida pelo usuário será um membro. Se você especificar uma função de servidor nessa tela, os usuários na função de servidor definida pelo usuário também terão os direitos concedidos por essa função de servidor.

Se você fosse criar uma função definida pelo usuário e torná-la um membro da função de servidor fixa serveradmin (veja a Figura 3), todos os membros da função de servidor definida pelo usuário não seriam efetivamente membros da função de servidor fixa serveradmin. Assim como no aninhamento de grupos de domínio ou funções de banco de dados, você precisa ter muito cuidado ao aninhar funções para não conceder aos usuários direitos que eles não devem ter de grupos mais avançados.

Figura 3 Você pode aplicar sua função definida pelo usuário a outras funções de servidor.

Para aninhar funções de servidor usando o T/SQL, você ainda terá que usar a instrução Alterar Função de Servidor com a sintaxe Adicionar Membro. Por exemplo, para tornar a função de servidor definida pelo usuário ViewServerState um membro da função de servidor fixa setupadmin, é preciso alterar a função de servidor fixa setupadmin. Em seguida, você adiciona a função de servidor definida pelo usuário ViewServerState como um membro:

ALTER SERVER ROLE [setupadmin] ADD MEMBER [ViewServerState] GO

As funções de servidor definidas pelo usuário têm muitas utilidades. Existem dezenas de direitos no nível de instância que podem ser concedidos a uma função de servidor definida pelo usuário para simplificar o gerenciamento desses direitos. Também é possível criar uma função de DBA principiante que concede alguns direitos, mas não os direitos completos de administrador de sistemas. É possível criar um grupo AlwaysOnAdmin, que permita direitos de failover de um banco de dados AlwaysOn (que deve ser feito de dentro do SQL Server) sem ter direitos completos de administrador de sistemas.

Existem vários casos de uso para funções de servidor definidas pelo usuário. Eles facilitarão enormemente as cargas de trabalho da administração. Eles também ajudarão a aumentar a segurança das instâncias do SQL Server, pois essas novas funções de servidor reduzirão as instâncias que concedem acidentalmente direitos inadequados.

DennyCherry

Denny Cherry tem mais de uma década de experiência no gerenciamento do SQL Server. Sua área de especialização inclui arquitetura do sistema, ajuste de desempenho, replicação e solução de problemas. Ele possui vários certificados relacionados ao SQL Server, incluindo o Microsoft Certified Master para SQL Server 2008. Ele foi um MVP do Microsoft SQL Server por vários anos e escreveu diversos livros e artigos técnicos sobre o gerenciamento do SQL Server e como o SQL Server se integra a várias outras tecnologias.

Conteúdo relacionado