Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Probleme MSADORA

2 réponses
Avatar
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

2 réponses

Avatar
Fred BROUARD
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 ***********************
Avatar
Brigitte
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 ***********************