web-dev-qa-db-fra.com

Comment créer un rôle serveur en lecture seule sur SQL Server 2012?

J'accorde l'autorisation "Afficher toute base de données" lors de la création d'un nouveau rôle serveur, mais j'ai réalisé que cette autorisation ne permet qu'à l'utilisateur de visualiser les bases de données système.

J'essaie de créer un rôle serveur qui est en lecture seule et peut lire n'importe quelle base de données.

Existe-t-il un moyen de créer un rôle serveur défini par l'utilisateur pour lire les bases de données utilisateur? Ou dois-je le faire en mappant les utilisateurs par utilisateur?

15
joha

Publier ceci comme réponse juste parce qu'il est trop long pour un commentaire et parce qu'il sera pertinent pour les autres utilisateurs très bientôt.

SQL Server 2014 ajoute de nouvelles autorisations au niveau du serveur qui aideront exactement à ce type de scénario - elles ont été conçues avec l'audit à l'esprit, mais ce type d'exigence semble également correspondre à cette facture. Vous pouvez simplement ajouter les deux autorisations suivantes à une connexion au niveau du serveur:

CONNECT ANY DATABASE

SELECT ALL USER SECURABLES

Comme il semble, le premier permet à la connexion de se connecter à n'importe quelle base de données. La bonne chose à ce sujet est qu'il permettra cela même pour les bases de données qui seront créées à l'avenir (à condition que vous ne définissiez pas le refus explicite, c'est ainsi que vous pouvez protéger certaines bases de données utilisateur des connexions qui ont cette autorisation). Ce dernier permet à la connexion d'effectuer des opérations de lecture sur n'importe quelle base de données à laquelle ils ont accès - afin qu'ils puissent SELECT à partir de tables, de vues, d'UDF, etc. mais ils ne pourront pas effectuer d'opérations UPDATE (Je n'ai pas testé si cette autorisation comprend quand une procédure stockée exécute DML). Ceux-ci fonctionnent très bien en combinaison si vous souhaitez donner un accès en lecture ouvert à tous les serveurs, ou pour être plus précis, vous pouvez accorder des privilèges CONNECT traditionnels à certaines bases de données, et les SELECT ALL USER SECURABLES right fonctionnera uniquement pour les bases de données auxquelles la connexion a un accès explicite.

Les les changements de sécurité de 2014 sont documentés ici - enfin, partiellement; ils ont oublié l'autorisation au niveau de la base de données ALTER ANY DATABASE EVENT SESSION - bien que ce ne soit pas pertinent ici.

16
Aaron Bertrand

Il n'y a pas de permission 'lire n'importe quelle base de données' au niveau du serveur et rôles au niveau du serveur ne peut pas être accordé des permissions au niveau de la base de données

Alors oui, vous devrez mapper les utilisateurs aux bases de données individuellement. Si vous utilisez Active Directory, vous pouvez créer un groupe Windows, puis donner à ce groupe une connexion à SQL Server, puis appliquer db_datareader dans toutes les bases de données de ce groupe (vous devrez cependant créer des utilisateurs dans chaque base de données).

8
Simon Righarts