L'autorisation SELECT a été refusée sur l'objet
-
19-08-2019 - |
Question
Si vous avez créé un rôle personnalisé dans SqlServer, que j'ai ajouté aux rôles db__denydatareader et db__denydatawriter. Je pense que je suis passé par la base de données et a accordé l'autorisation d'exécuter à toutes les procédures stockées neccersary.
Tout fonctionne bien, appeler ces sps fonctionnera bien. La seule exception est une procédure stockée qui exécute SQL dynamique à l'aide de sp_executesql. Cela échoue en disant
The SELECT permission was denied on the object 'listing_counter', database 'Cannla', schema 'dbo'.
Existe-t-il un moyen d'accorder au rôle l'autorisation d'exécuter cette requête sans lui attribuer un accès sélectif aux tables sous-jacentes?
Je suppose que ce que je veux faire, c’est accorder à exec sur sys.sp_executesql mais uniquement dans certains cas.
La solution
Vous pouvez créer un nouvel utilisateur pour votre procédure stockée qui utilise execute_sql, lui octroyer les droits nécessaires, puis l'ajouter à la définition de procédure WITH EXECUTE AS 'MyUser'. Voir MSDN.
Autres conseils
Utilisez les instructions suivantes pour cela. Cela a fonctionné pour moi.
sp_addlinkedserver [@ server =] 'serveur' [, [@ srvproduct =] 'nom_produit'] [, [@ fournisseur =] 'nom_fournisseur']
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]