39 votes

Masquer une base de données SQL depuis Management Studio

Comment masquer les bases de données pour lesquelles vous n'avez pas de droits d'accès lorsque vous vous connectez à l'application SQL Server 2005 / 2008 ?

Actuellement, si un utilisateur se connecte, il voit toutes les bases de données sur le serveur, ce qui signifie qu'il doit parcourir la liste pour trouver sa base de données.

51voto

Après avoir passé des heures à essayer de comprendre comment créer un compte utilisateur qui n'a accès qu'à une seule base de données et qui ne peut voir que cette base. Je pense avoir trouvé la solution !!!!

  1. Créez un compte utilisateur ( Assurez-vous qu'il n'est pas associé à une base de données, sinon vous obtiendrez l'erreur finale Msg 15110, Level 16, State 1 et notez la solution proposée. )

    USE [master]
    GO
    CREATE LOGIN [us4] 
        WITH PASSWORD=N'123', 
        DEFAULT_DATABASE=[master], 
        CHECK_EXPIRATION=OFF, 
        CHECK_POLICY=OFF
  2. Cliquez avec le bouton droit de la souris sur la partie supérieure de l'écran SQL (nom du SQLSERVER)>. Properties > Permissions >Cliquez sur le user account et sélectionnez Deny pour visualiser les bases de données.

    use [master]
    GO
    DENY VIEW ANY DATABASE TO [us4]
  3. Cliquez avec le bouton droit de la souris sur la BD nouvellement créée, Propriétés, Fichiers, et changez le Propriétaire pour le compte nouvellement créé.( note importante : ALTER ROLE [db_owner] ADD MEMBER [us4] ne fonctionne pas )

    USE [dbname]
    GO
    EXEC dbo.sp_changedbowner @loginame = N'us4', @map = false

À ce stade, une fois que l'utilisateur se sera connecté, il verra la base de données principale, tempdb, ainsi que la nouvelle base de données dont il est le propriétaire. Tools>Option et activé l'option de masquer les objets du système afin de ne pas afficher le master, tempdb, etc. Vous pouvez également avoir besoin de SP1 si cette option ne fonctionne pas.

Msg 15110, Level 16, State 1, Line 1
The proposed new database owner is already a user or aliased in the database.

solution proposée au Msg 15110 : Pour résoudre l'erreur ci-dessus, il suffit de supprimer l'utilisateur du nœud de sécurité de la base de données et de réessayer.

J'espère que cela vous aidera...

Nikhil

21voto

Jonathan Kehayias Points 2446

En fait, cela ne fonctionnera pas de la manière qui semble logique ou à laquelle on pourrait s'attendre.

Vous REVOKE VIEW ANY DATABASE à partir du rôle public, mais l'utilisateur doit alors être le propriétaire de la base de données, sinon celle-ci ne peut pas être vue, mais on peut quand même y accéder.

Le problème est un défaut de sécurité du moteur de base de données et il est peu probable qu'il soit corrigé dans la version actuelle ou future de SQL Server.

Erland Sommarskog a ouvert l'élément de connexion suivant pour cela il y a un certain temps, et il a récemment été discuté sur twitter et avec Microsoft par la SQL MVP's .

Votez pour la connexion et contribuez à faire de ce problème une priorité pour Microsoft :

Connecter les commentaires

Les permissions sont stockées au niveau de la base de données, il faudrait donc énumérer chaque base de données pour déterminer si l'utilisateur a les droits de connexion pour afficher la base de données dans l'explorateur d'objets, ce qui est une tâche coûteuse à réaliser et la façon dont l'ancien EM faisait les choses.

La solution proposée est que ces informations soient également gérées au niveau du serveur, ce qui constitue un changement majeur.

2 votes

+1, cela semble être la réponse la plus complète et la plus approfondie jusqu'à présent.

0 votes

Veuillez voter dans le lien Connect, bien qu'il soit toujours marqué comme ACTIF même après plus de 8 ans.

2 votes

Depuis que la connexion a été déplacée vers Azure Feedback, le lien mentionné ci-dessus ne fonctionne plus. Le nouveau lien est feedback.azure.com/forums/908035-sql-server/suggestions/

14voto

Mitch Wheat Points 169614

Vous devez révoquer l'autorisation 'VIEW ANY DATABASE' du rôle PUBLIC (à partir de SQL SERVER 2005).

5 votes

Remarque : cette méthode peut ne pas fonctionner si vous ne pouvez pas faire de ce login utilisateur le DBO de la base de données que vous voulez qu'il administre ou si vous avez plusieurs logins que vous voulez sécuriser de cette manière car seul un seul login peut être le DBO réel d'une base de données.

1voto

vipin bhardwaj Points 11

Ajouter un utilisateur à la BD en tant que propriétaire de la BD après l'avoir supprimée CONSULTER N'IMPORTE QUELLE BASE DE DONNÉES droits

Ceci montrera seulement la base de données possédée par le login dans SSMS.

USE master; GO

DENY VIEW ANY DATABASE TO [loginname]; GO

USE [your db]; GO

DROP USER [loginname]; GO

USE master; GO

ALTER AUTHORIZATION ON DATABASE::[your db]TO [loginname]; GO

Note : cela nécessite que le login existe déjà

0voto

Brettski Points 5485

Il semble y avoir un paramètre côté serveur sur MS SQL 2005 et 2008 pour limiter les bases de données qu'un utilisateur peut voir. J'ai trouvé le texte suivant à l'adresse sql-server-performance.com

Dans SQL Server 2005, cela est possible avec un nouveau rôle côté serveur qui a été créé. L'autorisation VIEW ANY DATABASE est une nouvelle autorisation au niveau du serveur. Un login qui a cette permission peut voir les métadonnées qui décrivent toutes les bases de données, indépendamment du fait que le login possède ou peut effectivement utiliser une base de données particulière. Remarque Par défaut, l'autorisation VIEW ANY DATABASE est accordée au rôle public. Par conséquent, par défaut, chaque utilisateur qui se connecte à une instance de SQL Server 2005 peut voir toutes les bases de données de l'instance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X