ho incontrato lo stesso errore durante l'utilizzo di Server Management Objects (SMO) in vb.net (io sono sicuro che sia la lo stesso in C#)
Il commento di Joe sul post iniziale è stato un utile avvertimento che nell'hosting condiviso stanno accadendo molte cose aggiuntive. Ci è voluto un po 'di tempo per capire, ma il codice qui sotto mostra come si deve essere molto specifici nel modo in cui accedono ai database SQL. L'errore "server principal ..." sembrava apparire ogni volta che le chiamate SMO non erano precisamente specifiche nell'ambiente di hosting condiviso.
Questa prima sezione di codice era contro un server SQL Express locale e si basava su una semplice autenticazione di Windows. Tutto il codice utilizzato in questi campioni sono basati su tutorial SMO da Robert Kanasz in questo Code Project website article:
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 trova sopra i file con estensione mdf per ogni database sul server SQLEXPRESS locale proprio bene perché l'autenticazione viene gestita da Windows ed è ampio su tutti i database.
Nel seguente codice sono presenti 2 sezioni che iterano per i file .mdf. In questo caso, solo la prima iterazione alla ricerca di un filegroup funziona e trova solo un singolo file perché la connessione riguarda solo un singolo database nell'ambiente di hosting condiviso.
la seconda iterazione, che è una copia di iterazione che ha lavorato sopra, soffoca immediatamente perché il modo in cui è scritto che tenta di accedere al primo database nell'ambiente condiviso, che non è quello a cui l'ID utente/Applica la 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 questa seconda iterazione del ciclo, il codice compila bene, ma perché SMO non era impostata per accedere proprio database corretto con la sintassi preciso, questo tentativo fallisce.
Mentre sto imparando SMO ho pensato che altri neofiti potrebbero apprezzare sapere che c'è anche una spiegazione più semplice di questo errore - abbiamo semplicemente sbagliato.
"Provider di servizi di hosting"? Stiamo parlando dedicato o condiviso? Se si tratta di un server di hosting condiviso, ti consiglio vivamente di contattare il tuo provider di hosting per assistenza. SQL in un ambiente di hosting condiviso è notoriamente bacato e problematico. Non ha nulla a che fare con il prodotto, ma le politiche che i provider di hosting applicano ai server. Ogni società di hosting ha il proprio modo di sfruttare SQL o così sembra. –