2009-01-27 14 views
8

¿Cómo puede verificar si un usuario puede ejecutar un procedimiento almacenado en el servidor MS SQL?Servidor MS SQL: verifique si un usuario puede ejecutar un procedimiento almacenado

puedo ver si el usuario ha explícita permisos de ejecución mediante la conexión a la base de datos maestra y ejecución:

databasename..sp_helpprotect 'storedProcedureName', 'username' 

sin embargo, si el usuario es un miembro de una función que tiene permisos de ejecución sp_helprotect no me ayudará .

Idealmente me gustaría ser capaz de llamar algo así como

databasename..sp_canexecute 'storedProcedureName', 'username' 

que devolver un bool.

+0

Además, si usted está utilizando SQL Server 2005 o superior y el permiso se asigna al esquema o la base de datos (EJECUTAR puede ser ahora), sp_helprotect no reportará eso. El procedimiento almacenado se incluye únicamente para compatibilidad con versiones anteriores y reporta permisos basados ​​en lo que estaba en SQL Server 2000. –

Respuesta

13
+1

No creo que estas funciones respondan a la pregunta original, que era comprobar si ** _ cualquier usuario _ _ tiene permisos de ejecución en un proceso almacenado dado Los artículos de MSDN para ambas funciones dicen que devuelven permisos para ** _ calling principal only _ **, en lugar de cualquier principal. –

1

Suponiendo que el SP sólo se ejecuta una instrucción SELECT:

EXECUTE AS USER = [ID/Inicio de sesión de usuario]
EXEC sp_foobar (SNA, fu)
REVERT

Es importante tener en cuenta que deberá ejecutar el comando REVERT después de la solicitud, ya que SQL Server considerará usted como usuario está EJECUTANDO COMO hasta que apague la conexión o REVERTE la suplantación. Dicho esto, debería ver exactamente lo que obtendría un usuario (¿obteniendo algunas filas pero no todas? Esto debería ayudarlo).

4

Pruebe algo como esto:

CREATE PROCEDURE [dbo].[sp_canexecute] 
@procedure_name varchar(255), 
@username varchar(255), 
@has_execute_permissions bit OUTPUT 
AS 

IF EXISTS (
     /* Explicit permission */ 
     SELECT 1 
     FROM sys.database_permissions p 
     INNER JOIN sys.all_objects o ON p.major_id = o.[object_id] AND o.[name] = @procedure_name 
     INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND dp.[name] = @username 
    ) 
    OR EXISTS (
     /* Role-based permission */ 
     SELECT 1 
     FROM sys.database_permissions p 
     INNER JOIN sys.all_objects o ON p.major_id = o.[object_id] 
     INNER JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id AND o.[name] = @procedure_name 
     INNER JOIN sys.database_role_members drm ON dp.principal_id = drm.role_principal_id 
     INNER JOIN sys.database_principals dp2 ON drm.member_principal_id = dp2.principal_id AND dp2.[name] = @username 
    ) 
BEGIN 
    SET @has_execute_permissions = 1 
END 
ELSE 
BEGIN 
    SET @has_execute_permissions = 0 
END 
GO 
+0

¿Funciona si el usuario es miembro de un rol que tiene permisos y no se le ha permitido explícitamente ejecutar el procedimiento almacenado? – Andrew

+0

No, pero podría poner el nombre del rol en el parámetro @username y eso aún devolvería el resultado booleano apropiado/esperado. – Dane

+0

Ok, he actualizado el código de proc anterior para tomar los permisos otorgados por medio de roles así como la concesión explícita. – Dane

Cuestiones relacionadas