Linked Server ... solo in lettura?

venerdì 22 giugno 2007 - 11.47

TomClancy Profilo | Junior Member

Se creo un linked server del tipo

sp_addlinkedserver @server = 'link_vSync' , @srvproduct = ' ', @provider = 'SQLOLEDB', @datasrc = " + RemoteSQLServerName + ", @location = RemoteNameComputer , @provstr = NULL, @catalog = N"RemoteSQLDBName"

e poi faccio il login... con sp_addlinkedsrvlogin ... tutto è ok a patto che sul server remoto mi limiti a fare delle select.

Update e soprattutto create nuove tabelle sembra impossibile...

ad esempio con una cosa banale del tipo

SELECT * INTO <nomelinkedserver>.<nomedb>.dbo.<nuovatabella> FROM <tabellalocaledacopiare>

non funziona ed oltretutto l'errore che ritorna è fuorviante... del tipo

The object name <linkedserver>.<nomedb>.dbo. contains more than the maximum number of prefixes. The maximum is 2.

??? qualcuno si è già scontrato con tutto questo?

lbenaglia Profilo | Guru

>non funziona ed oltretutto l'errore che ritorna è fuorviante...
>del tipo
>
>The object name <linkedserver>.<nomedb>.dbo. contains
>more than the maximum number of prefixes.
>The maximum is 2.
>
>??? qualcuno si è già scontrato con tutto questo?

Ciao TomClancy,

l'errore non è fuorviante, ma ti segnala che la clausola into prevede al massimo lo schema e la tabella di destinazione, quindi non puoi specificare né un database diverso da quello corrente, né un server remoto.

Per risolvere il problema ti propongo due soluzioni:

1) Inverti la situazione attuale, ovvero salendo sull'istanza remota e definendo un linked server a quella locale; in questo modo puoi ricorrere al four-part name nella clausola FROM:

SELECT col1,..., coln INTO dbo.TabellaDiDestinazione FROM linkedserver.database.dbo.TabellaDiOrigine;

2) Crei la tabella sul server remoto con il comando CREATE TABLE e successivamente la andrai a popolare con un comando di INSERT:

INSERT linkedserver.database.dbo.TabellaDiDestinazione SELECT col1,..., coln FROM dbo.TabellaDiOrigine;

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

TomClancy Profilo | Junior Member

Ciao lbenaglia , in linea di principio volevo evitare di 'salire' sul server remoto, e quindi preferirei la seconda soluzione.

Il create table lanciato da locale sul server remoto da lo stesso problema...

però ho trovato una soluzione...


exec <linkedserver>.<database>.dbo.sp_executesql N'create table dbo.testtable ( col1 char(10) )'


.... dimenticavo ... magari può essere utile ad altri.... è necessario abilitare l'rpc

use master exec sp_serveroption 'linkedserver' , 'rpc' , 'on' exec sp_serveroption 'linkedserver' , 'rpc out' , 'on'

lbenaglia Profilo | Guru

>Il create table lanciato da locale sul server remoto da lo stesso
>problema...
Si, davo per scontato che la tabella l'avresti definita una tantum collegandoti al server remoto (dato che le credenziali ovviamente le hai avendo definito il linked server ).

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

TomClancy Profilo | Junior Member

Caspitericchio.... scopro solo ora che i vari...


BEGIN TRAN ROLLBACK TRAN COMMIT TRAN

sembra non siano disponibili con il linked server... o meglio sembra che sia il driver a non farcela...


mi ritorna:....

The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction. OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d01c].

lbenaglia Profilo | Guru

>Caspitericchio.... scopro solo ora che i vari...
>
>
>BEGIN TRAN
>ROLLBACK TRAN
>COMMIT TRAN
>
>sembra non siano disponibili con il linked server... o meglio
>sembra che sia il driver a non farcela...

Se hai la necessità di eseguire transazioni distribuite, utilizza il comando BEGIN DISTRIBUTED TRANSACTION per aprire una nuova transazione, assicurandoti che il servizio Microsoft Distributed Transaction Coordinator sia avviato su entrambi i server.

Leggi il seguente paragrafo sui Books Online:

"Distributed Transactions (Database Engine)"
http://msdn2.microsoft.com/en-us/library/ms191440.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

TomClancy Profilo | Junior Member

Grazie mille per la risposta!

In effetti questa parte la conosco poco...

Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5