Has_Perms_By_Name (Transact-SQL)

Evalúa el permiso efectivo del usuario actual sobre un elemento que puede protegerse.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • securable
    Es el nombre del elemento que puede protegerse. Si el elemento que puede protegerse es el servidor mismo, este valor debe establecerse en NULL. securable es una expresión escalar de tipo sysname. No tiene ningún valor predeterminado.
  • securable_class
    Es el nombre de la clase de elemento que puede protegerse en la cual se prueba el permiso. securable_class es una expresión escalar de tipo nvarchar(60).
  • permission
    Expresión escalar no NULL de tipo sysname que representa el nombre del permiso que se va a comprobar. No tiene ningún valor predeterminado. El nombre de permiso ANY es un comodín.
  • sub-securable
    Expresión escalar opcional de tipo sysname que representa el nombre de la subentidad asegurable en la que se va a probar el permiso. El valor predeterminado es NULL.
  • sub-securable_class
    Una expresión escalar opcional de tipo nvarchar(60) que representa la clase de subentidad que puede protegerse en la que se va a probar el permiso. El valor predeterminado es NULL.

Tipos de valor devueltos

int

Devuelve NULL si la consulta da error.

Notas

Esta función integrada determina si la entidad de seguridad actual tiene un permiso efectivo específico sobre un elemento que puede protegerse determinado. Un permiso efectivo puede ser cualquiera de los siguientes:

  • Un permiso concedido directamente a la entidad de seguridad, no denegado.
  • Un permiso implícito en un permiso de nivel superior de la entidad de seguridad, no denegado.
  • Un permiso concedido a una función o grupo al que pertenece la entidad de seguridad, no denegado.
  • Un permiso de una función o grupo al que pertenece la entidad de seguridad, no denegado.

La evaluación de permisos siempre se realiza en el contexto de seguridad del autor de la llamada. Para determinar si algún otro usuario tiene un permiso efectivo, el autor de la llamada debe tener el permiso IMPERSONATE sobre ese usuario.

En el caso de entidades de esquema, se aceptan nombres no NULL de una, dos o tres partes. 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". En el caso del servidor, es necesario un valor NULL (que significa "servidor actual"). 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 de servidor.

La consulta siguiente devuelve una lista de clases de elementos que pueden protegerse integrados:

   SELECT class_desc FROM sys.fn_builtin_permissions(default)

Se utilizan las intercalaciones siguientes:

  • Intercalación de la base de datos activa: elementos que pueden protegerse de base de datos, entre los que se incluyen elementos no incluidos 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.
  • Intercalación de la base de datos master: elementos de servidor que pueden protegerse.
  • En las comprobaciones de columna no se admite 'ANY'. Debe especificar el permiso apropiado.

Ejemplos

A. ¿Tengo el permiso VIEW SERVER STATE en el servidor?

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

B. ¿Puedo suplantar (IMPERSONATE) la entidad de seguridad del servidor Ps?

SELECT has_perms_by_name('Ps', 'LOGIN', 'IMPERSONATE')

C. ¿Tengo algún permiso en la base de datos activa?

SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')

D. ¿Tiene la entidad de seguridad de base de datos Pd algún permiso en la base de datos activa?

Suponga que el autor de la llamada tiene el permiso IMPERSONATE sobre la entidad de seguridad Pd.

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

E. ¿Puedo crear procedimientos y tablas en el esquema S?

Para el ejemplo siguiente es necesario tener el permiso ALTER en S y el permiso CREATE PROCEDURE en la base de datos, y lo mismo para las tablas.

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. ¿Sobre qué tablas tengo el permiso SELECT?

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

G. ¿Tengo el permiso INSERT sobre la tabla SalesPerson en AdventureWorks?

En el ejemplo siguiente se asume que AdventureWorks es el contexto de la base de datos activa y se utiliza un nombre de dos partes.

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.

SELECT has_perms_by_name('AdventureWorks.Sales.SalesPerson', 
    'OBJECT', 'INSERT')

H. ¿Sobre qué columnas de la tabla T tengo el permiso 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');

Vea también

Referencia

sys.fn_builtin_permissions (Transact-SQL)
Vistas de catálogo de seguridad (Transact-SQL)

Otros recursos

Permisos
Asegurables
Jerarquía de permisos

Ayuda e información

Obtener ayuda sobre SQL Server 2005