Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Base de dados SQL no Microsoft Fabric
Avalia a permissão efetiva do utilizador atual sobre um seguro. Uma função relacionada é fn_my_permissions.
Transact-SQL convenções de sintaxe
Sintaxe
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )
Arguments
Seguro
É o nome do seguro. Se o securável for o próprio servidor, este valor deve ser definido como NULL.
Securable é uma expressão escalar do tipo sysname. Não existe padrão.
securable_class
É o nome da classe de segurável contra a qual a permissão é testada.
securable_class é uma expressão escalar do tipo nvarchar(60).
No Azure SQL Database, o argumento securable_class deve ser definido para um dos seguintes: DATABASE,OBJECT,ROLE, SCHEMA ou USER.
Permissão
Uma expressão escalar não nula do tipo sysname que representa o nome de permissão a verificar. Não existe padrão. O nome de permissão QUALQUER é uma carta coringa.
Sub-Seguro
Uma expressão escalar opcional do tipo sysname que representa o nome da subentidade securável contra a qual a permissão é testada. O padrão é NULL.
Observação
Os sub-seguráveis não podem usar parênteses na forma '[nome do subtítulo]'. Usa 'nome do sub' em vez disso.
Sub-securable_class
Uma expressão escalar opcional do tipo nvarchar(60) que representa a classe de subentidade segura contra a qual a permissão é testada. O padrão é NULL.
No Azure SQL Database, o argumento sub-securable_class é válido apenas se o argumento securable_class estiver definido como OBJECT. Se o argumento securable_class estiver definido como OBJECT, o argumento sub-securable_class deve ser definido como COLUMN.
Tipos de devolução
int
Retorna NULL quando a consulta falha.
Observações
Esta função incorporada testa se o principal atual tem uma permissão efetiva particular sobre um seguro especificado. HAS_PERMS_BY_NAME devolve 1 quando o utilizador tem permissão efetiva sobre o securable, 0 quando o utilizador não tem permissão efetiva sobre o securable, e NULL quando a classe ou permissão do securable não é válida. Uma permissão eficaz é qualquer uma das seguintes:
Uma permissão concedida diretamente ao diretor, e não negada.
Uma permissão implícita por uma autorização de nível superior detida pelo diretor e não negada.
Uma permissão concedida a um papel ou grupo do qual o principal é membro, e não negada.
Uma permissão detida por um papel ou grupo do qual o principal é membro, e não negada.
A avaliação de permissões é sempre realizada no contexto de segurança do interlocutor. Para determinar se outro utilizador tem uma permissão efetiva, o chamador deve ter permissão de IMITAÇÃO sobre esse utilizador.
Para entidades ao nível do esquema, são aceites nomes não nulos de uma, duas ou três partes. Para entidades ao nível da base de dados, é aceite um nome de uma parte, com valor nulo que significa "base de dados atual". Para o próprio servidor, é necessário um valor nulo (significando "servidor atual"). Esta função não pode verificar permissões num servidor ligado ou num utilizador Windows para o qual não tenha sido criado um principal a nível de servidor.
A consulta seguinte devolverá uma lista de classes securáveis incorporadas:
SELECT class_desc FROM sys.fn_builtin_permissions(default);
São usadas as seguintes colações:
Classificação atual da base de dados: Seguranças ao nível da base de dados que incluem seguranças não contidos por um esquema; garantias com âmbito de esquema de uma ou duas partes; Base de dados alvo quando se utiliza um nome em três partes.
Coletão de bases de dados mestres: Seguranças ao nível do servidor.
'QUALQUER' não é suportado para verificações ao nível das colunas. Deve especificar a permissão apropriada.
Examples
A. Tenho a permissão VIEW STATE DO SERVIDOR ao nível do servidor?
Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
B. Posso FAZER-ME PASSAR por P principal do servidor?
Aplica-se a: SQL Server 2008 (10.0.x) e versões posteriores
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');
C. Tenho alguma permissão na base de dados atual?
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
D. O principal PD da base de dados tem alguma permissão na base de dados atual?
Assuma que o chamador tem permissão de IMPERSONAR por princípio 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 seguinte requer ALTER permissão de entrada S e CREATE PROCEDURE permissão na base de dados, e de forma semelhante 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 que tabelas tenho 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 permissão de INSERIR na tabela Salesperson no AdventureWorks2022?
O exemplo seguinte assume AdventureWorks2025 o contexto atual da minha base de dados e usa um nome em duas partes.
SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');
O exemplo seguinte não faz suposições sobre o contexto atual da minha base de dados e usa um nome em três partes.
SELECT HAS_PERMS_BY_NAME('AdventureWorks2022.Sales.SalesPerson',
'OBJECT', 'INSERT');
H. Em que colunas da tabela T tenho 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');
Ver também
Permissões (Motor de Base de Dados)
Securables
Hierarquia de permissões (Mecanismo de Banco de Dados)
sys.fn_builtin_permissions (Transact-SQL)
Vistas do catálogo de segurança (Transact-SQL)