Domanda

Sto provando a provare una prova del concetto che posso eseguire una transazione distribuita su due server SQL collegati, collegati usando sp_addlinkedserver - i loro nomi sono Server1 e Server2, entrambi in esecuzione in istanze predefinite. Ogni server contiene un singolo database, rispettivamente Origine e Destinazione e il database di destinazione contiene una singola tabella denominata Output, ovvero

Server1.Source
Server2.Destination.Output

La tabella OUTPUT ha la seguente struttura:

OUT_PKEY int identity(1,1) primary key,
OUT_TEXT nvarchar(255)

Da Server1 ho chiamato sp_addlinkedserver 'Server2' per collegare i due database e ho tentato di eseguire la seguente query per verificare che il collegamento effettivamente funzioni:

Select   *
From     Server2.Destination.dbo.Output

Sono stata restituita la seguente eccezione:

  

L'accesso al server remoto è negato perché non esiste alcuna mappatura di accesso.

Abbastanza giusto, quindi dal Server1, eseguo sp_addlinkedsrvlogin 'Server2' che secondo la documentazione dice che dovrebbe prendere le credenziali dell'utente di chiunque esegue la query da remoto (cioè dal Server1) e applicare quelle credenziali per Server2. Ciò implica che, poiché sono connesso a Server1 tramite l'autenticazione di Windows, ciò dovrebbe significare che le mie credenziali di Windows vengono applicate anche a Server2.

Ora il messaggio di eccezione cambia in:

  

Accesso non riuscito per l'utente "NT AUTHORITY \ ANONYMOUS LOGON".

Avendo cercato su Google questa eccezione, non ho trovato nulla di utile che mi abbia indicato la giusta direzione. Cosa mi sto perdendo? Mi aspetto che [se l'accesso non riesce affatto] l'eccezione fa riferimento a mie credenziali di Windows, non le credenziali di accesso anonime.

Sembra che quando avrò funzionato il collegamento stesso, le transazioni distribuite stesse dovrebbero essere un affare abbastanza semplice - la documentazione implica che devo solo assicurarmi che il servizio DTC sia in esecuzione su Server1 e che qualsiasi query venga eseguita su Server1 che verrà eseguito attraverso il collegamento:

  • Includi SET XACT_ABORT ON prima di inizializzare la mia transazione distribuita
  • Uso INIZIA TRANSAZIONE DISTRIBUITA invece di INIZIA TRANSAZIONE
  • Se desidero fare riferimento a un'istanza non predefinita di SQL Server su Server2, sostituisco qualsiasi istanza del nome Server2 nella mia query con [Server2 \ Nome_istanza]

Le mie domande sono queste:

  • come posso superare questo problema di accesso? La sp_addlinkedsrvlogin da sola non sembra fare il trucco.
  • È davvero semplice eseguire la transazione distribuita come implica la documentazione?

TIA

È stato utile?

Soluzione

Se ti trovi in ??un dominio, l'impostazione dovrebbe essere " Effettuare utilizzando il contesto di sicurezza corrente dell'account di accesso " ;, ma c'è ancora un passaggio: è necessario concedere un SPN a ciascuno dei server coinvolti nella transazione.

Supponendo che tu stia eseguendo i Servizi SQL su entrambi i server come utente di dominio (cosa che devi fare per far funzionare questo - LocalSystem non lo farà), ecco le istruzioni che ti serviranno:

http://technet.microsoft.com/en-us/library /bb735885.aspx

Ricorda che l'utente avrà bisogno di un SPN per entrambi i server, ma non del client - ad esempio, se passi dal client - > server1 - > server2, l'account del servizio SQL avrà bisogno di un nome SPN sia per server1 che per server2.

Se sei confuso (è un processo confuso), pubblica un commento e chiarirò le istruzioni.

Altri suggerimenti

Supponendo che questi server si trovino entrambi sullo stesso dominio - hai abilitato la delega attendibile per consentire al tuo server di passare le credenziali al server di destinazione? Dovresti estrarre l'oggetto Active Directory per il server e andare alla scheda Delega e selezionare " Affidare questo computer per la delega solo ai servizi specificati " e quindi immettere i dettagli di SQL Server che il server può trasferire le credenziali a:

Tipo di servizio = MSSQLSvc
Utente / Computer = YourTargetServer.Your.Domain
Porta = 1433

Purtroppo, molti di questi tipi di problemi di autenticazione con server collegati richiedono un riavvio per avere piena efficacia (quindi se si tratta di server di produzione è difficile risolvere i problemi durante il giorno).

Per quanto riguarda le transazioni distribuite, se alla fine la connessione al server collegato è attiva e funzionante correttamente, le transazioni distribuite funzionano alla grande. Anche se la prossima cosa che probabilmente ti imbatterai quando riuscirai a farlo funzionare è trovare il enorme difetto che non puoi usare qualsiasi forma di SCOPE_IDENTITY (), @@ IDENTITY, ecc. Per recuperare le chiavi primarie dopo aver inserito qualcosa in un database collegato. Ma questo è un altro problema con le sue soluzioni alternative divertenti ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top