HAS_PERMS_BY_NAME (Transact-SQL)HAS_PERMS_BY_NAME (Transact-SQL)

S’applique à :Applies to: ouiSQL ServerSQL Server (toutes les versions prises en charge) yesSQL ServerSQL Server (all supported versions) OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL DatabaseS’applique à :Applies to: ouiSQL ServerSQL Server (toutes les versions prises en charge) yesSQL ServerSQL Server (all supported versions) OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database

Évalue l'autorisation effective de l'utilisateur actuel sur un élément sécurisable.Evaluates the effective permission of the current user on a securable. Une fonction associée est fn_my_permissions.A related function is fn_my_permissions.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

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

Notes

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 et versions antérieures, consultez Versions antérieures de la documentation.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumentsArguments

securablesecurable
Indique le nom de l'élément sécurisable.Is the name of the securable. Si l'élément sécurisable est le serveur lui-même, cette valeur doit être définie avec NULL.If the securable is the server itself, this value should be set to NULL. securable est une expression scalaire de type sysname.securable is a scalar expression of type sysname. Il n'y a pas de valeur par défaut.There is no default.

securable_classsecurable_class
Nom de la classe de l'élément sécurisable sur lequel l'autorisation est testée.Is the name of the class of securable against which the permission is tested. securable_class est une expression scalaire de type nvarchar(60) .securable_class is a scalar expression of type nvarchar(60).

Dans Azure SQL DatabaseAzure SQL Database, l’argument securable_class doit avoir l’une des valeurs suivantes : DATABASE, OBJECT, ROLE, SCHEMA ou USER.In Azure SQL DatabaseAzure SQL Database, the securable_class argument must be set to one of the following: DATABASE, OBJECT, ROLE, SCHEMA, or USER.

permissionpermission
Expression scalaire non-NULL de type sysname qui représente le nom de l’autorisation à vérifier.A nonnull scalar expression of type sysname that represents the permission name to be checked. Il n'y a pas de valeur par défaut.There is no default. Le nom d'autorisation ANY représente une autorisation générique.The permission name ANY is a wildcard.

sub-securablesub-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.An optional scalar expression of type sysname that represents the name of the securable sub-entity against which the permission is tested. La valeur par défaut est NULL.The default is NULL.

Notes

Dans SQL ServerSQL Server et versions ultérieures, les éléments sub-securable ne peuvent pas utiliser de crochets sous la forme '[ nom sub ]' .In versions of SQL ServerSQL Server and later, sub-securables cannot use brackets in the form '[sub name]'. Utilisez ' sub name ' à la place.Use 'sub name' instead.

sub-securable_classsub-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.An optional scalar expression of type nvarchar(60) that represent the class of securable subentity against which the permission is tested. La valeur par défaut est NULL.The default is NULL.

Dans Azure SQL DatabaseAzure SQL Database, l’argument sub-securable_class est valide uniquement si l’argument securable_class a la valeur OBJECT.In Azure SQL DatabaseAzure SQL Database, the sub-securable_class argument is valid only if the securable_class argument is set to OBJECT. Si l’argument securable_class a la valeur OBJECT, l’argument sub-securable_class doit être défini sur COLUMN.If the securable_class argument is set to OBJECT, the sub-securable_class argument must be set to COLUMN.

Types de retourReturn Types

intint

Renvoie NULL lorsque la requête échoue.Returns NULL when the query fails.

NotesRemarks

Cette fonction intégrée teste si le principal actif a une autorisation effective sur un élément sécurisable spécifié.This built-in function tests whether the current principal has a particular effective permission on a specified securable. 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.HAS_PERMS_BY_NAME returns 1 when the user has effective permission on the securable, 0 when the user has no effective permission on the securable, and NULL when the securable class or permission is not valid. Une autorisation effective peut être :An effective permission is any of the following:

  • une autorisation accordée directement au principal et non refusée ;A permission granted directly to the principal, and not denied.

  • une autorisation impliquée par une autorisation de niveau supérieur détenue par le principal et non refusée ;A permission implied by a higher-level permission held by the principal and not denied.

  • une autorisation accordée à un rôle ou à un groupe dont le principal est membre et non refusé ;A permission granted to a role or group of which the principal is a member, and not denied.

  • une autorisation détenue par un rôle ou un groupe dont le principal est membre et non refusé.A permission held by a role or group of which the principal is a member, and not denied.

L'évaluation des autorisations a toujours lieu dans le contexte de sécurité de l'appelant.The permission evaluation is always performed in the security context of the caller. Pour déterminer si un autre utilisateur a une autorisation effective, l'appelant doit avoir l'autorisation IMPERSONATE sur cet utilisateur.To determine whether some other user has an effective permission, the caller must have IMPERSONATE permission on that user.

Pour les entités au niveau schéma, les noms non NULL en une, deux ou trois parties sont acceptés.For schema-level entities, one-, two-, or three-part nonnull names are accepted. 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 ».For database-level entities a one-part name is accepted, with a null value meaning "current database". Pour le serveur lui-même, la valeur NULL (« serveur actif ») est exigée.For the server itself, a null value (meaning "current server") is required. 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éé.This function cannot check permissions on a linked server or on a Windows user for which no server-level principal has been created.

La requête suivante renvoie la liste des classes intégrées des éléments sécurisables :The following query will return a list of built-in securable classes:

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

Les classements suivants sont utilisés :The following collations are used:

  • 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.Current database collation: Database-level securables that include securables not contained by a schema; one- or two-part schema-scoped securables; target database when using a three-part name.

  • Classement de la base de données master : éléments sécurisables au niveau serveur.master database collation: Server-level securables.

  • « ANY » n'est pas pris en charge pour les contrôles au niveau colonne.'ANY' is not supported for column-level checks. Vous devez spécifier l'autorisation appropriée.You must specify the appropriate permission.

ExemplesExamples

R.A. Ai-je l'autorisation VIEW SERVER STATE au niveau serveur ?Do I have the server-level VIEW SERVER STATE permission?

S’applique à : SQL Server 2008SQL Server 2008 et ultérieurApplies to: SQL Server 2008SQL Server 2008 and later

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

B.B. Puis-je emprunter l'identité du principal du serveur Ps ?Am I able to IMPERSONATE server principal Ps?

S’applique à : SQL Server 2008SQL Server 2008 et ultérieurApplies to: SQL Server 2008SQL Server 2008 and later

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

C.C. Ai-je des autorisations dans la base de données active ?Do I have any permissions in the current database?

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

D.D. Le principal de la base de données Pd a-t-il une autorisation dans la base de données active ?Does database principal Pd have any permission in the current database?

Supposons que l'appelant a une autorisation IMPERSONATE sur le principal Pd.Assume caller has IMPERSONATE permission on principal Pd.

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

E.E. Puis-je créer des procédures et des tables dans le schéma S ?Can I create procedures and tables in schema 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.The following example requires ALTER permission in S and CREATE PROCEDURE permission in the database, and similarly for 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.F. Sur quelles tables dois-je sélectionner l'autorisation ?Which tables do I have SELECT permission on?

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

G.G. Ai-je l'autorisation INSERT sur la table SalesPerson dans AdventureWorks2012 ?Do I have INSERT permission on the SalesPerson table in AdventureWorks2012?

Le code exemple suivant suppose que AdventureWorks2012 est le contexte actuel de ma base de données et utilise un nom en deux parties.The following example assumes AdventureWorks2012 is my current database context, and uses a two-part name.

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.The following example makes no assumptions about my current database context, and uses a three-part name.

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

H.H. Pour quelles colonnes de la table T ai-je l'autorisation SELECT ?Which columns of table T do I have SELECT permission on?

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 aussiSee Also

Autorisations (moteur de base de données) Permissions (Database Engine)
Securables Securables
Hiérarchie des autorisations (Moteur de base de données) Permissions Hierarchy (Database Engine)
sys.fn_builtin_permissions (Transact-SQL) sys.fn_builtin_permissions (Transact-SQL)
Affichages catalogue de sécurité (Transact-SQL)Security Catalog Views (Transact-SQL)