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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Evalúa el permiso efectivo del usuario actual sobre un elemento protegible.Evaluates the effective permission of the current user on a securable. Una función relacionada es fn_my_permissions.A related function is fn_my_permissions.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

securablesecurable
Es el nombre del elemento protegible.Is the name of the securable. Si el elemento protegible es el servidor mismo, este valor debe establecerse en NULL.If the securable is the server itself, this value should be set to NULL. securable es una expresión escalar de tipo sysname.securable is a scalar expression of type sysname. No tiene ningún valor predeterminado.There is no default.

securable_classsecurable_class
Es el nombre de la clase de elemento protegible en la cual se prueba el permiso.Is the name of the class of securable against which the permission is tested. securable_class es una expresión escalar de tipo nvarchar(60) .securable_class is a scalar expression of type nvarchar(60).

En Base de datos SQL de AzureAzure SQL Database, el argumento securable_class debe establecerse en uno de los valores siguientes: DATABASE, OBJECT, ROLE, SCHEMA o USER.In Base de datos SQL de AzureAzure SQL Database, the securable_class argument must be set to one of the following: DATABASE, OBJECT, ROLE, SCHEMA, or USER.

permissionpermission
Expresión escalar no NULL de tipo sysname que representa el nombre del permiso que se va a comprobar.A nonnull scalar expression of type sysname that represents the permission name to be checked. No tiene ningún valor predeterminado.There is no default. El nombre de permiso ANY es un comodín.The permission name ANY is a wildcard.

sub-securablesub-securable
Expresión escalar opcional de tipo sysname que representa el nombre de la subentidad protegible en la que se va a probar el permiso.An optional scalar expression of type sysname that represents the name of the securable sub-entity against which the permission is tested. El valor predeterminado es NULL.The default is NULL.

Nota

En las versiones SQL ServerSQL Server hasta SQL Server 2017SQL Server 2017, las subentidades protegibles no pueden usar corchetes con el formato '[ sub name ]' .In versions of SQL ServerSQL Server through SQL Server 2017SQL Server 2017, sub-securables cannot use brackets in the form '[sub name]'. Es mejor usar ' sub name ' .Use 'sub name' instead.

sub-securable_classsub-securable_class
Expresión escalar opcional de tipo nvarchar(60) que representa la clase de subentidad protegible en la que se va a probar el permiso.An optional scalar expression of type nvarchar(60) that represent the class of securable subentity against which the permission is tested. El valor predeterminado es NULL.The default is NULL.

En Base de datos SQL de AzureAzure SQL Database, el argumento sub-securable_class solo es válido si el argumento securable_class está establecido en OBJECT.In Base de datos SQL de AzureAzure SQL Database, the sub-securable_class argument is valid only if the securable_class argument is set to OBJECT. Si el argumento securable_class se establece en OBJECT, el argumento sub-securable_class debe establecerse en COLUMN.If the securable_class argument is set to OBJECT, the sub-securable_class argument must be set to COLUMN.

Tipos devueltosReturn Types

intint

Devuelve NULL cuando la consulta da error.Returns NULL when the query fails.

NotasRemarks

Esta función integrada determina si la entidad de seguridad actual tiene un permiso efectivo específico sobre un elemento protegible determinado.This built-in function tests whether the current principal has a particular effective permission on a specified securable. HAS_PERMS_BY_NAME devuelve 1 cuando el usuario tiene un permiso efectivo sobre el elemento protegible, 0 cuando el usuario no tiene ningún permiso efectivo sobre el elemento protegible y NULL cuando la clase protegible o el permiso no son válidos.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. Un permiso efectivo puede ser cualquiera de los siguientes:An effective permission is any of the following:

  • Un permiso concedido directamente a la entidad de seguridad, no denegado.A permission granted directly to the principal, and not denied.

  • Un permiso implícito en un permiso de nivel superior de la entidad de seguridad, no denegado.A permission implied by a higher-level permission held by the principal and not denied.

  • Un permiso concedido a un rol o grupo al que pertenece la entidad de seguridad, no denegado.A permission granted to a role or group of which the principal is a member, and not denied.

  • Un permiso de un rol o grupo al que pertenece la entidad de seguridad, no denegado.A permission held by a role or group of which the principal is a member, and not denied.

La evaluación de permisos siempre se realiza en el contexto de seguridad del autor de la llamada.The permission evaluation is always performed in the security context of the caller. Para determinar si algún otro usuario tiene un permiso efectivo, el autor de la llamada debe tener el permiso IMPERSONATE sobre ese usuario.To determine whether some other user has an effective permission, the caller must have IMPERSONATE permission on that user.

En el caso de entidades de esquema, se aceptan nombres no NULL de una, dos o tres partes.For schema-level entities, one-, two-, or three-part nonnull names are accepted. En el caso de entidades de base de datos, se aceptan nombres de una parte, con un valor NULL que significa "base de datos actual".For database-level entities a one-part name is accepted, with a null value meaning "current database". En el caso del servidor, es necesario un valor NULL (que significa "servidor actual").For the server itself, a null value (meaning "current server") is required. Esta función no puede comprobar permisos en un servidor vinculado ni en un usuario de Windows para los que no se ha creado ninguna entidad de seguridad a nivel de servidor.This function cannot check permissions on a linked server or on a Windows user for which no server-level principal has been created.

La consulta siguiente devuelve una lista de clases de elementos protegibles integrados:The following query will return a list of built-in securable classes:

SELECT class_desc FROM sys.fn_builtin_permissions(default);  

Se utilizan las intercalaciones siguientes:The following collations are used:

  • Intercalación de base de datos actual: elementos protegibles de base de datos que incluyen elementos no incorporados en un esquema; elementos con ámbito de esquema de una o dos partes; base de datos de destino cuando se utiliza un nombre de tres partes.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.

  • Intercalación de base de datos &maestra: elementos protegibles en el nivel de servidor.master database collation: Server-level securables.

  • En las comprobaciones de columna no se admite 'ANY'.'ANY' is not supported for column-level checks. Debe especificar el permiso apropiado.You must specify the appropriate permission.

EjemplosExamples

A.A. ¿Tengo el permiso VIEW SERVER STATE en el servidor?Do I have the server-level VIEW SERVER STATE permission?

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

B.B. ¿Puedo suplantar (IMPERSONATE) la entidad de seguridad del servidor Ps?Am I able to IMPERSONATE server principal Ps?

Se aplica a: de SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017

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

C.C. ¿Tengo algún permiso en la base de datos activa?Do I have any permissions in the current database?

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

D.D. ¿Tiene la entidad de seguridad de base de datos Pd algún permiso en la base de datos activa?Does database principal Pd have any permission in the current database?

Suponga que el autor de la llamada tiene el permiso IMPERSONATE sobre la entidad de seguridad 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. ¿Puedo crear procedimientos y tablas en el esquema S?Can I create procedures and tables in schema S?

Para el ejemplo siguiente es necesario tener el permiso ALTER para S y el permiso CREATE PROCEDURE de la base de datos, y lo mismo para las tablas.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. ¿Sobre qué tablas tengo el permiso SELECT?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. ¿Tengo el permiso INSERT sobre la tabla SalesPerson en AdventureWorks2012?Do I have INSERT permission on the SalesPerson table in AdventureWorks2012?

En el ejemplo siguiente se supone que AdventureWorks2012 es el contexto de la base de datos actual y se utiliza un nombre de dos partes.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');  

En el ejemplo siguiente no se asume ningún contexto de base de datos activa y se utiliza un nombre de tres partes.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. ¿Sobre qué columnas de la tabla T tengo el permiso 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');  

Consulte tambiénSee Also

Permisos (motor de base de datos) Permissions (Database Engine)
Securables Securables
Jerarquía de permisos (motor de base de datos) Permissions Hierarchy (Database Engine)
sys.fn_builtin_permissions (Transact-SQL) sys.fn_builtin_permissions (Transact-SQL)
Vistas de catálogo de seguridad (Transact-SQL)Security Catalog Views (Transact-SQL)