HAS_PERMS_BY_NAME (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Évalue l'autorisation effective de l'utilisateur actuel sur un élément sécurisable. Une fonction associée est fn_my_permissions.

Conventions de la syntaxe Transact-SQL

Syntaxe

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

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez la Documentation sur les versions antérieures.

Arguments

securable
Indique le nom de l'élément sécurisable. Si l'élément sécurisable est le serveur lui-même, cette valeur doit être définie avec NULL. securable est une expression scalaire de type sysname. Il n'y a pas de valeur par défaut.

securable_class
Nom de la classe de l'élément sécurisable sur lequel l'autorisation est testée. securable_class est une expression scalaire de type nvarchar(60).

Dans Azure SQL Database, l’argument securable_class doit avoir l’une des valeurs suivantes : DATABASE, OBJECT, ROLE, SCHEMA ou USER.

permission
Expression scalaire non-NULL de type sysname qui représente le nom de l’autorisation à vérifier. Il n'y a pas de valeur par défaut. Le nom d'autorisation ANY représente une autorisation générique.

sub-securable
Expression scalaire facultative de type sysname qui représente le nom de la sous-entité sécurisable sur laquelle l’autorisation est testée. La valeur par défaut est NULL.

Notes

Les éléments sécurisables sub ne peuvent pas utiliser de crochets sous la forme '[sub name]' . Utilisez 'sub name' à la place.

sub-securable_class
Expression scalaire facultative de type nvarchar(60) qui représente la classe de la sous-entité sécurisable sur laquelle l’autorisation est testée. La valeur par défaut est NULL.

Dans Azure SQL Database, l’argument sub-securable_class est valide uniquement si l’argument securable_class a la valeur OBJECT. Si l’argument securable_class a la valeur OBJECT, l’argument sub-securable_class doit être défini sur COLUMN.

Types de retour

int

Renvoie NULL lorsque la requête échoue.

Remarques

Cette fonction intégrée teste si le principal actif a une autorisation effective sur un élément sécurisable spécifié. HAS_PERMS_BY_NAME retourne 1 lorsque l'utilisateur dispose d'autorisation effective sur l'élément sécurisable, 0 lorsque l'utilisateur n'a pas cette autorisation et NULL si la classe sécurisable ou l'autorisation n'est pas valide. Une autorisation effective peut être :

  • une autorisation accordée directement au principal et non refusée ;

  • une autorisation impliquée par une autorisation de niveau supérieur détenue par le principal et non refusée ;

  • une autorisation accordée à un rôle ou à un groupe dont le principal est membre et non refusé ;

  • une autorisation détenue par un rôle ou un groupe dont le principal est membre et non refusé.

L'évaluation des autorisations a toujours lieu dans le contexte de sécurité de l'appelant. Pour déterminer si un autre utilisateur a une autorisation effective, l'appelant doit avoir l'autorisation IMPERSONATE sur cet utilisateur.

Pour les entités au niveau schéma, les noms non NULL en une, deux ou trois parties sont acceptés. Pour les entités au niveau base de données, un nom en une partie est accepté ; la valeur NULL indique la « base de données active ». Pour le serveur lui-même, la valeur NULL (« serveur actif ») est exigée. Cette fonction ne peut pas contrôler les autorisations sur un serveur lié ou sur un utilisateur Windows pour lequel aucun principal au niveau serveur n'a été créé.

La requête suivante renvoie la liste des classes intégrées des éléments sécurisables :

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

Les classements suivants sont utilisés :

  • Classement de la base de données active : éléments sécurisables au niveau base de données qui comprennent des éléments sécurisables non contenus dans un schéma ; éléments sécurisables sur l'étendue d'un schéma en une ou deux parties ; base de données cible lors de l'utilisation d'un nom en trois parties.

  • Classement de la base de données master : éléments sécurisables au niveau serveur.

  • « ANY » n'est pas pris en charge pour les contrôles au niveau colonne. Vous devez spécifier l'autorisation appropriée.

Exemples

R. Ai-je l'autorisation VIEW SERVER STATE au niveau serveur ?

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures

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

B. Puis-je emprunter l'identité du principal du serveur Ps ?

S’applique à : SQL Server 2008 (10.0.x) et versions ultérieures

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

C. Ai-je des autorisations dans la base de données active ?

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

D. Le principal de la base de données Pd a-t-il une autorisation dans la base de données active ?

Supposons que l'appelant a une autorisation IMPERSONATE sur le principal Pd.

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

E. Puis-je créer des procédures et des tables dans le schéma S ?

L'exécution du code exemple suivant nécessite l'autorisation ALTER dans S et l'autorisation CREATE PROCEDURE dans la base de données, de même pour des tables.

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. Sur quelles tables dois-je sélectionner l'autorisation ?

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

G. Ai-je l'autorisation INSERT sur la table SalesPerson dans AdventureWorks2022 ?

Le code exemple suivant suppose que AdventureWorks2022 est le contexte actuel de ma base de données et utilise un nom en deux parties.

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

Le code exemple suivant ne fait aucune hypothèse sur le contexte actuel de ma base de données et utilise un nom en trois parties.

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

H. Pour quelles colonnes de la table T ai-je l'autorisation 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');  

Voir aussi

Autorisations (moteur de base de données)
Éléments sécurisables
Hiérarchie des autorisations (moteur de base de données)
sys.fn_builtin_permissions (Transact-SQL)
Affichages catalogue liées à la sécurité (Transact-SQL)