Funções do servidor do Banco de Dados SQL do Azure para gerenciamento de permissões
Aplica-se a: Banco de Dados SQL do Azure
Este artigo descreve funções fixas no nível do servidor no banco de dados SQL do Azure.
Observação
As funções fixas no servidor deste artigo estão em versão prévia pública no Banco de Dados SQL do Azure. Essas funções no nível do servidor também fazem parte da versão para SQL Server 2022.
Visão geral
No banco de dados SQL do Azure, o servidor é um conceito lógico e as permissões não podem ser concedidas no nível de servidor. Para simplificar o gerenciamento de permissões, o Banco de Dados SQL do Azure fornece um conjunto de funções de nível de servidor fixas para ajudá-lo a gerenciar as permissões em um servidor lógico. Essas funções são entidades de segurança que agrupam logons.
Observação
O conceito de funções neste artigo é como grupos no sistema operacional Windows.
Essas funções especiais de nível de servidor fixo usam o prefixo ##MS_
e o sufixo ##
para distinguir de outras entidades de segurança regulares criadas pelo usuário.
Assim como o SQL Server local, as permissões do servidor são organizadas hierarquicamente. As permissões mantidas por essas funções de nível de servidor podem ser propagadas para permissões de banco de dados. Para que as permissões sejam efetivamente úteis no nível do banco de dados, um logon precisa ser um membro da função de nível de servidor ##MS_DatabaseConnector##
, que concede CONNECT
a todos os bancos de dados, ou ter uma conta de usuário em bancos de dados individuais. Isso também se aplica ao banco de dados virtual master
.
Por exemplo, a função ##MS_ServerStateReader##
de nível de servidor mantém a permissão VIEW SERVER STATE
. Se um logon que é membro dessa função tiver uma conta de usuário nos bancos de dados master
e WideWorldImporters
, esse usuário tem a permissão VIEW DATABASE STATE
nesses dois bancos de dados.
Observação
Qualquer permissão pode ser negada nos bancos de dados de usuário, substituindo a concessão em todo o servidor por meio da associação de função. No entanto, no mestre do banco de dados do sistema, as permissões não podem ser concedidas ou negadas.
Atualmente, o Banco de Dados SQL do Azure fornece sete funções de servidor fixas. As permissões concedidas às funções de servidor fixas não podem ser alteradas e essas funções não podem ter outras funções fixas como membros. Você pode adicionar logons no nível do servidor como membros a funções de nível de servidor.
Importante
Cada membro de uma função de servidor fixa pode adicionar outros logons a essa mesma função.
Para obter mais informações sobre logons e usuários do Banco de Dados SQL do Azure, consulte Autorizar acesso ao Banco de Dados SQL, à Instância Gerenciada de SQL e ao Azure Synapse Analytics.
Funções fixas no servidor
A tabela a seguir mostra as funções fixas de nível de servidor e seus recursos.
Função fixa de nível de servidor | Descrição |
---|---|
##MS_DatabaseConnector## |
Os membros da função de servidor fixa ##MS_DatabaseConnector## podem se conectar a qualquer banco de dados sem exigir uma conta de usuário no banco de dados para se conectar.Para negar a permissão CONNECT a um banco de dados específico, os usuários podem criar uma conta de usuário correspondente para esse logon no banco de dados e DENY a permissão CONNECT ao usuário do banco de dados. Essa permissão DENY anula a permissão GRANT CONNECT proveniente dessa função. |
##MS_DatabaseManager## |
Os membros da função de servidor fixa ##MS_DatabaseManager## podem criar e excluir bancos de dados. Um membro da função ##MS_DatabaseManager## que cria um banco de dados se torna o proprietário desse banco de dados, o que permite ao usuário se conectar ao banco de dados como o usuário dbo . O usuário dbo tem todas as permissões de banco de dados no banco de dados. Os membros da função ##MS_DatabaseManager## não têm necessariamente permissão para acessar bancos de dados que eles não possuem. Você deve usar essa função de servidor na função de nível de banco de dados dbmanager que existe no master . |
##MS_DefinitionReader## |
Os membros da função de servidor fixa ##MS_DefinitionReader## podem ler todas as exibições do catálogo cobertas por VIEW ANY DEFINITION , respectivamente VIEW DEFINITION em qualquer banco de dados no qual o membro dessa função tenha uma conta de usuário. |
##MS_LoginManager## |
Os membros da função de servidor fixa ##MS_LoginManager## podem criar e excluir logons. Você deve usar essa função de servidor na função de nível de banco de dados loginmanager que existe no master . |
##MS_SecurityDefinitionReader## |
Os membros da função de servidor fixa ##MS_SecurityDefinitionReader## podem ler todas as exibições do catálogo cobertas por VIEW ANY SECURITY DEFINITION e têm, respectivamente, a permissão VIEW SECURITY DEFINITION em qualquer banco de dados no qual o membro dessa função tenha uma conta de usuário. Esse é um pequeno subconjunto daquilo a que a função de servidor ##MS_DefinitionReader## tem acesso. |
##MS_ServerStateManager## |
Os membros da função de servidor fixa ##MS_ServerStateManager## têm as mesmas permissões que a função ##MS_ServerStateReader## . Além disso, possui a permissão ALTER SERVER STATE , que permite o acesso a diversas operações de gerenciamento, tais como: DBCC FREEPROCCACHE , DBCC FREESYSTEMCACHE ('ALL') , DBCC SQLPERF() ; |
##MS_ServerStateReader## |
Os membros da função de servidor fixa ##MS_ServerStateReader## podem ler todas as DMVs (exibições de gerenciamento dinâmico) e funções cobertas por VIEW SERVER STATE , respectivamente VIEW DATABASE STATE em qualquer banco de dados no qual o membro dessa função tenha uma conta de usuário. |
Permissões de funções de servidor fixas
Cada função fixa no servidor tem certas permissões atribuídas. A tabela a seguir mostra as permissões atribuídas às funções de nível de servidor. Ela também mostra as permissões no nível do banco de dados que são herdadas desde que o usuário possa se conectar a bancos de dados individuais.
Função fixa de nível de servidor | Permissões no nível de servidor | Permissões no nível do banco de dados (se existir um usuário de banco de dados correspondente ao logon) |
---|---|---|
##MS_DatabaseConnector## |
CONNECT ANY DATABASE |
CONNECT |
##MS_DatabaseManager## |
CREATE ANY DATABASE , ALTER ANY DATABASE |
ALTER |
##MS_DefinitionReader## |
VIEW ANY DATABASE , VIEW ANY DEFINITION , VIEW ANY SECURITY DEFINITION |
VIEW DEFINITION , VIEW SECURITY DEFINITION |
##MS_LoginManager## |
CREATE LOGIN , ALTER ANY LOGIN |
N/D |
##MS_SecurityDefinitionReader## |
VIEW ANY SECURITY DEFINITION |
VIEW SECURITY DEFINITION |
##MS_ServerStateManager## |
ALTER SERVER STATE , VIEW SERVER STATE , VIEW SERVER PERFORMANCE STATE , VIEW SERVER SECURITY STATE |
VIEW DATABASE STATE , VIEW DATABASE PERFORMANCE STATE , VIEW DATABASE SECURITY STATE |
##MS_ServerStateReader## |
VIEW SERVER STATE , VIEW SERVER PERFORMANCE STATE , VIEW SERVER SECURITY STATE |
VIEW DATABASE STATE , VIEW DATABASE PERFORMANCE STATE , VIEW DATABASE SECURITY STATE |
Permissões
Somente a conta do administrador do servidor ou a conta do administrador do Microsoft Entra (que pode ser um grupo do Microsoft Entra) pode adicionar ou remover outros logons de ou para funções de servidor. Isso é específico para o Banco de Dados SQL do Azure.
Observação
O Microsoft Entra ID era anteriormente conhecido como Azure Active Directory (Azure AD).
Trabalhar com funções de nível de servidor
A tabela a seguir explica as exibições do sistema e funções que você pode usar para trabalhar com funções de nível de servidor no Banco de Dados SQL do Azure.
Recurso | Tipo | Descrição |
---|---|---|
IS_SRVROLEMEMBER | Metadados | Indica se um logon do SQL é membro da função de nível de servidor especificada. |
sys.server_role_members | Metadados | Retorna uma linha para cada membro de cada função de nível de servidor. |
sys.sql_logins | Metadados | Retorna uma linha para cada logon de SQL. |
ALTER SERVER ROLE | Comando | Altera a associação de uma função de servidor. |
Exemplos
Os exemplos nesta seção mostram como trabalhar com funções de nível de servidor no Banco de Dados SQL do Azure.
R. Adicione um logon do SQL a uma função de nível de servidor
O exemplo a seguir adiciona o logon do SQL no Jiao
à função de nível de servidor ##MS_ServerStateReader##
. Essa instrução deve ser executada no banco de dados master
virtual.
ALTER SERVER ROLE ##MS_ServerStateReader##
ADD MEMBER Jiao;
GO
B. Liste todas as entidades de segurança (Autenticação SQL) que são membros de uma função de nível de servidor
A instrução a seguir retorna todos os membros de qualquer função de nível de servidor fixa usando as exibições do catálogo sys.server_role_members
e sys.sql_logins
. Essa instrução deve ser executada no banco de dados master
virtual.
SELECT sql_logins.principal_id AS MemberPrincipalID,
sql_logins.name AS MemberPrincipalName,
roles.principal_id AS RolePrincipalID,
roles.name AS RolePrincipalName
FROM sys.server_role_members AS server_role_members
INNER JOIN sys.server_principals AS roles
ON server_role_members.role_principal_id = roles.principal_id
INNER JOIN sys.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id;
GO
C. Exemplo completo: adicione um logon a uma função de nível de servidor, recupere metadados para associação de função e permissões e execute uma consulta de teste
Parte 1: preparando a associação de função e a conta de usuário
Execute este comando no banco de dados master
virtual.
ALTER SERVER ROLE ##MS_ServerStateReader## ADD MEMBER Jiao;
-- check membership in metadata:
SELECT IS_SRVROLEMEMBER('##MS_ServerStateReader##', 'Jiao');
--> 1 = Yes
SELECT sql_logins.principal_id AS MemberPrincipalID,
sql_logins.name AS MemberPrincipalName,
roles.principal_id AS RolePrincipalID,
roles.name AS RolePrincipalName
FROM sys.server_role_members AS server_role_members
INNER JOIN sys.server_principals AS roles
ON server_role_members.role_principal_id = roles.principal_id
INNER JOIN sys.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id;
GO
Veja a seguir o conjunto de resultados.
MemberPrincipalID MemberPrincipalName RolePrincipalID RolePrincipalName
------------- ------------- ------------------ -----------
6 Jiao 11 ##MS_ServerStateReader##
Execute este comando de um banco de dados de usuário.
-- Create a database-User for 'Jiao'
CREATE USER Jiao
FROM LOGIN Jiao;
GO
Parte 2: testando a associação de função
Faça logon como logon Jiao
e se conecte ao banco de dados do usuário usado no exemplo.
-- retrieve server-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'Server');
-- check server-role membership for `##MS_ServerStateReader##` of currently logged on User
SELECT USER_NAME(), IS_SRVROLEMEMBER('##MS_ServerStateReader##');
--> 1 = Yes
-- Does the currently logged in User have the `VIEW DATABASE STATE`-permission?
SELECT HAS_PERMS_BY_NAME(NULL, 'DATABASE', 'VIEW DATABASE STATE');
--> 1 = Yes
-- retrieve database-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE');
GO
-- example query:
SELECT * FROM sys.dm_exec_query_stats;
--> will return data since this user has the necessary permission
D. Verificar funções no nível de servidor para logons do Microsoft Entra
Execute este comando no banco de dados master
virtual para ver todos os logons do Microsoft Entra que fazem parte das funções do nível de servidor no banco de dados SQL. Para obter mais informações sobre os logons de servidor do Microsoft Entra, confira Entidades do servidor do Microsoft Entra.
SELECT member.principal_id AS MemberPrincipalID,
member.name AS MemberPrincipalName,
roles.principal_id AS RolePrincipalID,
roles.name AS RolePrincipalName
FROM sys.server_role_members AS server_role_members
INNER JOIN sys.server_principals AS roles
ON server_role_members.role_principal_id = roles.principal_id
INNER JOIN sys.server_principals AS member
ON server_role_members.member_principal_id = member.principal_id
LEFT JOIN sys.sql_logins AS sql_logins
ON server_role_members.member_principal_id = sql_logins.principal_id
WHERE member.principal_id NOT IN (
-- prevent SQL Logins from interfering with resultset
SELECT principal_id
FROM sys.sql_logins AS sql_logins
WHERE member.principal_id = sql_logins.principal_id
);
E. Verifique as funções de banco de dados master
virtual para logons específicos
Execute este comando no banco de dados master
virtual para verificar se há funções bob
ou altere o valor para corresponder à sua entidade de segurança.
SELECT DR1.name AS DbRoleName,
ISNULL(DR2.name, 'No members') AS DbUserName
FROM sys.database_role_members AS DbRMem
RIGHT JOIN sys.database_principals AS DR1
ON DbRMem.role_principal_id = DR1.principal_id
LEFT JOIN sys.database_principals AS DR2
ON DbRMem.member_principal_id = DR2.principal_id
WHERE DR1.type = 'R'
AND DR2.name LIKE 'bob%';
Limitações de funções de nível de servidor
As atribuições de função podem levar até 5 minutos para entrarem em vigor. Além disso, para sessões existentes, as alterações nas atribuições de função de servidor não entram em vigor até que a conexão seja fechada e reaberta. Isso ocorre devido à arquitetura distribuída entre o banco de dados
master
e os outros bancos no mesmo servidor lógico.- Solução parcial: para reduzir o período de espera e garantir que as atribuições de função do servidor estejam em dia em um banco de dados, um administrador do servidor ou um administrador do Microsoft Entra pode executar
DBCC FLUSHAUTHCACHE
nos bancos de dados de usuário nos quais o logon tem acesso. Os usuários conectados no momento ainda precisam se reconectar após executarDBCC FLUSHAUTHCACHE
para que as alterações de associação entrem em vigor.
- Solução parcial: para reduzir o período de espera e garantir que as atribuições de função do servidor estejam em dia em um banco de dados, um administrador do servidor ou um administrador do Microsoft Entra pode executar
IS_SRVROLEMEMBER()
não tem suporte no banco de dadosmaster
.