2009-01-15 14 views
6

Sto provando a verificare una proposta presentata da uno dei nostri fornitori per l'accesso al loro database di prodotti e riguarda le query e le transazioni che si estendono su più server. Non l'ho mai fatto direttamente nel database prima d'ora e per essere sincero, non ne ho la possibilità, quindi sto cercando di carpire una prova che questo funziona almeno concettualmente.Come posso utilizzare le transazioni che si estendono su catene concatenate su più server?

Ho due server SQL Server 2005. Prendiamolo per argomento chiamiamolo Server1 e Server2 [mantieni il tuo applauso] ciascuno contenente un database fittizio. Il database fittizio su Server1 si chiama Source e quello su Server2 è chiamato Destination, solo per mantenere le cose semplici. I database entrambe una sola tabella denominata rispettivamente di ingresso e di uscita, quindi la struttura è quasi spiegato in questo modo:

  • Server1.Source.dbo.Input
  • Server2.Destination.dbo.Output

Ho una procedura memorizzata su Server2 chiamata WriteDataToOutput che riceve un singolo argomento Varchar e scrive il suo contenuto nella tabella di output.

Ora la trickiness inizia:

  1. voglio creare una stored procedure su Server1.Source che chiama la stored procedure WriteDataToOutput definita su Server2, che sembra il semplice passo.
  2. Desidero che questa chiamata faccia parte di una transazione in modo che se la procedura che la richiama non riesce, l'intera transazione viene annullata.

E qui termina la mia conoscenza di cosa fare. Qualcuno può indicarmi la giusta direzione? Ho provato questo su due diversi database sullo stesso server, e ha funzionato bene, portandomi a pensare che funzionerà su server diversi, la domanda è: come faccio a fare una cosa del genere? Da dove comincio?

+0

+1 per la domanda ben scritta –

risposta

5

Come altri hanno notato, sono d'accordo che un server collegato è il modo migliore per andare.

Qui ci sono un paio di puntatori che mi ha portato a casa la prima volta che ho affrontato con i server collegati:

  • Se il server collegato è un'istanza, assicuratevi di bracketing il nome. Ad esempio [SERVERNAME \ INSTANCENAME].

  • Utilizzare un alias per la tabella o la vista dal server collegato o si otterrà un errore "identificatore di più parti non può essere associato". C'è un limite di una convenzione di denominazione in 4 parti. Ad esempio, SERVER.DATABASE.dbo.TABLE.FIELD ha cinque parti e darà un errore. Tuttavia, SELECT linked.FieldName FROM SERVER.DATABASE.dbo.TABLE AS linked funzionerà bene

+0

+1 Grazie per aver evidenziato le possibili insidie ​​e soluzioni – BenAlabaster

0

È necessario impostare un collegamento tra un server e l'altro.

3

per la fase 2 è necessario aver Distributed Transaction Coordinator in esecuzione, è inoltre necessario utilizzare SET XACT_ABORT ON per assicurarsi che sarà tutto rollback è inoltre necessario abilitare RPC che è disattivato per impostazione predefinita, nel 2005 e fino

C'è un sacco di cose che possono morderti nel collo

1

Utilizzando server collegati, è possibile eseguire stored procedure su entrambi i server all'interno di una singola transazione utilizzando DTC (Distributed Transactino Coordinator). Sicuramente vorrete fare qualche analisi delle prestazioni. Ho trovato che alcuni SP che utilizzano collegamenti possono rallentare drasticamente le prestazioni del database, specialmente se si tenta di unire i set di risultati da ciascuno dei due server.

+0

+1 Grazie per il consiglio, mi piacerebbe utilizzarlo per trasferire determinati dati finanziari da un database operativo a un database finanziario. Come tale, non ci sarebbe molto bisogno di cross cross join. – BenAlabaster

0

Configurare un server collegato, quindi si dovrebbe essere in grado di eseguire selezioni/inserimenti/aggiornamenti tra i server. Qualcosa di simile:

INSERT INTO Server2.Destination.dbo.Output 
SELECT * FROM Input 
WHERE <Criteria> 

Questo presuppone che si esegue la query da Server1.Source, quindi non si avrebbe bisogno di qualificare completamente.

+0

Chiamerei una stored procedure definita su Server2.Destination – BenAlabaster

+0

non dimenticare che desidera eseguire il rollback di tutto, quindi è necessario eseguire DTC, SET XACT_ABORT ON – SQLMenace

2

MSDN dice che si può avere le transazioni attraverso i server collegati se si utilizza il comando BEGIN Distributed Transaction.

Ricordo che avevo problemi chiamati una procedura memorizzata su un server collegato, ma ci ho lavorato intorno, invece di risolverlo.

Problemi correlati