Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[HowTo] accéder à un serveur SQL par le shell
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Tue Jun 07, 2005 5:06 pm    Post subject: [HowTo] accéder à un serveur SQL par le shell Reply with quote

Salut à tous, je me lance dans un petit HowTo, soyez indulgents c'est mon premier :) merci

HowTo : Acces à un serveur SQL par le shell par ODBC

Contexte
La connexion à une base de données (dans notre exemple : SQL2000 Microsoft dans un domaine Active Directory) depuis le Shell Linux n'est pas une mince affaire. Et bien que le principe semble simple, les réponses données sur la toile rivalisent d'imprécision...

Besoin
Se connecter en ligne de commande à n'importe quelle type de base de données, situé sur n'importe quelle plateforme et pouvoir aussi y envoyer une série de requêtes SQL situées par exemple dans un fichier texte. Nous ne voulons PAS d'interface graphique, on est des vrais nous :)

Bien sûr, ceci n'est peut-être pas un besoin commun mais sait-on jamais !

Principe de fonctionnement
Commencons par une explication détaillée du principe utilisé pour établir la connexion.

- Le driver (pilote)
Le premier aspect est celui du réseau. Afin d'établir une connexion à quelconque support, nous devons utiliser un protocole, pour le réseau par exemple c'est le TCP/IP. Le TCP est un protocole de niveau 4 - Transport (selon la pile OSI). L'IP quant à lui est un protocole de niveau 3 - Réseau. Pour fonctionner, le TCP se base donc sur l'IP, d'où une hiérarchisation des niveaux : TCP a un niveau supérieur à IP et IP à ethernet (niveau 2).

De manière analogue, le Shell Linux, pour se connecter à une base de données, utilise non pas un protocole mais un driver. Le driver peut s'interpréter comme un protocole de bas niveau fournissant un support de connexion primaire à une couche supérieure. Sans driver, pas de connexion possible (e.q sans IP, pas de connexion TCP)

- Couche applicative : isql
Une fois le driver déterminé et opérationnel, nous aurons besoin d'une application permettant d'envoyer des requêtes au serveur SQL. Cette couche applicative utilisera le service offert par le driver pour se connecter et envoyer ses requêtes.

L'application que nous utiliserons fournira la commande 'isql' qui accepte en entrée un fichier contenant à chaque ligne une requête. Nous pourrons donc facilement scripter dynamiquement des requêtes SQL et les envoyer.

Installation
Tout d'abord on installe le driver (freeTDS) avec les USE odbc et mssql :
Code:

echo "dev-db/freetds mssql odbc" >>/etc/portage/package.use
emerge freetds -av


Ensuite on installe notre couche applicative (unixODBC) :
Code:
emerge unixODBC -av


Configuration
FreeTDS
- Fichier : /etc/freetds.conf

Ce fichier définit les serveurs pouvant être appelés par une couche supérieure et la manière de s'y connecter. Laissez les premiers paramètres du fichier. Le nom entre crochet servira de lien entre les niveaux. Y préciser le port, l'adresse IP (host), la version du driver TDS. Laisser le 'try domain login' à 'no' et 'try server login' à 'yes'. Le domain login l'emporterait sur le server login. Or si votre serveur Linux n'est pas déclaré dans le contrôleur primaire de domaine Windows, la connexion sera tout simplement ignorée...

Exemple de fin de fichier freetds.conf :
Code:

[MonSQL2000]
host = 192.168.0.30
port = 1433
tds version = 8.0
try domain login = no
try server login = yes


Conseil :
A ce stade de la configuration, il est plus qu'utile de vérifier le bon fonctionnement du driver. Cela nous permettra entre autre de situer le problème en cas d'échec de connexion.
FreeTDS offre un utilitaire de test de connexion nommé 'tsql' permettant de vérifier le bon fonctionnement du driver. Après avoir configuré FreeTDS, lancez un terminal.
Exécutez alors la commande 'tsql -S <nom du serveur dans freetds.conf> -U <user> -P <password>'
La connexion devrait normalement fonctionner. Un simple 'quit' permet de sortir de l'invite de commande SQL.

NB : Il est à noter que pour la connexion à un serveur SQL2000 utilisant les identifiants Windows, vous devez spécifier un nom d'utilisateur de type <domaine>\\<user>.

unixODBC
- Fichier : /etc/unixODBC/odbc.ini
- Fichier : /etc/unixODBC/odbcinst.ini

Il faut tout d'abord déclarer le driver TDS dans unixODBC. Pour cela, modifier le fichier 'odbcinst.ini' comme ceci :
Code:
[ODBC]
Trace = No
TraceFile = /root/tmpsql

[TDS]
Description = Driver FreeTDS 0.62 protocol v4.2
Driver   = /usr/lib/libtdsodbc.so
Setup = /usr/lib/libtdsS.so
FileUsage = 1

Si vous ne trouvez pas les fichiers libtdsodbc.* trouvez leur chemin avec un 'find / -name libtdsodbc' dans un terminal et remplacez le chemin dans l'exemple ci-dessus.

Il ne reste alors plus qu'à définir une liste de serveurs accessibles à partir de 'isql'. Pour cela, modifier le fichier 'odbc.ini' de la manière suivante :
Code:
[Wawa2000]
Description = TDS
Driver = TDS
Servername = MonSQL2000
Database = MaBase


Cette entrée définit un serveur accessible depuis 'isql' sous le nom 'Wawa2000'. Lors de cet appel, unixodbc se connecte en utilisant le driver 'TDS' (définit au préalable dans odbcinst.ini) au serveur nommé 'MonServeurSQL' (définit dans le fichier freetds.conf) en sélectionnant la base 'MaBase'.

NB: Servername dans odbc.ini = [nom du serveur] dans freetds.conf

En admettant que le nom d'utilisateur sur ce serveur soit 'admin' avec comme mot de passe 'motdepasse', on peut dès lors accéder au serveur depuis un terminal de la manière suivante :
Code:
$ isql -v Wawa2000 admin motdepasse


Dans le cas de l'accès à un domaine NT :
Code:
$ isql -v Wawa2000 NTDOMAIN\\admin motdepasse


Vous obtenez :
Code:
Connected !
SQL>


Bravo vous êtes connecté ! Libre à vous de saisir vos requêtes après :)

Envoyer des milliers de requêtes en une seule commande
Admettons que nous ayons un fichier avec 100 requêtes SQL dedans (des INSERT INTO.... par exemple). En une seule commande, on va tout envoyer :) Pret ? Allons-y ...
Code:
cat monfichier.sql | isql Wawa2000 admin motdepasse


Et voilà le travail !

Merci de m'avoir lu et en espérant que cela vous ai aidé :)

Ultrabug
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Tue Jun 07, 2005 5:09 pm    Post subject: Reply with quote

ben je suis nul en SQL :oops: , donc je pige pas grand chose, mais merci, ca servira surement a pas mal de gens ... :mrgreen:
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
Ti momo
Apprentice
Apprentice


Joined: 29 Jun 2004
Posts: 198
Location: Paris

PostPosted: Tue Jun 07, 2005 6:48 pm    Post subject: Reply with quote

Cool ca peut servir à l'occasion :) Je regarderais sa en detail cette nuit :P

Ouahhh kernel_sensei nul en quelque chose incroyable :)
_________________
Avant de poster utilise la fonctions recherche qui est ton ami : http://forums.gentoo.org/search.php
Mon blog : http://blog.yacoubi.fr
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Wed Jun 08, 2005 10:27 am    Post subject: Reply with quote

Personne pour un retour sur cet HowTo ? :( c'est pas intéressant alors...
Back to top
View user's profile Send private message
kernelsensei
Bodhisattva
Bodhisattva


Joined: 22 Feb 2004
Posts: 5619
Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)

PostPosted: Wed Jun 08, 2005 10:32 am    Post subject: Reply with quote

ultrabug wrote:
Personne pour un retour sur cet HowTo ? :( c'est pas intéressant alors...


Mais si, un howto c'est toujours bon a prendre :)
_________________
$ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join'
Back to top
View user's profile Send private message
Enlight
Advocate
Advocate


Joined: 28 Oct 2004
Posts: 3514
Location: Alsace (France)

PostPosted: Wed Jun 08, 2005 11:42 am    Post subject: Reply with quote

Oh ben je l'avais raté celui là, il tombe à pic car je voulais me mettre au SQL! Merci!!! Avec une rapide lecture en diagonale j'ai déjà apris pas mal! Puis t'as pas été radin sur les commentaires, c'est cool!
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Wed Jun 08, 2005 12:19 pm    Post subject: Reply with quote

Ah ouf :) ca va servir

EDIT: ajoutez le a la liste svp !
Back to top
View user's profile Send private message
zoltix
Apprentice
Apprentice


Joined: 22 Mar 2004
Posts: 249
Location: Brusssels

PostPosted: Wed Aug 17, 2005 8:10 am    Post subject: Reply with quote

Je vais d'essayer mais quelques soucis pour le mettre en route
Lorsque j'ai été édité les fichiers /etc/unixODBC/odbc.ini et /etc/unixODBC/odbcinst.ini. Il n'existaientt pas. Alors Je les ai créé et puis j'ai lancé la commande ISQL
Mais j'ai reçu un message d'erreur


BruFree01 unixODBC # isql -v sqlbru01 login password
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified
[ISQL]ERROR: Could not SQLConnect



Si pouvais m'aider ?
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Thu Oct 06, 2005 10:31 am    Post subject: Reply with quote

Oula j'ai zapé ta question désolé !

Tu as résolu le problème depuis ? ...
Back to top
View user's profile Send private message
zoltix
Apprentice
Apprentice


Joined: 22 Mar 2004
Posts: 249
Location: Brusssels

PostPosted: Thu Oct 06, 2005 11:50 am    Post subject: Reply with quote

Je n'ai pas encore trouvé de solution magique........ Je suis simplement en ligne de commande.
Mais si tu as une bonne idée........
Je suis preneur
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Thu Oct 06, 2005 1:32 pm    Post subject: Reply with quote

Ces erreurs veulent dire qu'il ne trouve pas odbc.ini et odbcinst.ini

- Essayes un
Code:
find / -name odbc.ini
pour voir ou il a installé ca, sinon re-emerge unixODBC pour bien avoir les fichiers au bon endroit.

- Verifie que tu as bien utilisé le useflag odbc et mssql pour compiler freetds

Tiens moi au courant :)
Back to top
View user's profile Send private message
voltairien
Tux's lil' helper
Tux's lil' helper


Joined: 24 Apr 2004
Posts: 123

PostPosted: Thu Oct 06, 2005 4:57 pm    Post subject: Reply with quote

Je ne crois pas que le titre soit juste :
Code:
[HowTo] accéder à un serveur SQL par le shell

Porte confusion. La première fois que je l'ai lu, j'ai pensé à une doc sur le client MySQL (Esprit tordu ? ...)
MySQL est (entre autre) un serveur SQL ...
En fait, ce ne serait pas mieux :
Code:
[HowTo] accéder a SQL server par le shell

??

V.
_________________
[Les Mechants] Voltairien
Back to top
View user's profile Send private message
ultrabug
Developer
Developer


Joined: 24 Jan 2005
Posts: 698
Location: Paris

PostPosted: Thu Oct 06, 2005 5:14 pm    Post subject: Reply with quote

voltairien wrote:
Je ne crois pas que le titre soit juste :
Code:
[HowTo] accéder à un serveur SQL par le shell

Porte confusion. La première fois que je l'ai lu, j'ai pensé à une doc sur le client MySQL (Esprit tordu ? ...)
MySQL est (entre autre) un serveur SQL ...
En fait, ce ne serait pas mieux :
Code:
[HowTo] accéder a SQL server par le shell

??

V.


Bonjour,

J'ai mis ce titre car cette technique permet de se connecter a *tous* les serveurs SQL pourvu qu'on ai le bon driver de bas niveau (freetds gère mySQL, SQL Server, Oracle...)

Donc c'est bien se connecter à un serveur SQL sans distinction ;)

EDIT: tu peux d'ailleurs aussi accèder à différents types de serveurs SQL juste en paramètrant bien tes serveurs dans freeTDS. Ensuite c'est transparent pour isql :)

Mon exemple couvre seulement une de ces possibilités, les autres sont à adapter mais fonctionnent de la meme manière
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum