Comment permettre d'exécuter des procédures stockées mais pas d'écrire?

11

Je souhaite configurer un utilisateur "en lecture" sur mon instance SQL Server 2012. Je voudrais lui accorder le droit d'exécuter toute procédure stockée, ou fonction, ou instruction SQL directe, qui récupère les données de toutes les tables et vues, mais pas de mettre à jour ou d'insérer (c'est-à-dire de lire quoi que ce soit et d'écrire rien).

Puis-je configurer cela sans donner spécifiquement des droits à chaque fonction ou procédure stockée par nom, mais plutôt lui accorder le droit d'exécution sur n'importe quelle fonction ou procédure stockée, en lui retirant simplement le droit de modifier les tables?

Est-ce que quelque chose changera si j'exécute SQL Server 2008 à la place?

Clarifications et ajouts:

  1. Si une procédure stockée modifie des données, l'utilisateur doit recevoir un message d'erreur (refusant la modification ou refusant complètement l'accès à la procédure stockée).
  2. Si une solution potentielle implique le refus d'autorisations, puis-je simplement ne pas accorder certaines autorisations au lieu de les refuser?
  3. Un refus peut-il être appliqué à toutes les tables, vues, etc. (existantes maintenant et à l'avenir) dans la base de données en une seule instruction?
gt6989b
la source
Je suis nouveau ici, n'hésitez pas à définir des balises comme il convient et sinon à modifier la question
gt6989b
1
@KrisGruttemeyer c'était l'idée - il pourrait l'exécuter mais cela entraînerait une erreur quelconque; alternativement, je suis d'accord avec le fait qu'il ne soit pas autorisé à l'exécuter, tant que je n'ai pas besoin de spécifier une liste de sp qu'il a les privilèges d'exécuter
gt6989b
1
Dans ce cas, vous devez lire les autorisations SQL Server. Il existe 3 variantes d'autorisation - GRANTpour accorder des autorisations, DENYrefuser des autorisations et REVOKEsupprimer un GRANTou DENY. Sans GRANTou, DENYl'utilisateur peut hériter des autorisations, par exemple en obtenant l'accès à une procédure stockée.
JNK
1
@ gt6989b Si vous utilisez DENY DELETE, INSERT, UPDATEune base de données ou un schéma, je pense que cela n'affectera que les tables et les vues.
JNK
1
@ gt6989b - Notant simplement que la réponse suggérée dans ces commentaires s'est révélée incorrecte. Voir la réponse de Paul White.
RLF

Réponses:

15

Ce n'est pas aussi facile à réaliser que vous ne le pensez. Une façon consiste à créer un nouveau rôle de base de données défini par l'utilisateur, à accorder toutes les autorisations nécessaires à ce rôle, puis à ajouter des utilisateurs au nouveau rôle. Cela facilite au moins l'octroi aux utilisateurs (ou à d'autres rôles définis par l'utilisateur) de cet ensemble d'autorisations à l'avenir. Les étapes suivantes sont un bon début:

-- The user-defined role containing all required permissions
CREATE ROLE Readers AUTHORIZATION dbo;

-- Give read-only access to all tables,
-- views on those tables, and in-line
-- functions
ALTER ROLE db_datareader ADD MEMBER Readers;

-- Example: add a user (Bob) to the role
ALTER ROLE Readers ADD MEMBER Bob;

Après cela, Bob aura de larges privilèges en lecture seule dans la base de données. Il pourra lire à partir de toutes les tables, les vues sur ces tables et les fonctions en ligne. Cependant, il ne pourra exécuter aucune procédure ni utiliser de fonctions non intégrées.

Vous devrez accorder des autorisations spécifiques au rôle Lecteurs pour les fonctions et procédures sécurisées auxquelles vous souhaitez que les lecteurs aient accès. Il peut y avoir des étapes que vous pouvez suivre pour faciliter ce processus (comme le regroupement d'objets dans un schéma et l'octroi d'une autorisation d'exécution sur le schéma au lieu d'objets individuels), mais il y a trop de détails à couvrir ici.

Une chose à savoir est que le manque de privilèges de modification des données n'empêcherait pas un lecteur de modifier les données via une procédure stockée sur laquelle il a été autorisé à exécuter, si la procédure et l'objet en cours de modification partagent un propriétaire commun. Un refus explicite ne serait pas non plus respecté en l'espèce. Cette fonctionnalité est connue sous le nom de chaînage de propriété .

Paul White 9
la source