PERMISSIONS (Transact-SQL)
Devuelve un valor con un mapa de bits que indica los permisos del usuario actual sobre una instrucción, objeto o columna.
Importante Esta característica se quitará en una versión futura de Microsoft SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. Use fn_my_permissions y HAS_PERMS_BY_NAME (Transact-SQL) en su lugar. El uso continuado de la función PERMISSIONS puede producir un rendimiento más lento.
Sintaxis
PERMISSIONS ( [ objectid [ , 'column' ] ] )
Argumentos
objectid
Es el Id. de un asegurable. Si no se especifica objectid, el valor de mapa de bits contiene permisos de instrucción para el usuario actual; en caso contrario, contiene permisos sobre el asegurable para el usuario actual. El asegurable especificado se debe encontrar en la base de datos actual. Use la función OBJECT_ID para determinar el valor de objectid.'column'
Es el nombre opcional de la columna cuya información de permisos se devuelve. Debe ser un nombre de columna válido de la tabla especificada con objectid.
Tipos de valor devueltos
int
Notas
Se puede utilizar PERMISSIONS para determinar si el usuario actual cuenta con los permisos necesarios para ejecutar una instrucción o para otorgar, con GRANT, un permiso a otro usuario.
La información de permisos devuelta es un mapa de bits de 32 bits.
Los 16 bits inferiores reflejan permisos concedidos al usuario y también permisos que se aplican a grupos de Windows o a funciones fijas de servidor de las que es miembro el usuario actual. Por ejemplo, si se devuelve el valor 66 (valor hexadecimal 0x42) cuando no se especifica objectid, indica que el usuario tiene permiso para ejecutar las instrucciones CREATE TABLE (valor decimal 2) y BACKUP DATABASE (valor decimal 64).
Los 16 bits superiores reflejan los permisos que el usuario puede otorgar a otros usuarios con la instrucción GRANT. Los 16 bits superiores se interpretan exactamente de la misma forma que los 16 bits inferiores descritos en las tablas siguientes, excepto en que están desplazados 16 bits hacia la izquierda (multiplicados por 65.536). Por ejemplo, 0x8 (valor decimal 8) es el bit que indica el permiso INSERT cuando se especifica objectid. Por su parte, 0x80000 (valor decimal 524288) indica que se puede usar el permiso GRANT INSERT, porque 524288 = 8 x 65536.
Debido a la pertenencia en funciones, un usuario que no tiene permiso para ejecutar una instrucción puede conceder ese permiso a otro usuario.
En la siguiente tabla se muestran los bits utilizados para los permisos sobre instrucciones (no se especifica objectid).
Bit (dec) |
Bit (hex) |
Permiso de la instrucción |
---|---|---|
1 |
0x1 |
CREATE DATABASE (sólo base de datos master) |
2 |
0x2 |
CREATE TABLE |
4 |
0x4 |
CREATE PROCEDURE |
8 |
0x8 |
CREATE VIEW |
16 |
0x10 |
CREATE RULE |
32 |
0x20 |
CREATE DEFAULT |
64 |
0x40 |
BACKUP DATABASE |
128 |
0x80 |
BACKUP LOG |
256 |
0x100 |
Reservado |
En la siguiente tabla se indican los bits utilizados para los permisos de objetos que se devuelven cuando sólo se especifica objectid.
Bit (dec) |
Bit (hex) |
Permiso de la instrucción |
---|---|---|
1 |
0x1 |
SELECT ALL |
2 |
0x2 |
UPDATE ALL |
4 |
0x4 |
REFERENCES ALL |
8 |
0x8 |
INSERT |
16 |
0x10 |
DELETE |
32 |
0x20 |
EXECUTE (sólo procedimientos) |
4096 |
0x1000 |
SELECT ANY (al menos una columna) |
8192 |
0x2000 |
UPDATE ANY |
16384 |
0x4000 |
REFERENCES ANY |
En la siguiente tabla se muestran los bits utilizados para los permisos de objeto en el nivel de columnas, devueltos cuando se especifican objectid y también columna.
Bit (dec) |
Bit (hex) |
Permiso de la instrucción |
---|---|---|
1 |
0x1 |
SELECT |
2 |
0x2 |
UPDATE |
4 |
0x4 |
REFERENCES |
Se devuelve NULL cuando alguno de los parámetros especificados es NULL o no es válido (por ejemplo, un objectid o columna que no existen). Los valores de bits para permisos que no son aplicables (por ejemplo, el permiso EXECUTE, bit 0x20,) para una tabla, no están definidos.
Puede usar el operador de bits AND (&) para determinar cada bit establecido en el mapa de bits que se devuelve mediante la función PERMISSIONS.
También puede usar el procedimiento almacenado de sistema sp_helprotect para obtener una lista de permisos para un usuario de la base de datos actual.
Ejemplos
A. Usar la función PERMISSIONS con permisos de instrucciones
En el siguiente ejemplo se determina si el usuario actual puede ejecutar la instrucción CREATE TABLE.
IF PERMISSIONS()&2=2
CREATE TABLE test_table (col1 INT)
ELSE
PRINT 'ERROR: The current user cannot create a table.';
B. Usar la función PERMISSIONS con permisos de objeto
En el siguiente ejemplo se determina si el usuario actual puede insertar una fila de datos en la tabla Address de la base de datos AdventureWorks.
IF PERMISSIONS(OBJECT_ID('AdventureWorks.Person.Address','U'))&8=8
PRINT 'The current user can insert data into Person.Address.'
ELSE
PRINT 'ERROR: The current user cannot insert data into Person.Address.';
C. Usar la función PERMISSIONS con permisos que se pueden otorgar
En el siguiente ejemplo se determina si el usuario actual puede otorgar a otro usuario el permiso INSERT en la tabla Address de la base de datos AdventureWorks.
IF PERMISSIONS(OBJECT_ID('AdventureWorks.Person.Address','U'))&0x80000=0x80000
PRINT 'INSERT on Person.Address is grantable.'
ELSE
PRINT 'You may not GRANT INSERT permissions on Person.Address.';