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 executar DBCC FLUSHAUTHCACHE para que as alterações de associação entrem em vigor.
  • IS_SRVROLEMEMBER() não tem suporte no banco de dados master.