Cómo saber si tengo permisos en SQL Server

Hola a todos, hoy os vamos a contar cómo saber si tengo permisos en SQL Server. Para ello usaremos la función que nos da el sistema HAS_PERMS_BY_NAME.
Se puede encontrar toda la información completa en la documentación oficial en el siguiente link:
https://docs.microsoft.com/es-es/sql/t-sql/functions/has-perms-by-name-transact-sql?view=sql-server-ver15
Aunque nosotros vamos a ver las operaciones más comunes.

Sintaxis

La sintaxis general de la función es:

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

Dentro de la sintaxis:

  • securable: Es el elemento sobre el cual queremos saber si tenemos permisos o no. Si el elemento es de tipo servidor, este valor debe especificarse a NULL.
  • securable_class: Es el tipo o clase de elemento sobre el que actuamos. Se puede saber los tipos de elementos posibles utilizando la siguiente consulta:
SELECT distinct(class_desc) FROM sys.fn_builtin_permissions(default);
Cómo saber si tengo permisos en SQL Server
  • permission: Es el permiso sobre el que se quiere preguntar.
    Si se necesita conocer sobre cualquier permiso, y no sobre uno concreto, existe el comodín ‘ANY‘.
  • sub-securable: Si el elemento se puede dividir en subelementos, por ejemplo, si se quiere conocer los permisos sobre columnas de una tabla.
  • sub-securable_class: El tipo o clase del subelemento.

Qué valor devuelve la función

Al ejecutar la consulta sobre la función, si el usuario tiene el permiso la función devuelve valor 1, si no tiene el permiso devuelve 0, y NULL si el permiso o el tipo de objeto no existe ono es válido.

Veamos cómo saber si tengo permisos en SQL Server con ejemplos

Vamos a ver algunos ejemplos de los distintos tipos de objetos que podemos tener.

Para saber si tengo el permiso VIEW SERVER STATE en el servidor actual, ya que no se pueden comprobar permisos en servidores vinculados:

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

Conocer si tengo permisos en la BBDD activa:

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

Crear procedures en el esquema ‘dev’:

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'CREATE PROCEDURE')  
    & HAS_PERMS_BY_NAME('dev', 'SCHEMA', 'ALTER') AS _can_create_procs;

También se puede combinar con algunas tablas de sistema, por ejemplo para saber sobre que tablas tengo permiso de SELECT:

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

E incluso se puede saber sobre las columnas de una tabla concreta, en este caso de la tabla de ventas:

SELECT name AS column_name,   
    HAS_PERMS_BY_NAME('ventas', 'OBJECT', 'SELECT', name, 'COLUMN')   
    AS can_select   
    FROM sys.columns AS c   
    WHERE c.object_id=object_id('ventas');

Esperamos que os haya sido de utilidad.

Un saludo.

Equipo de base de datos

Si no quieres perderte trucos como este y estar al día de este mundo, suscríbete a nuestra newsletter. Te mantendremos informados con un solo email al mes.

¿Aún no conoces Query Performance? Descubre cómo puede ayudarte en tu entorno Oracle. Más información en su página de LinkedIn.

Sígue a GPS en LinkedIn

Si tienes dudas sobre su administración o relacionada con Oracle o SQL Server, ¡¡no dudes en contactar con nosotros que estaremos encantados de ayudar!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *