Les utilisateurs ne peuvent pas afficher les tables dans un schéma non par défaut dans SSMS

10

Je rencontre un problème en définissant l' VIEW DEFINITIONautorisation de manière appropriée au niveau du schéma pour l'un de mes utilisateurs. J'ai créé le schéma TestSchemaet ajouté quelques tables. L'utilisateur dispose actuellement définir des autorisations d'accès et modifier la table ( SELECT, UPDATE, DELETE, etc.) à travers les dbo_datareaderet dbo_datawriterrôles. Cependant, ils ne peuvent voir aucune des tables dans l'explorateur d'objets SSMS.

J'ai essayé d'accorder des autorisations pour afficher les définitions:

grant view definition on SCHEMA :: [TestSchema] to [User]

Ça n'a pas marché. J'ai essayé de définir l'autorisation au niveau de la table:

grant view definition on [TestSchema].[NewTable] to [User]

Cela n'a pas fonctionné non plus. Ensuite, j'ai essayé juste une subvention globale:

grant view definition to [User]

Et cela a fonctionné; ils peuvent maintenant voir TestSchema, ainsi que d'autres schémas auxquels ils ne devraient pas avoir accès.

Mon objectif ici est de permettre à l'utilisateur de visualiser toutes les tables d'un schéma donné. Comment puis-je y parvenir? Si je devais être en mesure de le faire par défaut, quelles autorisations devrais-je consulter pour savoir pourquoi je ne peux pas?

eykanal
la source
Sur mon instance 2008R2, lorsque j'accorde à db_datareader ou db_datawriter, ils peuvent voir tous les schémas. Je réalise que ce n'est pas ce que vous recherchez, mais cela signifie qu'il y a une différence significative entre votre configuration et la mienne, donc je ne peux pas vraiment le tester. La version est-elle tout ce qui est différent ou une autre sécurité a-t-elle été modifiée?
cfradenburg
@cfradenburg - C'est difficile à dire; il s'agit d'un serveur géré par l'informatique, donc je ne suis pas sûr de ce qu'ils ont fait, et je suis un novice SQL Server, donc je ne sais pas quoi chercher. Je suppose qu'une partie de ma question est, quelles autres autorisations / rôles / ??? dois-je rechercher pour déterminer si cela peut être simplement résolu par des autorisations?
eykanal
L'utilisateur peut-il interroger les tables? S'ils peuvent interroger, cela pourrait simplement être un problème dans SSMS.
user9164
@ user9164 Oui, les utilisateurs peuvent interroger les tables; il s'agit simplement de les visualiser dans SSMS.
eykanal

Réponses:

11

Réponse courte: n'utilisez pas db_datareaderou db_datawriterou leurs équivalents de refus. Ils sont uniquement à des fins de compatibilité descendante. Leur utilisation entraînera des problèmes comme celui auquel vous êtes confronté.

Si vous souhaitez donner à Alice principale les autorisations SELECT, INSERT, UPDATE et DELETE sur tous les objets table dans le schéma Sales, utilisez ce qui suit.

GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::Sales TO Alice ;

Si vous souhaitez donner à Alice principale les autorisations SELECT, INSERT, UPDATE et DELETE sur tous les objets table dans tous les schémas, utilisez la procédure suivante.

GRANT SELECT, INSERT, UPDATE, DELETE TO Alice ;

La visibilité des métadonnées fonctionnera alors correctement.

Marcheur de Greenstone
la source
Avez-vous une source pour le bit «rétrocompatibilité»? Je comprends que les schémas sont obsolètes, mais je ne trouve rien sur les rôles.
Stijn
0

Jetez un œil aux principales autres autorisations, il pourrait y avoir un refus quelque part à l'origine du problème. N'oubliez pas qu'un refus s'appliquera toujours en plus d'une subvention. Et comme ce n'est pas votre serveur, il pourrait y avoir quelque chose dans le compte que le département informatique a créé.

Utilisez quelque chose comme ça pour le niveau serveur:

    use master
    go
    SELECT a.*,b.name as 'Login ID' FROM sys.server_permissions as A inner join 
    sys.server_principals as B on a.grantee_principal_id = b.principal_id
    where b.name = 'login ID of the account'
    GO

Et quelque chose comme ça au niveau de la base de données

SELECT a.*,b.name as 'Login ID' FROM sys.database_permissions as A 
inner join sys.server_principals as B on a.grantee_principal_id = b.principal_id
where b.name = 'test'
GO
Nick Winstanley
la source
Merci pour le commentaire, je vais essayer ça quand je retournerai au travail lundi.
eykanal
0

Cela m'est arrivé lorsque j'ai mis à niveau notre SQL Server de 2008R2 à 2014. db_datareader ou db_datawriter ou leurs équivalents de refus fonctionnent parfaitement en 2008R2 mais ils ne fonctionnent pas en 2014.

Exemple pour accorder une autorisation dans SQL Server 2014

Si vous souhaitez donner à l'utilisateur Alice les autorisations SELECT, INSERT, UPDATE et DELETE sur tous les objets table dans le schéma Sales, utilisez ce qui suit.

GRANT SELECT, INSÉRER, METTRE À JOUR, SUPPRIMER SUR SCHEMA :: Sales TO Alice; Si vous souhaitez donner à Alice principale les autorisations SELECT, INSERT, UPDATE et DELETE sur tous les objets table dans tous les schémas, utilisez la procédure suivante.

DONNER SÉLECTIONNER, INSÉRER, METTRE À JOUR, SUPPRIMER À Alice; La visibilité des métadonnées fonctionnera alors correctement.

Référence [Greenstone Walker].

Sundeep
la source
1
Sundeep, veuillez essayer d'expliquer une réponse au lieu de simplement fournir un lien. Si vous avez besoin d'aide, consultez la visite
LowlyDBA