Compartilhar via


HAS_PERMS_BY_NAME (Transact-SQL)

Avalia a permissão efetiva do usuário atual em um protegível. Uma função relacionada é fn_my_permissions.

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

HAS_PERMS_BY_NAME ( securable , securable_class , permission  
    [ , sub-securable ] [ , sub-securable_class ] )

Argumentos

  • securable
    É o nome do protegível. Se o protegível for o próprio servidor, esse valor deverá ser definido como NULL. securable é uma expressão escalar do tipo sysname. Não há nenhum padrão.

  • securable_class
    É o nome da classe do protegível na qual a permissão é testada. securable_class é uma expressão escalar do tipo nvarchar(60).

  • permission
    Uma expressão escalar não nula do tipo sysname que representa o nome da permissão a ser verificada. Não há nenhum padrão. O nome da permissão ANY é um curinga.

  • sub-securable
    Uma expressão escalar opcional do tipo sysname que representa o nome da subentidade protegível na qual a permissão é testada. O padrão é NULL.

    ObservaçãoObservação

    Nas versões do SQL Server até SQL Server 2012, os subprotegíveis não podem usar colchetes no formato '[sub name]'. Em vez disso, use 'sub name'.

  • sub-securable_class
    Uma expressão escalar opcional do tipo nvarchar(60) que representa a classe da subentidade protegível na qual a permissão é testada. O padrão é NULL.

Tipos de retorno

int

Retorna NULL quando a consulta falha.

Comentários

Esta função interna testa se a entidade de segurança atual tem uma permissão efetiva específica em um protegível especificado. HAS_PERMS_BY_NAME retorna 1 quando o usuário tem permissão efetiva no protegível, 0 quando o usuário não tem nenhuma permissão efetiva no protegível e NULL quando a classe protegível ou permissão não é válida. Uma permissão efetiva é qualquer uma das permissões a seguir:

  • Uma permissão concedida diretamente à entidade de segurança, e não negada.

  • Uma permissão implicada por uma permissão de nível superior mantida pela entidade de segurança, e não negada.

  • Uma permissão concedida a uma função ou grupo do qual a entidade de segurança é membro, e não negada.

  • Uma permissão mantida por uma função ou grupo de qual a entidade de segurança é membro, e não negada.

A avaliação da permissão é sempre executada no contexto de segurança do chamador. Para determinar se algum outro usuário tem uma permissão efetiva, o chamador deve ter a permissão IMPERSONATE nesse usuário.

Para entidades em nível de esquema, nomes não nulos de uma, duas ou três partes são aceitos. Para entidades em nível de banco de dados, um nome de uma parte é aceito, com um valor nulo que significa “banco de dados atual”. Para o servidor propriamente dito, um valor nulo (que significa “servidor atual”) é obrigatório. Essa função não pode verificar permissões em um servidor vinculado ou em um usuário do Windows para o qual nenhuma entidade de segurança em nível de servidor tenha sido criada.

A consulta a seguir retornará uma lista de classes protegíveis internas:

   SELECT class_desc FROM sys.fn_builtin_permissions(default)

Os agrupamentos a seguir são usados:

  • Agrupamento do banco de dados atual: protegíveis em nível de banco de dados, incluindo protegíveis não contidos por um esquema, protegíveis com escopo no esquema de uma ou duas partes; banco de dados de destino quando um nome de três partes é usado.

  • Agrupamento do banco de dados master: protegíveis em nível de servidor.

  • Não há suporte para ‘ANY’ em verificações em nível de coluna. Você deve especificar a permissão apropriada.

Exemplos

A.Tenho a permissão VIEW SERVER STATE em nível de servidor?

SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');

B.Posso executar IMPERSONATE na entidade de segurança do servidor Ps?

SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');

C.Tenho alguma permissão no banco de dados atual?

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');

D.A entidade de segurança do banco de dados Pd tem alguma permissão no banco de dados atual?

Suponha que o chamador tenha a permissão IMPERSONATE na entidade de segurança Pd.

EXECUTE AS user = 'Pd'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
GO
REVERT;
GO

E.Posso criar procedimentos e tabelas no esquema S?

O exemplo a seguir requer a permissão ALTER em S e a permissão CREATE PROCEDURE no banco de dados; de modo similar para tabelas.

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE')
    & HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_procs,
    HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE TABLE') &
    HAS_PERMS_BY_NAME('S', 'SCHEMA', 'ALTER') AS _can_create_tables;

F.Em quais tabelas eu tenho a permissão SELECT?

SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name), 
    'OBJECT', 'SELECT') AS have_select, * FROM sys.tables

G.Tenho a permissão INSERT na tabela SalesPerson no AdventureWorks2012?

O exemplo a seguir supõe que AdventureWorks2012 é meu contexto de banco de dados atual e usa um nome de duas partes.

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');

O exemplo a seguir não faz nenhuma suposição sobre meu contexto de banco de dados atual e usa um nome de três partes.

SELECT HAS_PERMS_BY_NAME('AdventureWorks2012.Sales.SalesPerson', 
    'OBJECT', 'INSERT');

H.Em quais colunas da tabela T eu tenho a permissão SELECT?

SELECT name AS column_name, 
    HAS_PERMS_BY_NAME('T', 'OBJECT', 'SELECT', name, 'COLUMN') 
    AS can_select 
    FROM sys.columns AS c 
    WHERE c.object_id=object_id('T');

Consulte também

Referência

sys.fn_builtin_permissions (Transact-SQL)

Exibições do catálogo de segurança (Transact-SQL)

Conceitos

Permissões (Mecanismo de Banco de Dados)

Protegíveis

Hierarquia de permissões (Mecanismo de Banco de Dados)