View previous topic :: View next topic |
Author |
Message |
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Tue Jun 07, 2005 5:06 pm Post subject: [HowTo] accéder à un serveur SQL par le shell |
|
|
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 :
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 |
|
|
kernelsensei Bodhisattva
Joined: 22 Feb 2004 Posts: 5619 Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)
|
Posted: Tue Jun 07, 2005 5:09 pm Post subject: |
|
|
ben je suis nul en SQL , donc je pige pas grand chose, mais merci, ca servira surement a pas mal de gens ... _________________ $ ruby -e'puts " .:@BFegiklnorst".unpack("x4ax7aaX6ax5aX15ax4aax6aaX7ax2aX5aX8 \
axaX3ax8aX4ax6aX3aX6ax3ax3aX9ax4ax2aX9axaX6ax3aX2ax4ax3aX4aXaX12ax10aaX7a").join' |
|
Back to top |
|
|
Ti momo Apprentice
Joined: 29 Jun 2004 Posts: 198 Location: Paris
|
Posted: Tue Jun 07, 2005 6:48 pm Post subject: |
|
|
Cool ca peut servir à l'occasion Je regarderais sa en detail cette nuit
Ouahhh kernel_sensei nul en quelque chose incroyable _________________ Avant de poster utilise la fonctions recherche qui est ton ami : https://forums.gentoo.org/search.php
Mon blog : http://blog.yacoubi.fr |
|
Back to top |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Wed Jun 08, 2005 10:27 am Post subject: |
|
|
Personne pour un retour sur cet HowTo ? c'est pas intéressant alors... |
|
Back to top |
|
|
kernelsensei Bodhisattva
Joined: 22 Feb 2004 Posts: 5619 Location: Woustviller/Moselle/FRANCE (49.07°N;7.02°E)
|
Posted: Wed Jun 08, 2005 10:32 am Post subject: |
|
|
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 |
|
|
Enlight Advocate
Joined: 28 Oct 2004 Posts: 3519 Location: Alsace (France)
|
Posted: Wed Jun 08, 2005 11:42 am Post subject: |
|
|
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 |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Wed Jun 08, 2005 12:19 pm Post subject: |
|
|
Ah ouf ca va servir
EDIT: ajoutez le a la liste svp ! |
|
Back to top |
|
|
zoltix Apprentice
Joined: 22 Mar 2004 Posts: 249 Location: Brusssels
|
Posted: Wed Aug 17, 2005 8:10 am Post subject: |
|
|
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 |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Thu Oct 06, 2005 10:31 am Post subject: |
|
|
Oula j'ai zapé ta question désolé !
Tu as résolu le problème depuis ? ... |
|
Back to top |
|
|
zoltix Apprentice
Joined: 22 Mar 2004 Posts: 249 Location: Brusssels
|
Posted: Thu Oct 06, 2005 11:50 am Post subject: |
|
|
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 |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Thu Oct 06, 2005 1:32 pm Post subject: |
|
|
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 |
|
|
voltairien Tux's lil' helper
Joined: 24 Apr 2004 Posts: 123
|
Posted: Thu Oct 06, 2005 4:57 pm Post subject: |
|
|
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 |
|
|
ultrabug Developer
Joined: 24 Jan 2005 Posts: 698 Location: Paris
|
Posted: Thu Oct 06, 2005 5:14 pm Post subject: |
|
|
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 |
|
|
|