Ciao Lorenzo,
ho provato a seguire i tuoi suggerimenti, ma ho un problema di aggiornamento che non riesco a capire.
Ho fatto la prova su una tabella più semplice, in cui il codice è comunque alfanumerico.
Questa è la situazione:
1. database collegato: DBEXT con provider MSDASQL
(il provider ha il parametro NonTransactedUpdates fissato a True)
2. tabella esterna DBEXT..port.zon
una VIEW ci consente di analizzare i dati presenti
CREATE VIEW [dbo].[WX_zone] AS SELECT * FROM DBEXT..port.zon
e ci consente di vedere le dimensioni dei campi sul sistema esterno
INSERT INTO [prova].[dbo].[WX_zone]
([zn_sigla]
,[zn_descrizione]
,[zn_ragg_1]
,[zn_ragg_2])
VALUES
(<zn_sigla, char(8),>
,<zn_descrizione, char(30),>
,<zn_ragg_1, char(3),>
,<zn_ragg_2, char(3),>)
3. tabella locale Zone, per il momento costruita in modo semplificato
CREATE TABLE [dbo].[Zone](
[codice] [char](10) NOT NULL,
[descrizione] [varchar](50) NOT NULL,
[codSE] [char](8) NULL,
CONSTRAINT [PK_Zone] PRIMARY KEY CLUSTERED ([codice] ASC) ON [PRIMARY]
) ON [PRIMARY]
si noti che la dimensione del codice è diversa.
4. ora, il trigger:
5. a questo punto, ho provato a inserire una riga sulla tabella Zone
codice descrizione codSE
123 zona di prova NULL
Il trigger scatta, ma ritorna un errore nella fase di inserimento:
Errore: 7390 Impossibile eseguire l'operazione richiesta perchè il provider OLE DB "MSDASQL" per il server collegato "DBEXT" non supporta l'interfaccia di transazione necessaria.
Questo errore in verità dovrebbe essere "gestito" proprio dal parametro NonTransactedUpdates, appunto volutamente modificato a True.
Peraltro, come controprova, dopo aver disabilitato il trigger, ho inserito a mano un elemento nella tabella e successivamente, da query interattiva, ho eseguito il seguente comando di INSERT (analogo al trigger):
DECLARE @codSE CHAR(8)
SET @codSE = CAST((SELECT codice FROM dbo.Zone) AS char(8))
INSERT INTO DBEXT..port.zon (zn_sigla, zn_descrizione, zn_ragg_1, zn_ragg_2)
SELECT CAST(@codse AS char(8)), CAST(I.descrizione AS char(30)), 'AUT', '' FROM dbo.Zone AS I
GO
In questo caso, tutto funziona correttamente (la risposta in esecuzione della query è "(Righe interessate: 1)" e una analisi dei dati tramite la vista WX_zone mi fa vedere il nuovo record inserito.
Dov'è l'inghippo?
Grazie fin d'ora per l'attenzione.
--
Alessandro Pisano