web-dev-qa-db-fra.com

Problème relatif aux autorisations dans SSMS: "L’autorisation SELECT a été refusée pour l’objet 'propriétés étendues', la base de données 'mssqlsystem_resource', ... Erreur 229)"

Voici le cas de repro le plus simple possible.

  1. Créer une nouvelle base de données. (J'utilise SQL 2005.)
  2. Créez une connexion, un utilisateur SQL et une table dans la nouvelle base de données (voir l'exemple de code ci-dessous).
  3. Lancez SSMS et ouvrez l'Explorateur d'objets en vous connectant en tant qu'utilisateur nouvellement créé .
  4. Essayez d'ouvrir le dossier "Tables" dans l'Explorateur d'objets.

Le problème

Échec avecce message d'erreur.

Texte du message:

TITRE: Microsoft SQL Server Management Studio
Échec d'extraction des données pour cette demande. (Microsoft.SqlServer.Management.Sdk.Sfc)
Pour obtenir de l'aide, cliquez sur: link
INFORMATION ADDITIONNELLE:
Une exception s'est produite lors de l'exécution d'une instruction ou d'un lot Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
L'autorisation SELECT a été refusée sur l'objet 'extended_properties', base de données mssqlsystemresource ', schéma' sys '. (Microsoft SQL Server, erreur: 229)
Pour obtenir de l'aide, cliquez sur: link

Cet utilisateur peut accéder à la table et à l'enregistrement dans la table. Mais l'utilisateur ne peut pas accéder à la liste des tables de l'Explorateur d'objets.

SELECT USER_NAME() AS CurrentUser, col1
FROM dbo.TestTable

CurrentUser col1
----------- ----
robg_test   1000

La seule solution que j'ai trouvée consiste à donner à l'utilisateur des privilèges plus élevés que nécessaire (comme db_datareader).

La question:

Quel est le privilège minimum requis pour permettre à cet utilisateur d'ouvrir la liste de tables dans l'explorateur d'objets?

J'ai essayé d'accorder à l'utilisateur divers privilèges sur le schéma dbo, mais cela n'a pas aidé.

Notez également que j'utilise un utilisateur SQL simplement pour illustrer le problème. Le problème initial était avec un utilisateur AD.

Ici est une question relativement similaire chez serverfault.


Code

SET NOCOUNT ON
USE master
GO
IF EXISTS (SELECT * FROM sys.server_principals WHERE name = N'robg_test')
    DROP LOGIN [robg_test]
GO
CREATE LOGIN [robg_test]
WITH
    PASSWORD         = N'CLK63!!black',
    DEFAULT_DATABASE = [RGTest],
    DEFAULT_LANGUAGE = [us_english],
    CHECK_EXPIRATION = OFF,
    CHECK_POLICY     = ON
GO

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'RGTest')
    DROP DATABASE [RGTest]
GO
CREATE DATABASE [RGTest]
GO
USE [RGTest]
GO
CREATE USER [robg_test] FOR LOGIN [robg_test] WITH DEFAULT_SCHEMA = [dbo]
GO
CREATE TABLE dbo.TestTable (col1 int)
GO
GRANT SELECT ON dbo.TestTable TO [robg_test]
GO
INSERT INTO dbo.TestTable VALUES (1000)
GO
16
Rob Garrison

Veuillez vérifier que vous n'avez pas vérifié le rôle de base de données db_denydatareader. En enlevant ce chèque, cela a fonctionné pour moi.

69
Eltigani

J'ai eu un problème similaire et résolu cela en supprimant deux rôles db_denydatareader et db_denydatawriter pour cet utilisateur et en ajoutant d'autres rôles. J'ai utilisé le studio de gestion SQL.

9
Cool Man

SSMS tente d'obtenir les propriétés étendues de la table à l'aide de fn_listextendedproperty . Selon MSDN , les autorisations nécessaires pour afficher les propriétés étendues d'une table sont 

ALTER sur la table OBJECT

Votre test de connexion doit avoir cette permission en tant que propriétaire de la table de test (c'est le propriétaire, n'est-ce pas?). Cependant, même si vous ne disposez pas des autorisations sur la table, la requête relative aux propriétés étendues doit renvoyer l'ensemble de résultats vide, pas d'accès refusé. Le fait que vous obteniez une erreur d'accès refusé sur un objet système dans la base de données de ressources indique que la signature du code de la base de données de ressources système (mssqlsystemresource) est rompue. Avez-vous oublié l'un des certificats '##' du maître? Avez-vous modifié manuellement un objet dans la base de données? 

Quoi qu'il en soit, vous avez en ce moment une apparence qui ressemble à une instance corrompue et je vous recommande de contacter le support technique pour savoir comment la rétablir dans un état cohérent.

1
Remus Rusanu

J'avais un problème similaire. Je l'ai résolu en ajoutant l'utilisateur au rôle public. Mais si vous ne vouliez pas faire cela, j’ai également constaté que le problème pouvait être résolu en donnant l’autorisation de l’utilisateur à la vue sys.extended-properties (dans System Views de la base de données à laquelle vous essayez d’accéder).

1
Eric Weir

"En créant la base de données SQL Server avec un compte, ce compte est propriétaire et dispose de tous les accès nécessaires" 

Pas besoin d'améliorations supplémentaires dans les autorisations.

Cette approche a supprimé l’erreur d’accès dont semble parler ce fil. J'ai rencontré l'erreur d'accès dans SSMS, ainsi que dans Visual Studio (EF), en utilisant l'authentification Windows et en créant la base de données du serveur SQL avec le compte Administrateur.

La solution pratique pour moi était: 

SSMS> démarrer en tant qu'administrateur, connexion serveur SQL: avec authentification Windows - NE PAS créer une base de données serveur SQL - mais donner à un compte "créer une base de données" un droit sur "maître" 

puis connexion SSMS avec ce compte (disposant des autorisations «créer une base de données sur le maître») - pour créer la base de données (vide)

(VISUAL STUDIO xtra: Puis, dans Visual Studio, connectez-vous au serveur SQL avec ce compte et comparez les schémas entre LocalDB (source) et la base de données SQL Server (cible). contenu des données)

0
user7077707