Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
Se aplica a: SQL Server
Azure SQL Database
Azure SQL Managed Instance
Evalúa el permiso efectivo del usuario actual sobre un elemento protegible. Una función relacionada es fn_my_permissions.
Convenciones de sintaxis de Transact-SQL
HAS_PERMS_BY_NAME ( securable , securable_class , permission
[ , sub-securable ] [ , sub-securable_class ] )
securable
Es el nombre del elemento protegible. Si el elemento protegible 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 protegible en la cual se prueba el permiso. securable_class es una expresión escalar de tipo nvarchar(60).
En Azure SQL Database, el argumento securable_class debe establecerse en uno de los valores siguientes: DATABASE, OBJECT, ROLE, SCHEMA o USER.
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 protegible en la que se va a probar el permiso. El valor predeterminado es NULL.
Nota
Las subentidades protegibles no pueden usar corchetes con el formato "[nombre_de_la_subentidad]" . Es mejor usar 'sub name' .
sub-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. El valor predeterminado es NULL.
En Azure SQL Database, el argumento sub-securable_class solo es válido si el argumento securable_class está establecido en OBJECT. Si el argumento securable_class se establece en OBJECT, el argumento sub-securable_class debe establecerse en COLUMN.
int
Devuelve NULL cuando la consulta da error.
Esta función integrada determina si la entidad de seguridad actual tiene un permiso efectivo específico sobre un elemento protegible determinado. 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. 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 un rol o grupo al que pertenece la entidad de seguridad, no denegado.
Un permiso de un rol 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 a nivel de servidor.
La consulta siguiente devuelve una lista de clases de elementos protegibles integrados:
SELECT class_desc FROM sys.fn_builtin_permissions(default);
Se utilizan las intercalaciones siguientes:
Intercalación de la base de datos activa: elementos protegibles 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 maestra: elementos protegibles de servidor.
En las comprobaciones de columna no se admite 'ANY'. Debe especificar el permiso apropiado.
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores
SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');
Se aplica a: SQL Server 2008 (10.0.x) y versiones posteriores
SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
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
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.
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;
SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name),
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables
En el ejemplo siguiente se supone que AdventureWorks2022
es el contexto de la base de datos actual 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('AdventureWorks2022.Sales.SalesPerson',
'OBJECT', 'INSERT');
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');
Permisos (motor de base de datos)
Elementos protegibles
Jerarquía de permisos (motor de base de datos)
sys.fn_builtin_permissions (Transact-SQL)
Vistas de catálogo de seguridad (Transact-SQL)
Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoy