Funções de 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 de nível de servidor no Banco de Dados SQL do Azure.

Nota

As funções fixas de nível de servidor neste artigo estão em visualização pública para o Banco de Dados SQL do Azure. Essas funções no nível de servidor também fazem parte da versão do SQL Server 2022.

Descriçã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 do servidor. Para simplificar o gerenciamento de permissões, o Banco de Dados SQL do Azure fornece um conjunto de funções fixas no nível do servidor para ajudá-lo a gerenciar as permissões em um servidor lógico. As funções são entidades de segurança que agrupam logins.

Nota

O conceito de funções neste artigo é como grupos no sistema operacional Windows.

Essas funções fixas especiais no nível do servidor usam o prefixo ##MS_ e o sufixo ## para distinguir de outras entidades criadas pelo usuário regular.

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 se propagar 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 membro da função ##MS_DatabaseConnector##de nível de servidor, 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 deté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 e WideWorldImporters, esse usuário terá a permissão VIEW DATABASE STATE nesses dois bancos de dadosmaster.

Nota

Qualquer permissão pode ser negada em bancos de dados de usuários, na verdade, substituindo a concessão em todo o servidor por meio da associação de função. No entanto, no mestre de 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 às funções no nível do servidor.

Importante

Cada membro de uma função de servidor fixa pode adicionar outros logins a essa mesma função.

Para obter mais informações sobre logons e usuários do Banco de Dados SQL do Azure, consulte Autorizar o acesso ao banco de dados ao Banco de Dados SQL, à Instância Gerenciada do SQL e ao Azure Synapse Analytics.

Funções fixas no nível do servidor

A tabela a seguir mostra as funções fixas no nível do servidor e seus recursos.

Função fixa no nível do servidor Description
##MS_DatabaseConnector## Os membros da função de servidor fixa podem se conectar a qualquer banco de dados sem exigir uma conta de usuário no banco de ##MS_DatabaseConnector## dados para se conectar.

Para negar a permissão 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, em seguida, DENY a CONNECT CONNECT permissão para o usuário do banco de dados. Essa DENY permissão anula a GRANT CONNECT permissão proveniente dessa função.
##MS_DatabaseManager## Os membros da ##MS_DatabaseManager## função de servidor fixa podem criar e excluir bancos de dados. Um membro da função que cria um banco de dados, torna-se o proprietário desse banco de dados, o que permite que o usuário se conecte a esse banco de ##MS_DatabaseManager## dados como o dbo usuário. O dbo usuário tem todas as permissões de banco de dados no banco de dados. Os membros da função não têm necessariamente permissão para acessar bancos de ##MS_DatabaseManager## dados que não possuem. Você deve usar essa função de servidor sobre a função de nível de banco de dados dbmanager que existe no master.
##MS_DefinitionReader## Os membros da ##MS_DefinitionReader## função de servidor fixa podem ler todas as exibições de catálogo cobertas pelo 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 ##MS_LoginManager## função de servidor fixa podem criar e excluir logons. Você deve usar essa função de servidor sobre a função de nível de banco de dados loginmanager que existe no master.
##MS_SecurityDefinitionReader## Os membros da ##MS_SecurityDefinitionReader## função de servidor fixa podem ler todas as exibições de catálogo cobertas pelo VIEW ANY SECURITY DEFINITION, e respectivamente têm VIEW SECURITY DEFINITION permissão em qualquer banco de dados no qual o membro dessa função tenha uma conta de usuário. Este é um pequeno subconjunto do que a ##MS_DefinitionReader## função de servidor tem acesso.
##MS_ServerStateManager## Os membros da ##MS_ServerStateManager## função de servidor fixa têm as mesmas permissões que a ##MS_ServerStateReader## função. Além disso, detém a permissão, que permite o acesso a ALTER SERVER STATE várias operações de gestão, tais como: DBCC FREEPROCCACHE, , DBCC FREESYSTEMCACHE ('ALL'); DBCC SQLPERF()
##MS_ServerStateReader## Os membros da função de ##MS_ServerStateReader## servidor fixa podem ler todas as exibições de gerenciamento dinâmico (DMVs) e funções cobertas pelo 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 de nível de servidor tem determinadas permissões atribuídas a ela. A tabela a seguir mostra as permissões atribuídas às funções no nível do servidor. Ele também mostra as permissões no nível de banco de dados, que são herdadas desde que o usuário possa se conectar a bancos de dados individuais.

Função fixa no nível do servidor Permissões no nível do servidor Permissões no nível do banco de dados (se existir um usuário do 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 DEFINITIONVIEW ANY SECURITY DEFINITION VIEW DEFINITION, VIEW SECURITY DEFINITION
##MS_LoginManager## CREATE LOGIN, ALTER ANY LOGIN N/A
##MS_SecurityDefinitionReader## VIEW ANY SECURITY DEFINITION VIEW SECURITY DEFINITION
##MS_ServerStateManager## ALTER SERVER STATE, , , VIEW SERVER STATEVIEW SERVER PERFORMANCE STATEVIEW SERVER SECURITY STATE VIEW DATABASE STATE, , VIEW DATABASE PERFORMANCE STATEVIEW DATABASE SECURITY STATE
##MS_ServerStateReader## VIEW SERVER STATE, , VIEW SERVER PERFORMANCE STATEVIEW SERVER SECURITY STATE VIEW DATABASE STATE, , VIEW DATABASE PERFORMANCE STATEVIEW DATABASE SECURITY STATE

Permissões

Somente a conta de administrador do servidor ou a conta de 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 do Banco de Dados SQL do Azure.

Nota

Microsoft Entra ID é o novo nome para o Azure Ative Directory (Azure AD). Estamos atualizando a documentação neste momento.

Trabalhar com funções de nível de servidor

A tabela a seguir explica as exibições do sistema e as funções que você pode usar para trabalhar com funções de nível de servidor no Banco de Dados SQL do Azure.

Funcionalidade Type Description
IS_SRVROLEMEMBER Metadados Indica se um logon 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 SQL.
FUNÇÃO DE SERVIDOR ALTER 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.

A. Adicionar um logon SQL a uma função no nível de servidor

O exemplo a seguir adiciona o logon Jiao SQL à função ##MS_ServerStateReader##de nível de servidor. Esta instrução deve ser executada no banco de dados virtual master .

ALTER SERVER ROLE ##MS_ServerStateReader##
    ADD MEMBER Jiao;
GO

B. Listar todas as entidades (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 fixa de nível de servidor usando as sys.server_role_members exibições e sys.sql_logins de catálogo. Esta instrução deve ser executada no banco de dados virtual master .

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 no nível de servidor, recupere metadados para associação e permissões de função e execute uma consulta de teste

Parte 1: Preparando a associação de função e a conta de usuário

Execute este comando a partir do banco de dados virtual master .

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

Aqui está o conjunto de resultados.

MemberPrincipalID MemberPrincipalName RolePrincipalID RolePrincipalName
------------- ------------- ------------------ -----------
6         Jiao      11            ##MS_ServerStateReader##

Execute este comando a partir 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 à função

Faça login como login Jiao e conecte-se ao banco de dados de usuários 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 logins do Microsoft Entra

Execute este comando no banco de dados virtual master para ver todos os logons do Microsoft Entra que fazem parte de funções de nível de servidor no Banco de dados SQL. Para obter mais informações sobre logins de servidor do Microsoft Entra, consulte Entidades de 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 virtual master para logons específicos

Execute este comando no banco de dados virtual master para verificar se as funções bob têm ou altere o valor para corresponder ao seu principal.

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 das funções no nível do servidor

  • As atribuições de função podem levar até 5 minutos para entrar em vigor. Também 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 se deve à arquitetura distribuída entre o master banco de dados e outros bancos de dados no mesmo servidor lógico.

    • Solução parcial: para reduzir o período de espera e garantir que as atribuições de função de servidor estejam atualizadas em um banco de dados, um administrador de servidor ou um administrador do Microsoft Entra pode ser executado DBCC FLUSHAUTHCACHE nos bancos de dados de usuários aos quais o logon tem acesso. Os usuários conectados atualmente ainda precisam se reconectar após a execução DBCC FLUSHAUTHCACHE para que as alterações de associação entrem em vigor neles.
  • IS_SRVROLEMEMBER() não é suportado na master base de dados.