2010-03-03 13 views
6

Sto scrivendo uno script che dovrebbe girare intorno a un gruppo di server e selezionare un sacco di dati da loro, incluso il server locale. L'SQL necessario per SELEZIONARE i dati di cui ho bisogno è piuttosto complicato, quindi sto scrivendo una sorta di vista ad hoc e usando un'istruzione OPENQUERY per ottenere i dati, così alla fine finirò il ciclo su una dichiarazione come questa:Perché utilizzare OPENQUERY su un server locale è negativo?

exec('INSERT INTO tabl SELECT * FROM OPENQUERY(@Server, @AdHocView)') 

Tuttavia, ho sentito che l'utilizzo di OPENQUERY sul server locale è disapprovato. Qualcuno potrebbe spiegare perché?

+0

Questo è uno script adminstirativo, quindi non sono preoccupato per le autorizzazioni. La mia domanda, in particolare, è che ci sono preoccupazioni quando lo script scorre su un elenco di server e viene eseguito nel proprio nome server? Questo di solito genera un errore, server non configurato per l'accesso ai dati, che può essere corretto da EXEC sp_serveroption 'LocalServer', 'DATA ACCESS', TRUE – Dlongnecker

+0

controllare [server collegati] (http://msdn.microsoft.com/it/ us/library/ms188279.aspx) – Andrey

risposta

6
  • Sebbene la query possa restituire più set di risultati, OPENQUERY restituisce solo il primo.
  • OPENQUERY non accetta variabili per i suoi argomenti.
  • OPENQUERY non può essere utilizzato per eseguire stored procedure estese su un server collegato. Tuttavia, è possibile eseguire una stored procedure estesa su un server collegato utilizzando un nome composto da quattro parti.
  • Se la stored procedure sp_addlinkedserver viene utilizzato entro stesso script, le credenziali utilizzate sul server remoto sono fissi nello script, visibile a chiunque abbia una copia

Riferimento:

+0

Mi è capitato di avere l'occasione di usare 'OPENQUERY' l'altro giorno e ho capito che il tuo 4 ° punto non era corretto; 'OPENQUERY' funziona su un server collegato in modo che nessuna credenziale sia hardcoded. Potresti pensare a "OPENROWSET". – Aaronaught

+0

@Angelo: Se esiste un'istanza del server collegato, perché utilizzare OPENQUERY? Se la procedura memorizzata 'sp_addlinkedserver' viene utilizzata all'interno dello stesso script, il mio punto ha il merito. –

+1

Bene, dal momento che hai chiesto, in realtà c'è un motivo per usare 'OPENQUERY': Performance. 'OPENQUERY' consente di elaborare la query sul server remoto, mentre la denominazione in 4 parti standard deve copiare tutte le righe sul server locale, il che è piuttosto negativo per i set di dati di grandi dimensioni. Naturalmente questo deve essere valutato rispetto agli altri trade-off che hai menzionato. – Aaronaught

2

In aggiunta a quanto detto da @OMG Ponies, è semplicemente inutile. Non c'è motivo di introdurre una query ad-hoc e una semantica della transazione distribuita quando non è necessario. Quando si utilizza OPENQUERY, si adottano tutti gli aspetti negativi di SQL dinamico, inclusi i piani meno prevedibili e l'impossibilità del server di tenere traccia delle dipendenze in modo accurato.

OPENQUERY richiede inoltre che l'utente locale disponga delle autorizzazioni per il server di destinazione, che probabilmente non è ciò che si desidera a meno che non si tratti di uno script amministrativo. Non ci si può aspettare che ogni utente di un database abbia le stesse autorizzazioni per ogni altro database.

2

Solo un follow-up.

OpenQuery è buono quando è necessario confrontare o manipolare alcuni set di righe da stored procedure.

per esempio se si deve confrontare i risultati di due server (test e server rollout) durante la migrazione da SQL Server 2005 al SQL Server 2008 per esempio, allora si può fare la seguente query:

select * into test_table from OpenQuery(testServer, 'exec testdb.dbo.test_sp'); 
select * into rollout_table from OpenQuery(rolloutServer, 'exec testdb.dbo.test_sp'); 

select * from test_table 
except 
select * from rollout_table; 

select * from rollout_table 
except 
select * from test_table; 

per vedere eventuali discrepanze.

Problemi correlati