Comment accordez-vous l'autorisation d'exécution pour une seule procédure stockée?


40

Normalement, lorsque je crée une procédure stockée, j'utilise ce qui suit comme modèle de tri

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

 <procedure>

end

Existe-t-il un moyen d'inclure l'octroi d'une autorisation d'exécution sur cette procédure stockée uniquement lorsque je suis au courant?
Par exemple, comme ...

Grant execute [User_Execute] 

... mais uniquement pour cette procédure stockée?

J'ai vu d'autres questions similaires, mais elles semblent toutes faire référence à TOUTES les procédures stockées et non à une seule. Je n'en ai pas vu non plus où vous pouvez spécifier des autorisations à l'intérieur du create procedurescript. Même des réponses sur la manière dont je peux définir des autorisations sans l'interface graphique pour des procédures stockées spécifiques seraient les bienvenues.

Modifier La réponse du haut m’a certainement orientée dans la bonne direction, c’est essentiellement ce que je cherchais, je ne pensais pas à la mise en lots des commandes, c’est ce que j’ai fini par faire: mettre en lots la commande avec ma procédure stockée. Quoi qu'il en soit, je pense que c'est assez lisse.

Create procedure <procedurename>
<@param1 <type>, @param2 <type>, etc..> 
as begin

<procedure>

end
GO
GRANT EXECUTE ON <procedurename> to <username>
GO

Le code fourni dans le texte modifié est valide et la réponse correcte à cette question.
ninty9notout

Réponses:



10

truncate table La définition de permissions sur des objets tels que les procédures stockées peut être réalisée avec:

GRANT EXECUTE ON <schema>.<object> to <user>;

Toutefois, vous pouvez également vouloir accorder des droits de sécurité au niveau de la connexion et de l'utilisateur. Vous voudrez déterminer et accorder UNIQUEMENT les droits nécessaires pour les objets nécessitant un accès (tels que l'exécution). Envisagez d'utiliser la EXECUTE ASfonctionnalité qui permet l'emprunt d'identité d'un autre utilisateur pour valider les autorisations nécessaires à l'exécution du code SANS octroyer tous les droits nécessaires à tous les objets sous-jacents (par exemple, les tables). EXECUTE ASpeut être ajouté aux procédures stockées, fonctions, déclencheurs, etc.

Ajoutez le code comme suit directement dans la procédure stockée:

CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER

Dans ce cas, vous personnifiez le propriétaire du module appelé. Vous pouvez également emprunter l'identité de SELF, OU l'utilisateur qui crée ou modifie le module OU ... un appelant impeccable, ce qui permettra à ce module de prendre les autorisations de l'utilisateur actuel, OU ... d'usurper l'identité du propriétaire, qui obtiendra l'autorisation du le propriétaire de la procédure appelée OU ... emprunte l'identité de "nom_utilisateur", qui empruntera l'identité d'un utilisateur spécifique OU ... empruntant l'identité de "nom_utilisateur" avec l'identité d'un identifiant spécifique.

La plupart du temps, il vous suffira d'octroyer des EXECUTEdroits aux procédures stockées, puis des droits seront accordés à tous les objets référencés dans la procédure stockée.

De cette façon, vous n'avez PAS besoin de donner des droits implicites (exemple: mettre à jour des données ou appeler des procs supplémentaires). Le chaînage des propriétés s’occupe de cela pour vous. Ceci est particulièrement utile pour SQL dynamique ou si vous devez créer des tâches de sécurité élevées telles que CREATE TABLE. EXECUTE ASest un outil pratique à considérer pour ceux-ci.

Cet exemple peut aider à clarifier tout cela:

Créez un utilisateur appelé NoPrivUser avec un accès public à une base de données (par exemple, dbadb):

USE [master];
GO 
CREATE LOGIN [NoPrivUser] WITH PASSWORD=N'ABC5%', DEFAULT_DATABASE=[dbadb], 
  CHECK_EXPIRATION=ON, CHECK_POLICY=ON;
GO 
USE [DBAdb];
GO 
CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser];
GO

REMARQUE: LE CRÉATEUR OU LE PROPRIÉTAIRE DE CETTE PROCÉDURE EXIGE DES DROITS DE CRÉATION DE TABLE dans la base de données cible.

use DBAdb 
go 
CREATE PROCEDURE dbo.MyProcedure 
WITH EXECUTE AS OWNER 

truncate table MyTable

GO
GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; 
GO
-- Now log into your database server as NoPrivUser and run the following.

Avec la EXECUTE ASclause, la procédure stockée est exécutée dans le contexte du propriétaire de l'objet. Ce code crée avec succès dbo.MyTableet les lignes sont insérées avec succès. Dans cet exemple, l'utilisateur ne NoPrivUserdispose d'aucun droit absolu de modifier la table, de lire ou de modifier les données de cette table.

Il ne prend que les droits nécessaires pour mener à bien cette tâche spécifique, codée DANS LE contexte de cette procédure.

Cette méthode de création de procédures stockées pouvant effectuer des tâches nécessitant des droits de sécurité élevés sans affecter ces droits de manière permanente est très utile.


4
C'est la même réponse que vous avez postée hier sur SO , que j'ai également dû formater pour la lisibilité.
Aaron Bertrand

5

entrez la description de l'image ici

sélectionnez la connexion à la base de données -> Allez à Sécurisable et cliquez sur le bouton Rechercher comme dans l'image précédente. En cliquant sur le bouton Rechercher, vous verrez la fenêtre suivante pour ajouter le type d'objet.

Cliquez sur le bouton Types d'objet et vous obtiendrez la fenêtre «Sélectionner les types d'objet» avec divers objets. Si vous voyez maintenant, la procédure stockée est répertoriée dans la zone des types d'objet. Nous allons maintenant sélectionner notre procédure stockée spécifique sur laquelle nous souhaitons fournir une autorisation.


Premièrement, la question datait de plus de cinq ans lorsque vous y avez répondu. Cela conviendrait, sauf que l'OP a spécifiquement demandé des solutions qui n'utilisent pas l'interface graphique et peuvent être intégrées à un script. Votre réponse ne répond pas à cela.
Eric Brandt
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.