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 uniquement sur cette procédure stockée pendant que j'y suis?
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 pas seulement à une, et je n'en ai pas vu une où vous pouvez spécifier des autorisations à l'intérieur du create procedure
script. Même des réponses sur la façon dont je peux définir des autorisations sans l'interface graphique pour des procédures stockées spécifiques seraient les bienvenues.
Éditer La meilleure réponse m'a certainement orienté dans la bonne direction, c'est essentiellement ce que je cherchais, je n'ai pas pensé à regrouper les commandes, ce que j'ai fini par faire, à regrouper 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
GRANT EXECUTE ON dbo.procname TO username;
truncate table La définition d'une autorisation sur des objets tels que des procédures stockées peut être effectuée avec:
GRANT EXECUTE ON <schema>.<object> to <user>;
Cependant, vous pouvez également vouloir accorder des droits de sécurité au niveau de la connexion et de l'utilisateur. Vous souhaiterez déterminer et accorder UNIQUEMENT les droits nécessaires pour les objets qui nécessitent un accès (tels que l'exécution). Pensez à utiliser le EXECUTE AS
capacité qui permet l'emprunt d'identité d'un autre utilisateur pour valider les autorisations requises pour exécuter le code SANS avoir à accorder tous les droits nécessaires à tous les objets sous-jacents (par exemple, les tables). EXECUTE AS
peut être ajouté aux procédures stockées, aux fonctions, aux déclencheurs, etc.
Ajoutez au code comme suit directement dans la procédure stockée:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
Dans ce cas, vous vous faites passer pour le propriétaire du module appelé. Vous pouvez également emprunter l'identité de SELF, OR l'utilisateur créant ou modifiant le module OR ... imperonate CALLER, ce qui permettra au module de prendre les autorisations de l'utilisateur actuel, OR ... usurpant l'identité du PROPRIÉTAIRE , qui prendra l'autorisation du propriétaire de la procédure appelée OU ... usurper l'identité 'nom_utilisateur', qui usurpera l'identité d'un utilisateur spécifique OU ... usurper l'identité 'nom_login' avec usurpera l'identité d'une connexion spécifique.
La plupart du temps, vous n'aurez besoin que d'accorder des droits EXECUTE
aux proc stockés, puis des droits seront accordés à tous les objets référencés dans le proc stocké.
De cette façon, vous N'AVEZ PAS besoin de donner des droits implicites (exemple: pour mettre à jour les données ou appeler des procs supplémentaires). Le chaînage de propriété gère cela pour vous. Cela 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 AS
est un outil pratique à considérer pour ces derniers.
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 OR LE PROPRIÉTAIRE DE CETTE PROCÉDURE AURAIT BESOIN DE CRÉER DES DROITS DE TABLEAU 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 le EXECUTE AS
clause 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.MyTable
et les lignes sont correctement insérées. Dans cet exemple, l'utilisateur NoPrivUser
n'a absolument aucun droit accordé pour modifier la table, ou lire ou modifier les données de cette table.
Il ne prend que les droits nécessaires à l'accomplissement de cette tâche spécifique codée DANS le cadre 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 attribuer de façon permanente ces droits s'avère très utile.
sélectionnez la connexion à la base de données -> Aller à sécurisable et cliquez sur le bouton Rechercher comme dans l'image précédente. En cliquant sur le bouton Rechercher, vous trouverez la fenêtre suivante pour ajouter le type d'objet.
Cliquez sur le bouton Types d’objets et vous obtiendrez la fenêtre "Sélectionner les types d’objets" avec divers objets. Maintenant, si vous voyez, 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 voulons accorder une autorisation.