Comparez les prix des domaines et des services informatiques des vendeurs du monde entier

MS SQL Server: Vérifiez si l'utilisateur peut exécuter la procédure stockée

Comment pouvez-vous vérifier si un utilisateur peut effectuer une procédure stockée dans MS SQL server?

Je vois que si l'utilisateur a des autorisations d'exécution évidentes en se connectant à la base de données principale et effectuant:


databasename..sp_helpprotect 'storedProcedureName', 'username'


Cependant, si l'utilisateur est membre du rôle qui a la permission d'être exécuté, sp_helprotect Je ne vais pas m'aider.

Idéalement, j'aimerais pouvoir nommer quelque chose comme


databasename..sp_canexecute 'storedProcedureName', 'username'


Qu'est-ce que l'ampoule retournera?
Invité:

Darius

Confirmation de:

Essayez quelque chose comme ceci:


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

Fabrice

Confirmation de:

Prétendons que SP Effectue uniquement l'opérateur SELECT:

EXECUTE AS USER = [User ID/Login]

EXEC sp_foobar/ SNA, FU/

REVERT

Il est important de noter que vous devrez exécuter la commande REVERT Après la demande, puisque SQL Server vous considérera que vous l'utilisateur effectué pendant que vous éteignez la connexion ou REVERT Ne vous cédez pas. Cependant, vous devez voir exactement que l'utilisateur recevra /Obtenir des lignes, mais pas tous? Cela devrait vous aider/.

Pour répondre aux questions, connectez-vous ou registre