Probleme MSADORA

Le
Brigitte
Bonjour,

Lorsque j'execute ce code depuis SQL Query Analyser afin de mettre à jour
une table Sophis, tout fonctionne correctement.

declare @idemmission int
declare @sql nvarchar(2000)
declare @sph_usr nvarchar(50)
declare @sph_pwd nvarchar(50)
declare @sph_db nvarchar(50)
declare @isin_new varchar(12)
declare @isin_old varchar(12)

set @sph_usr = 'derives'
set @sph_pwd = 'casanis'
set @sph_db = 'devrisk1'

set @idemmission = 3208
set @isin_new = 'XS0000000007'

set @sql = 'update OPENROWSET(''MSDAORA'',''' + @sph_db + '''; '''
+ @sph_usr + '''; ''' + @sph_pwd + ''', ''select * from
hsbc_pims_to_sophis_rapro where idemmission = ' + cast(@idemmission as
varchar)+''') set codeisin = ''' + @isin_new + ''''

exec sp_executesql @sql


Par contre, lorsque je tente la même mise à jour depuis un trigger, alors
j'obtiens l'erreur suivante:

Server: Msg 7391, Level 16, State 1, Procedure TR_UPD_TEST, Line 34
The operation could not be performed because the OLE DB provider 'MSDAORA'
was unable to begin a distributed transaction.
OLE DB error trace [OLE/DB Provider 'MSDAORA'
ITransactionJoin::JoinTransaction returned 0x8004d01b].

Connaissez vous ce problème et le moyen de le contourner?

Merci

Brigitte
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fred BROUARD
Le #11857931
Brigitte a écrit :
Bonjour,

Lorsque j'execute ce code depuis SQL Query Analyser afin de mettre à jour
une table Sophis, tout fonctionne correctement.

declare @idemmission int
declare @sql nvarchar(2000)
declare @sph_usr nvarchar(50)
declare @sph_pwd nvarchar(50)
declare @sph_db nvarchar(50)
declare @isin_new varchar(12)
declare @isin_old varchar(12)

set @sph_usr = 'derives'
set @sph_pwd = 'casanis'
set @sph_db = 'devrisk1'

set @idemmission = 3208
set @isin_new = 'XS0000000007'

set @sql = 'update OPENROWSET(''MSDAORA'',''' + @sph_db + '''; '''
+ @sph_usr + '''; ''' + @sph_pwd + ''', ''select * from
hsbc_pims_to_sophis_rapro where idemmission = ' + cast(@idemmission as
varchar)+''') set codeisin = ''' + @isin_new + ''''

exec sp_executesql @sql


Par contre, lorsque je tente la même mise à jour depuis un trigger, alors
j'obtiens l'erreur suivante:

Server: Msg 7391, Level 16, State 1, Procedure TR_UPD_TEST, Line 34
The operation could not be performed because the OLE DB provider 'MSDAORA'
was unable to begin a distributed transaction.
OLE DB error trace [OLE/DB Provider 'MSDAORA'
ITransactionJoin::JoinTransaction returned 0x8004d01b].

Connaissez vous ce problème et le moyen de le contourner?



Comprenez que le code que vous mettez dans un trigger participe de la
transaction qui l'a initiée.
Comme vous faites appels à un serveur distant depuis un serveur local,
il vous faut démarrer une transaction distribuée.

Initiez votre transaction par
BEGIN DISTRIBUTED TRANSACTION
Vérifiez que vos services MSDTC soient activés sur tous les serveurs.

Si vous ne voulez pas une transaction distribuée, dans le cas ou le code
du trigger n'a pas besoin de participer à la transaction, alors vous
pouvez lancez un COMMIT en début de code.

A +



Merci

Brigitte





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Brigitte
Le #11857831
Merci

"Fred BROUARD" a écrit :

Brigitte a écrit :
> Bonjour,
>
> Lorsque j'execute ce code depuis SQL Query Analyser afin de mettre à jour
> une table Sophis, tout fonctionne correctement.
>
> declare @idemmission int
> declare @sql nvarchar(2000)
> declare @sph_usr nvarchar(50)
> declare @sph_pwd nvarchar(50)
> declare @sph_db nvarchar(50)
> declare @isin_new varchar(12)
> declare @isin_old varchar(12)
>
> set @sph_usr = 'derives'
> set @sph_pwd = 'casanis'
> set @sph_db = 'devrisk1'
>
> set @idemmission = 3208
> set @isin_new = 'XS0000000007'
>
> set @sql = 'update OPENROWSET(''MSDAORA'',''' + @sph_db + '''; '''
> + @sph_usr + '''; ''' + @sph_pwd + ''', ''select * from
> hsbc_pims_to_sophis_rapro where idemmission = ' + cast(@idemmission as
> varchar)+''') set codeisin = ''' + @isin_new + ''''
>
> exec sp_executesql @sql
>
>
> Par contre, lorsque je tente la même mise à jour depuis un trigger, alors
> j'obtiens l'erreur suivante:
>
> Server: Msg 7391, Level 16, State 1, Procedure TR_UPD_TEST, Line 34
> The operation could not be performed because the OLE DB provider 'MSDAORA'
> was unable to begin a distributed transaction.
> OLE DB error trace [OLE/DB Provider 'MSDAORA'
> ITransactionJoin::JoinTransaction returned 0x8004d01b].
>
> Connaissez vous ce problème et le moyen de le contourner?

Comprenez que le code que vous mettez dans un trigger participe de la
transaction qui l'a initiée.
Comme vous faites appels à un serveur distant depuis un serveur local,
il vous faut démarrer une transaction distribuée.

Initiez votre transaction par
BEGIN DISTRIBUTED TRANSACTION
Vérifiez que vos services MSDTC soient activés sur tous les serveurs.

Si vous ne voulez pas une transaction distribuée, dans le cas ou le code
du trigger n'a pas besoin de participer à la transaction, alors vous
pouvez lancez un COMMIT en début de code.

A +


>
> Merci
>
> Brigitte
>


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************



Publicité
Poster une réponse
Anonyme