vb.netでサーバー管理オブジェクト(SMO)を使用しているときに同じエラーが発生しました(C#でも同じです)
最初の投稿に関するTechie Joeのコメントは、共有ホスティングで多くの追加のことが行われているという有益な警告でした。少し時間がかかりましたが、以下のコードは、SQLデータベースへのアクセス方法を非常に具体的にする必要があることを示しています。「サーバープリンシパル...」エラーは、SMO呼び出しが共有ホスティング環境で正確に特定されていない場合に必ず表示されるように見えました。
このコードの最初のセクションはローカルSQL Expressサーバーに対するものであり、単純なWindows認証に依存していました。これらのサンプルで使用されているすべてのコードは、このコードプロジェクトのWebサイトの記事の Robert KanaszによるSMOチュートリアルに基づいています。
Dim conn2 = New ServerConnection()
conn2.ServerInstance = "<local pc name>\SQLEXPRESS"
Try
Dim testConnection As New Server(conn2)
Debug.WriteLine("Server: " + testConnection.Name)
Debug.WriteLine("Edition: " + testConnection.Information.Edition)
Debug.WriteLine(" ")
For Each db2 As Database In testConnection.Databases
Debug.Write(db2.Name & " - ")
For Each fg As FileGroup In db2.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
Next
conn2.Disconnect()
Catch err As Exception
Debug.WriteLine(err.Message)
End Try
上記のコードは、ローカルのSQLEXPRESSサーバー上のすべてのデータベースの.mdfファイルを問題なく検出します。これは、認証がWindowsによって処理され、すべてのデータベースにまたがるためです。
次のコードには、.mdfファイルを反復する2つのセクションがあります。この場合、ファイルグループを探す最初の反復のみが機能し、接続は共有ホスティング環境の単一のデータベースにのみ接続されるため、単一のファイルのみが検出されます。
上記のように機能した反復のコピーである2番目の反復は、ユーザーID /パスワードが適用される共有環境ではない共有環境の最初のデータベースにアクセスしようとするため、すぐにチョークされます。 SQLサーバーは、「サーバープリンシパル...」エラーの形式で認証エラーを返します。
Dim sqlConnection1 As New System.Data.SqlClient.SqlConnection
sqlConnection1.ConnectionString = "connection string with User ID/Password to a specific database in a shared hosting system. This string will likely also include the Data Source and Initial Catalog parameters"
Dim conn1 As New ServerConnection(sqlConnection1)
Try
Dim testConnection As New Server(conn1)
Debug.WriteLine("Server: " + testConnection.Name)
Debug.WriteLine("Edition: " + testConnection.Information.Edition)
Debug.WriteLine(" ")
Dim db2 = testConnection.Databases("the name of the database to which the User ID/Password in the connection string applies")
For Each fg As FileGroup In db2.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
For Each db3 As Database In testConnection.Databases
Debug.Write(db3.Name & " - ")
For Each fg As FileGroup In db3.FileGroups
Debug.Write(fg.Name & " - ")
For Each df As DataFile In fg.Files
Debug.WriteLine(df.Name + " - " + df.FileName)
Next
Next
Next
conn1.Disconnect()
Catch err As Exception
Debug.WriteLine(err.Message)
End Try
その2番目の反復ループではコードは正常にコンパイルされますが、SMOは正確な構文で正確なデータベースに正確にアクセスするように設定されていなかったため、失敗しました。
私はSMOを学習しているだけなので、他の初心者にもこのエラーの簡単な説明があることを知っていただければ幸いです。