Recentemente ho avuto l’occasione di svolgere alcune attività per la migrazione di un server presso uno dei nostri clienti; più precisamente è stato sostituito il server che ospitava il software di gestione del magazzino automatico e la relativa istanza SQL Server 2000.
Come avviene di solito in queste situazioni, non appena il nuovo server è on-line, prima del passaggio in produzione, tutte le persone interessate verificano la propria area di competenza… io mi sono occupato di verificare la comunicazione e i collegamenti tra la nuova istanza SQL Server 2008 Enterprise x64 e l’istanza SQL Server 2000 (x86) in funzione su un altro server di produzione, quello che ospita l’installazione del sistema ERP.
Uno dei linked server migrati dalla vecchia istanza SQL 2000 alla nuova istanza SQL 2008 Enterprise x64 non riusciva più a raggiungere il server linkato: ovvero l’istanza SQL 2000 (x86) del sistema ERP.
La query di test, riportata di seguito, non poteva essere eseguita:
Questo il messaggio di errore:
OLE DB provider “SQLNCLI10” for linked server “<Linked_Srv_Name>” returned message ” Unspecified error.”.
OLE DB provider “SQLNCLI10” for linked server “<Linked_Srv_Name>” returned message ” Cannot find the stored procedures necessary to complete this operation. Contact your system administrator.”.
Message 7311, level 16, state 2, row 1 Cannot obtain the schema rowset “DBSCHEMA_TABLES_INFO” for OLE DB provider “SQLNCLI10” for linked server “<Linked_Srv_Name>”. The provider supports the interface, but returns a failure code when it is used.
Il problema è noto e Microsoft descrive la soluzione in quest’articolo della KB:
http://support.microsoft.com/kb/906954/en-us
Riassumendo, l’articolo consiglia di eseguire manualmente lo script Instcat.sql sull’istanza puntata dal linked server, nel mio scenario sull’istanza SQL Server 2000 (x86) del sistema ERP in produzione!! Lo script Instcat.sql è incluso nelle cartelle d’installazione di SQL Server 2000 SP3 o SP4.
Contento di aver trovato la soluzione, ma al tempo stesso preoccupato per eventuali side-effect che potessero insorgere durante l’esecuzione dello script (il cliente rappresenta una delle nostre installazioni più critiche). Per maggior sicurezza ho voluto riprodurre l’errore in ambiente di test sul quale ho anche eseguito, senza problemi, lo script Instcat.sql.
Parallelamente, però, non ho smesso di cercare soluzioni alternative; di fatto, l’unica anomalia che avevo riscontrato era questo errore sul linked server…
Volete sapere com’è andata a finire?
Ho provato e applicato in produzione la soluzione descritta da Roman Rehak in questo post:
Issue with 64-bit SQL Server using SQL 2000 linked server
Alcune volte (e per fortuna che è così) la soluzione è più semplice di quanto immaginiamo, basta solo trovarla.