Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Blog Technique de Romelard Fabrice

Les dernières Actualités de Romelard Fabrice (Alias fabrice69 ou F___) principalement autour des technologies Microsoft

Actualités

  • Toutes les actualités et informations sur les technologies Microsoft principalement autour de .NET et SQL Server
SQL Server : Problème avec les serveurs liés ORACLE

SQL Server 2005     ORACLE

Ce bug se rencontre avec une installation de serveur SQL Server 2005 dans une configuration en serveur lié sur un ORACLE.

Les drivers ORACLE OLEDB sont ceux de la version 10G, une fois le serveur lié paramétré avec un script comme celui qui suit (ou graphiquement) :

 


 

CREATION LINKED SERVER :
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver @server = N'LINK_ORACLE_OLEDB', @srvproduct=N'TNSName', @provider=N'OraOLEDB.Oracle', @datasrc=N'TNSName', @provstr=N'TNSName'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'collation compatible', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'data access', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'rpc', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'rpc out', @optvalue=N'false'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'connect timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'collation name', @optvalue=null
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'query timeout', @optvalue=N'0'
GO
EXEC master.dbo.sp_serveroption @server=N'LINK_ORACLE_OLEDB', @optname=N'use remote collation', @optvalue=N'true'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LINK_ORACLE_OLEDB', @locallogin = N'sa', @useself = N'True'
GO
USE [master]
GO
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LINK_ORACLE_OLEDB', @locallogin = NULL , @useself = N'False', @rmtuser = N'LoginOracle', @rmtpassword = N'*****'
GO

 


 

 Cette création ne pose pas de problème et on peut alors exécuter un script tel que le suivant :

SELECT * FROM OPENQUERY(LINK_ORACLE_OLEDB, 'SELECT * FROM TABLE_A_TESTER');

Le résultat de cette exécution est différent suivant 2 cas précis :

  • Nombre de résultats inférieur à 99
  • Nombre de résultats supérieur à 99

Dans le premier cas, on obtient la liste des valeurs sans message d'erreur.

Dans le second cas, on obtient les colonnes des résultats et la première ligne, puis une erreur comme la suivante :

Erreur Message :
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "LINK_ORACLE_OLEDB" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7330, Level 16, State 2, Line 1
Cannot fetch a row from OLE DB provider "OraOLEDB.Oracle" for linked server "LINK_ORACLE_OLEDB".

 


 

Après de nombreuses recherches et différents tests pour comprendre l'origine de cette limite à 100 items, mon collègue DBA ORACLE (merci encore Pierre) a trouvé une piste sur un forum ORACLE, concernant une clé de registre à modifier.

Cette clé se trouve dans :

  • [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1\OLEDB] 

Il s'agit de la clé : FetchSize

Sa valeur par défaut est de 100, il suffit alors de la passer à 101 et tout refonctionne correctement, pour toutes les requêtes liées.

Voila donc un exemple de l'extraction de la clé modifiée :

[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1\OLEDB]
"CacheType"="Memory"
"ChunkSize"="100"
"DistribTX"="1"
"FetchSize"="101"
"OSAuthent"="0"
"PLSQLRset"="0"
"PwdChgDlg"="1"
"SchRstLng"="10000"
"UserDefFn"="0"
"DisableRetClause"="1"
"VCharNull"="1"
"TraceCategory"="0"
"TraceFileName"="c:\\OraOLEDB.trc"
"TraceLevel"="0"
"TraceOption"="0"
"SPPrmDefVal"="0"

 


 

Vous pouvez trouver plus d'information sur ce paramètre à l'adresse suivante :

 

Tout fonctionne maintenant correctement et l'utilisateur peut profiter de la puissance de SQL Server 2005 et de ORACLE dans le requêtes croisées avec jointure via les serveurs liés.

Romelard Fabrice

 

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Posted: vendredi 14 avril 2006 00:04 par ROMELARD Fabrice
Classé sous : ,

Commentaires

Arnaud CLERET a dit :

C'est article est plus qu'intéressant ! Je l'avais d'ailleurs lu dans tes contributions sur le newsgroup SQL Server. :)

Si je comprends bien la problématique, Oracle fait un fetch sur les 100 premières lignes par défaut et là tu passes la valeur à 101 pour résoudre ton erreur ce qui normalement indique de fetcher sur les 101 premières lignes.
Est ce que tu retombes sur les mêmes problématiques avec des volumes de données plus importants ?
Ou est-ce que cette valeur 101 est valable pour tous les volumes de données ?

Dans l'article que tu as mis en référence, rien ne précise cette valeur 101, il est juste indiquer les valeurs valides (1 à 429 496 296) et l'impact potentiel sur les performances lors de la modification de la valeur du fetch.

Dans tous les cas merci pour cette contribution.
# avril 14, 2006 18:17

ROMELARD Fabrice a dit :

Bonjour,

La modification a été faite de façon empirique une fois le problème trouvé.
Nous avons alors recherché la correspondance entre ce champs et le comportement rencontré avec Pierre.
Nous avons donc testé différentes valeurs et la valeur la plus proche de celle d'origine a été préférée afin de ne pas tomber dans des effets de bords qui pourraient survenir.

Le 101 nous a permis de valider la valeur sur un ensemble de requêtes différentes (dont certaines retournant plus de 2 millions de lignes).
Aucune n'ayant planté, nous avons concervé cette valeur

La modification va être utilisée avec le temps, mais elle a permis de solutionné un choix technique (migration de 2000 vers 2005).

Bref, cette modification a été conservé pour valider dans le temps.

Romelard Fabrice
# avril 14, 2006 21:40

Arnaud CLERET a dit :

Merci pour cette précision.
# avril 14, 2006 23:12
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Conversion de fichiers RAW en fichier JPEG avec WPF par Perspective le il y a 26 minutes

- [WPF] XPSReader v0.2 par Blog Technique d'Audrey PETIT le il y a 2 heures et 11 minutes

- Entity Framework : providers Oracle, MySQL et PostgreSQL par Matthieu MEZIL le il y a 8 heures et 46 minutes

- [WPF] Nouvel article sur c2i.fr par Richard Clark le 09-06-2008, 17:33

- F# nouvelle CTP 1.9.6.2 (update) par Pierrick's Blog le 09-06-2008, 13:27

- La suite ...Proposition de collaboration rédactionnelle entre les communautés de développeurs et Microsoft France par LucasR le 09-05-2008, 17:45

- [Fun] Votre simulateur de vol avec Microsoft ESP par Julien Chable le 09-05-2008, 12:02

- [Best Practices] Customisation du My Site : Comment le modifier en amont et en aval par The Mit's Blog le 09-05-2008, 10:47

- Patrick Tisseghem s'en est allé ... par The Mit's Blog le 09-05-2008, 10:04

- MS AutoCollage par alex# le 09-05-2008, 09:18