2009-07-28 11 views
22

Je travaille depuis 7 mois sur un C# ASP.NET en utilisant Visual Studio 2008 et SQL Server 2008.L'autorisation SELECT a été refusée sur l'objet 'Adresse', base de données 'CNET_85731', schéma 'dbo'

Aujourd'hui, je courais une partie de ma demande qui était déjà en marche et je suis l'erreur suivante:

l'autorisation SELECT a été refusée sur l'objet « Adresse », base de données « CNET_85731 », schéma « dbo ».

je me promenais dans mon code et a découvert que cette erreur a été causé dans le contrôle de l'utilisateur suivant:

protected void sdsAddressesList_Selected(object sender, SqlDataSourceStatusEventArgs e) 
{ 
    if (e.AffectedRows == 0) 
    { 
     ddlAddresses.Items.Insert((0), new ListItem("No Billing Addresses", "0")); 
    } 
} 

SqlDataSource est défini comme suit:

<asp:SqlDataSource ID="sdsAddressesList" runat="server" OnSelecting="sdsAddressesList_Selecting" OnSelected="sdsAddressesList_Selected" 
    SelectCommand="SELECT [AddressId], [ZipPostalCode], ZipPostalCode + '&nbsp;--&nbsp;' + Address1 AS CombinedAddress FROM [Address] WHERE ([CustomerID] = @CustomerID AND [IsBillingAddress] = @IsBillingAddress) ORDER BY [ZipPostalCode]" 
    ConnectionString="<%$ ConnectionStrings:eCoSysConnection %>"> 
    <SelectParameters> 
     <asp:Parameter Name="CustomerID" Type="Int32" /> 
     <asp:Parameter Name="IsBillingAddress" Type="Boolean" /> 
    </SelectParameters> 
</asp:SqlDataSource> 

Fondamentalement, ce que le contrôle ne récupère une liste d'adresses pour l'utilisateur connecté à partir de la table [Address], puis remplit la liste déroulante ddlAddresses.

La table d'adresses a toutes les mêmes autorisations que le reste des tables de la base de données. J'ai environ 60 tables et environ 200 procédures stockées tout joyeusement travailler en faisant des sélections, etc. Pas de problème. Sauf pour ce seul problème. Que diable se passe-t-il? Je n'ai apporté aucune modification aux autorisations de la base de données ou de la table.

Quelqu'un peut-il m'aider s'il vous plaît.

Cordialement

Walter

+0

La chaîne de connexion pointe-t-elle vers la base de données correcte (celle qui dispose des autorisations appropriées)? – shahkalpesh

+0

Oui. la chaîne de connexion dans web.config est la suivante: J'utilise cette même chaîne de connexion pour accéder à la base de données à tout moment. –

+0

Est-ce que quelque chose a changé avec votre connexion Windows qui est liée au serveur SQL? – shahkalpesh

Répondre

14

Eh bien, je ne suis pas sûr de ce que la cause était pour l'autorisation SELECT refusée pour votre utilisateur db mais si vous exécutez cela et il ne fonctionne en effet à nouveau, puis quelque part le long la ligne, votre permission SELECT a bien été effacée. La bonne nouvelle est que les permissions ne disparaissent pas comme par magie; les mauvaises nouvelles sont quelque chose (outillage ou autre) a effectivement supprimé ou révoqué les autorisations.

Je ne pense pas que nous ayons assez d'informations pour répondre à votre question quant au "pourquoi" c'est arrivé - bien que, rien de ce que vous avez posté semble être le coupable.

+0

Salut EPiddy, oui, je suis d'accord, les autorisations ne disparaissent pas simplement. J'ai essayé ce qui suit comme suggéré: GRANT SELECT ON [dbo] [Adresse] TO [POSITIVECODE-UW \ ASPNET] où 'POSITIVECODE-UW \ ASPNET' est le compte ASPNET.. La commande s'est terminée avec succès sur SQL Server, mais malheureusement, j'ai toujours la même erreur: La permission SELECT a été refusée sur l'objet 'Adresse', base de données 'CNET_85731', schéma 'dbo'. Merci pour votre suggestion. Regards Walter –

+0

J'ai même essayé de placer la commande SELECT dans une procédure stockée et d'appeler la procédure stockée à partir de SqlDataSource. Rien. Je suis juste désespérément agrippé à des pailles. –

+1

Cela fonctionne pour moi .. Merci – Muthukumar

3

Had un rapide Google, trouvé ce lien Link

Il suggère de mener

select object_name(major_id) as object, 
user_name(grantee_principal_id) as grantee, 
user_name(grantor_principal_id) as grantor, 
permission_name, 
state_desc 
from sys.database_permissions 
where major_id = object_id('Users') 
and class = 1 

Sur votre base de données pour voir les autorisations qui existent, vous pouvez avoir un DENY sélectionnez

Modifier

select object_name(major_id) as object, 
user_name(grantee_principal_id) as grantee, 
user_name(grantor_principal_id) as grantor, 
permission_name, 
state_desc 
from sys.database_permissions 
WHERE state_desc = 'DENY' 

Gérée pour trouver une boîte SQL 2k8 en cours d'exécution et l'a exécutée, cette nouvelle requête affichera tous les refus. Essayez également de prendre la clause WHERE dézoomer, de voir toutes les autorisations sur toutes les tables de la base de données actuellement sélectionnée

+0

Merci PostMan. J'ai couru cette requête et il a retourné 0 lignes. Je suppose que c'est correct? –

+0

Voir la modification, devrait retourner plus d'informations utiles – PostMan

+0

La suppression et la recréation de la table ne fonctionnait pas non plus. –

59

Comme le dit problème, « L'autorisation SELECT a été refusée sur l'objet « Adresse », base de données « CNET_85731 », schéma 'dbo' ".

Je me demande, vous pouvez tout simplement résoudre cette façon:

  • Open Studio SQL Server Management
  • Accédez à la base de données 'CNET_85731' >> Sécurité >> Les utilisateurs
  • Faites un clic droit sur celui qui vous utilisez dans votre code
  • Et enfin, sélectionnez simplement 'db_datareader' dans la section "Appartenance à un rôle de base de données".

Maintenant, j'espère que vous ne devriez pas avoir cette erreur à nouveau.

+7

Ou au lieu de sélectionner 'db_datareader'uncheck' db_denydatareader ' – CodingBarfield

+5

Merci. Décocher 'db_denydatareader' et 'db_denydatawriter' a fonctionné pour moi. – jiminy

+1

Non, cela n'a pas aidé dans mon cas. Nécessaire "Accorder la sélection à l'utilisateur", regardez la réponse d'EPiddys. – AGuyCalledGerald

0

Si cette erreur s'affiche dans SQL Server Management Studio, exécutez simplement SQL Server Management Studio en tant qu'administrateur.

0

Supprimez la partie suivante de votre chaîne de connexion;

In‌​tegrated Security=True;

Et tout fonctionne bien pour moi.

Questions connexes