# [HowTo] accéder à un serveur SQL par le shell

## ultrabug

Salut à tous, je me lance dans un petit HowTo, soyez indulgents c'est mon premier  :Smile:  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  :Smile: 

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 :

```

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

emerge freetds -av

```

Ensuite on installe notre couche applicative (unixODBC) :

```
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 :

```

[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 :

```
[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 :

```
[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 :

```
$ isql -v Wawa2000 admin motdepasse
```

Dans le cas de l'accès à un domaine NT :

```
$ isql -v Wawa2000 NTDOMAIN\\admin motdepasse
```

Vous obtenez :

```
Connected !

SQL>
```

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

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  :Smile:  Pret ? Allons-y ...

```
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é  :Smile: 

Ultrabug

----------

## kernelsensei

ben je suis nul en SQL  :Embarassed:  , donc je pige pas grand chose, mais merci, ca servira surement a pas mal de gens ...   :Mr. Green: 

----------

## Ti momo

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

Ouahhh kernel_sensei nul en quelque chose incroyable  :Smile: 

----------

## ultrabug

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

----------

## kernelsensei

 *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  :Smile: 

----------

## Enlight

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!

----------

## ultrabug

Ah ouf  :Smile:  ca va servir

EDIT: ajoutez le a la liste svp !

----------

## zoltix

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 ?

----------

## ultrabug

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

Tu as résolu le problème depuis ? ...

----------

## zoltix

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

----------

## ultrabug

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

- Essayes un 

```
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  :Smile: 

----------

## voltairien

Je ne crois pas que le titre soit juste :

```
[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 :

```
[HowTo] accéder a SQL server par le shell
```

??

V.

----------

## ultrabug

 *voltairien wrote:*   

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

 

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  :Wink: 

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  :Smile: 

Mon exemple couvre seulement une de ces possibilités, les autres sont à adapter mais fonctionnent de la meme manière

----------

