SQL Server 'Impossible de find la procédure stockée' sans le nom du schéma

SQL Server 2005/2008, db = user = schéma = propriétaire = 'John', ASP.net 2.0.50727, vb, IIS7

Je déplace un site web d'un server à un autre. Ce morceau de code fonctionne bien sur l'ancien server avec SQL Server 2005.

Dim sqlCmdVehicle As SqlCommand = New System.Data.SqlClient.SqlCommand("SP_Name", sqlConn) Dim dtVehicle As New DataTable With sqlCmdVehicle .Parameters.AddWithValue("FullStockNo", "N102010") .CommandType = CommandType.StoredProcedure End With sqlConn.Open() sqlAdapter.SelectCommand = sqlCmdVehicle sqlAdapter.Fill(dtVehicle) 

La database est sauvegardée et restaurée avec succès sur le nouveau server. Lorsque j'essaie de lancer SQL Server 2008, j'ai une erreur:

Impossible de find la procédure stockée 'SP_Name'. pointant à la dernière ligne.

Je peux voir les procédures avec 'MS SQL Management Studio' pas comme dbo.SP_Name mais comme John.SP_Name

Quand je change

 System.Data.SqlClient.SqlCommand("SP_Name", sqlConn) 

dans

 System.Data.SqlClient.SqlCommand("John.SP_Name", sqlConn) 

tout fonctionne bien, mais c'est la même chose avec toutes les autres procédures et beaucoup de ces endroits aimables dans le code 🙁

J'ai obtenu http://msdn.microsoft.com/en-us/library/ms189915.aspx , mais le schéma par défaut de l'appelant est correct. Encore une fois, tout fonctionne bien sur une vieille boîte.

Que dois-je corriger dans SQL pour autoriser l'exécution de SP sans nom d'user / schéma explicitement mentionné?

Je vous remercie.

=================================

Malheureusement, je n'ai pas trouvé de bonne solution. La façon dont j'ai pris était search-et-replace SP_Name à John.SP_Name pour le projet entier. Merci à tous les participants.

Je ne suis pas sûr à 100%, mais vous avez probablement une connection à la database en utilisant sql nom d'user / pw et ensuite l'user le nom d'user "john".

Dans ce cas, votre schéma par défaut est "john" et vous devez directement utiliser dbo.SP_name pour accéder à votre procédure correctement.

Ce qui fonctionne également est de configurer le shema par défaut pour l'user jean pour la database user à "dbo". Vous pouvez le faire dans le menu des propriétés de l'user.

Sitenote: N'utilisez pas sp_. Si vous créez vos propres procédures, utilisez par exemple proc_ à la place. L'utilisation de sp_ fait toujours en sorte que le server SQL regarde d'abord dans la database master. Cela ralentit la performance.

Vous saurez exactement ce qui se passe si vous exécutez SQL Profiler et affichez datatables de trace. Vous verrez ce que l'appel exact est à la database et ce qui se passe.

Je sais que vous l'avez déjà mentionné, mais je vérifierais à nouveau l'user que votre code utilise comme schéma par défaut. Si aucun schéma n'est spécifié, SQL Server utilisera d' abord le schéma par défaut de l'user , et s'il ne trouve pas cet object DB, il tentera le schéma dbo , et si cela ne fonctionne pas, vous obtiendrez erreur que vous voyez.

Dans SQL Server> database> Votre nom de database> Sécurité> Schémas

Sélectionnez dbo Schemas> properties> Sélectionnez Permission>

Dans cette section, searchz "Utilisateurs et rôle"

Ajoutez votre nom d'user et votre permission pour le nom d'user. Cochez la case Exécuter.

Le schéma par défaut pour SQL Server 2008 est "dbo". C'est pourquoi il essaie d'atteindre dbo.SP_Name

Vous devez définir un schéma par défaut pour l'user. Reportez-vous à la question suivante: Pouvez-vous définir le schéma par défaut pour la requête SQL 2008?

Malheureusement, je n'ai pas trouvé de bonne solution. La façon dont j'ai pris était search-et-replace SP_Name à John.SP_Name pour le projet entier. Merci à tous les participants.

Nous avons découvert aujourd'hui que, si vous modifiez les permissions de vos users en tant qu'administrateur système sur SQL Server, même si vous avez spécifié le schéma par défaut pour votre user dans la database, le schéma par défaut est ignoré si vous essayez d'exécuter la procédure stockée sans spécifier le nom du schéma, il va penser que la procédure stockée est sous le schéma dbo! Lorsque vous supprimez les droits sysadmin de l'user connecté, il exécute la procédure stockée en utilisant le schéma par défaut défini pour cette database pour l'user, si vous ne spécifiez aucun nom de schéma dans votre command EXEC.