Ho riscontrato lo stesso errore durante l'utilizzo di Server Management Objects (SMO) in vb.net (sono sicuro che sia lo stesso in C #)
Il commento di Techie Joe sul post iniziale è stato un utile avvertimento che nell'hosting condiviso stanno accadendo molte cose aggiuntive. Ci è voluto un po 'di tempo per capirlo, ma il codice seguente mostra come bisogna essere molto specifici nel modo in cui si accede ai database SQL. L'errore "server principal ..." sembrava comparire ogni volta che le chiamate SMO non erano precisamente specifiche nell'ambiente di hosting condiviso.
Questa prima sezione di codice era relativa a un server SQL Express locale e si basava su una semplice autenticazione di Windows. Tutto il codice utilizzato in questi esempi si basa sul tutorial SMO di Robert Kanasz in questo articolo del sito Web di Code Project :
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
Il codice sopra trova i file .mdf per ogni database sul server SQLEXPRESS locale correttamente perché l'autenticazione è gestita da Windows ed è ampia in tutti i database.
Nel codice seguente ci sono 2 sezioni che iterano per i file .mdf. In questo caso funziona solo la prima iterazione alla ricerca di un filegroup e trova solo un singolo file perché la connessione è a un solo database nell'ambiente di hosting condiviso.
La seconda iterazione, che è una copia dell'iterazione che ha funzionato sopra, si blocca immediatamente perché per come è scritta cerca di accedere al 1 ° database nell'ambiente condiviso, che non è quello a cui si applicano User ID / Password, quindi il server SQL restituisce un errore di autorizzazione sotto forma di errore "server principal ...".
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
In quel secondo ciclo di iterazione, il codice si compila bene, ma poiché SMO non è stato configurato per accedere esattamente al database corretto con la sintassi precisa, quel tentativo fallisce.
Dato che sto solo imparando SMO, ho pensato che altri neofiti potrebbero apprezzare il fatto che ci sia anche una spiegazione più semplice per questo errore: l'abbiamo semplicemente codificato in modo sbagliato.