1

SQL Server 2005/2008, db = user = schéma = propriétaire = 'John', ASP.net 2.0.50727, vb, IIS7SQL Server 'Impossible de trouver la procédure stockée' sans nom de schéma

Je suis déplacer le site web d'un serveur à l'autre. Ce morceau de code fonctionne bien sur l'ancien serveur 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) 

DB est sauvegardé et restauré avec succès sur le nouveau serveur. Lorsque je tente d'exécuter avec le nouveau SQL Server 2008 Je suis une erreur:

Could not find stored procedure 'SP_Name'. pointing at last line.

je peux voir les procédures avec « studio de gestion MS SQL » pas 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 il est le même avec toutes les autres procédures et beaucoup de tels 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'utilisateur/schéma explicitement mentionné?

Merci.

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

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

+0

A partir du fichier d'aide que vous avez affiché 'SQL Server 2008 utilise le classement de la base de données appelante lors de la mise en correspondance des noms de procédure système. Par conséquent, vous devez toujours utiliser le cas exact des noms de procédure système dans votre application. Par exemple, ce code échouera s'il est exécuté dans le contexte d'une base de données avec un classement sensible à la casse: ' – JonH

+0

" Par exemple, ce code échouera s'il est exécuté dans le contexte d'une base de données avec un classement sensible à la casse: " - et le commentaire est terminé ou je ne peux pas voir la fin. Je viens de vérifier ** login ** (pas d'utilisateur) John et trouvé qu'il n'y a pas de mappage vers John DB. Je peux cocher la case, corriger le nom d'utilisateur et le schéma, appuyer sur 'ok', ouvrir à nouveau cette connexion, et voir cette case cochée. Aucun message d'erreur, aucune erreur dans le journal. S'il vous plaît donnez votre avis. – Putnik

+0

@JonH "Par exemple, ce code échouera s'il est exécuté dans le contexte d'une base de données qui a un classement sensible à la casse:" - et le commentaire est terminé ou je ne peux pas voir la fin. – Putnik

Répondre

0

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

1

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

Je sais que vous l'avez déjà mentionné, mais je vérifierais à nouveau ce que l'utilisateur utilise comme schéma par défaut. Si aucun schéma n'est spécifié, SQL Server utilise d'abord le schéma par défaut de l'utilisateur, et s'il ne peut pas trouver cet objet DB, il va essayer le dbo schéma, et si cela ne fonctionne pas , vous aurez cette erreur que vous voyez.

+0

J'ai vérifié: DB/Security/Users/John. Le schéma par défaut est John. Il ya 5 min J'ai créé la procédure 'dbo.SP_Name' - et ** cette ** erreur est partie, mais dans ce cas, je devrais réécrire chacune des procédures 1100 parce qu'il y a beaucoup d'erreurs apparaissant dans les procédures après un tel changement. – Putnik

+0

@Putnik exécuter une trace et voir ce qui se passe lorsque vous obtenez cette erreur de votre message d'origine. Vous verrez ce qui se passe. Et il devrait être assez facile de changer tous les procs stockés du schéma 'John' à' dbo'. Juste de la logique de code, des vues de catalogue, et un peu de SQL dynamique. –

+0

Merci, je vais courir trace. Malheureusement, je me rends compte comment changer le nom du SP, mais je n'ai aucune idée de comment corriger le SP. – Putnik

2

Je ne suis pas sûr à 100%, mais vous avez probablement une connexion à la base de données en utilisant sql nom d'utilisateur/pw et ensuite l'utilisateur le nom d'utilisateur "john".

Dans ce cas, votre schéma par défaut est également "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'utilisateur john pour la base de données utilisateur à "dbo". Vous pouvez le faire dans le menu des propriétés de l'utilisateur.

Sitenote: N'utilisez pas sp_. Si vous créez vos propres procédures, utilisez par ex. proc_ à la place. L'utilisation de sp_ fait toujours apparaître le serveur SQL dans la base de données master en premier. Cela ralentit la performance.

+0

Le schéma par défaut n'est pas 'dbo' mais 'John' - Je le vérifie à nouveau. Il ya 5 min J'ai créé la procédure 'dbo.SP_Name' - et il a été trouvé. Donc, le serveur SQL cherche parmi les procédures dbo. *, Mais je dois trouver un moyen de changer cela. Il y a 1100 procédures de John. *, donc je vais devenir fou jusqu'à ce que le code entier soit corrigé. – Putnik

+0

ps: J'ai utilisé SP_ * par exemple seulement, le préfixe réel & l'utilisateur | schéma sont différents. – Putnik

0

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

Vous devez définir un schéma par défaut pour l'utilisateur. Voir la question suivante: Can you set default Schema for SQL 2008 Query

+0

mais le schéma par défaut pour cet utilisateur est John! Je vérifie juste encore. – Putnik

1

Dans SQL Server> Base de données> Votre nom de base de données> Sécurité> Schemas

Sélectionnez dbo Schemas> propriétés> Sélectionnez Autorisation>

Dans cette trouvaille "Les utilisateurs et le rôle" section

Ajoutez votre connexion Le nom d'utilisateur et la permission pour le nom d'utilisateur donnent la coche sur Execute.

0

Nous avons découvert aujourd'hui que, si vous modifiez les autorisations de vos utilisateurs en tant qu'administrateur système sur SQL Server, même si vous avez spécifié le schéma par défaut de votre utilisateur dans la base de données, le schéma par défaut est ignoré. 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'utilisateur connecté, il exécute la procédure stockée en utilisant le schéma par défaut défini pour cette base de données pour l'utilisateur, si vous ne spécifiez aucun nom de schéma dans votre commande EXEC.

Questions connexes