> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Source de dictionnaire ODBC

> Configurer une connexion ODBC comme source de dictionnaire dans ClickHouse.

Vous pouvez utiliser cette méthode pour vous connecter à n’importe quelle base de données disposant d’un pilote ODBC.

Exemple de paramètres :

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    SOURCE(ODBC(
        db 'DatabaseName'
        table 'SchemaName.TableName'
        connection_string 'DSN=some_parameters'
        invalidate_query 'SQL_QUERY'
        query 'SELECT id, value_1, value_2 FROM db_name.table_name'
    ))
    ```
  </Tab>

  <Tab title="Fichier de configuration">
    ```xml theme={null}
    <source>
        <odbc>
            <db>DatabaseName</db>
            <table>ShemaName.TableName</table>
            <connection_string>DSN=some_parameters</connection_string>
            <invalidate_query>SQL_QUERY</invalidate_query>
            <query>SELECT id, value_1, value_2 FROM ShemaName.TableName</query>
        </odbc>
    </source>
    ```
  </Tab>
</Tabs>

<br />

Champs des paramètres :

| Paramètre              | Description                                                                                                                                                                                                    |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `db`                   | Nom de la base de données. Omettez-le si le nom de la base de données est défini dans les paramètres de `<connection_string>`.                                                                                 |
| `table`                | Nom de la table et du schéma, s’il existe.                                                                                                                                                                     |
| `connection_string`    | Chaîne de connexion.                                                                                                                                                                                           |
| `invalidate_query`     | Requête permettant de vérifier l’état du dictionnaire. Facultatif. Pour en savoir plus, consultez la section [Refreshing dictionary data using LIFETIME](/fr/reference/statements/create/dictionary/lifetime). |
| `background_reconnect` | Se reconnecte à la réplique en arrière-plan si la connexion échoue. Facultatif.                                                                                                                                |
| `query`                | Requête personnalisée. Facultatif.                                                                                                                                                                             |

<Note>
  Les champs `table` et `query` ne peuvent pas être utilisés ensemble. De plus, l’un des deux champs `table` ou `query` doit obligatoirement être déclaré.
</Note>

ClickHouse reçoit les caractères de guillemet du pilote ODBC et place tous les paramètres entre guillemets dans les requêtes envoyées au pilote ; il est donc nécessaire de définir le nom de la table en respectant sa casse dans la base de données.

Si vous rencontrez des problèmes d’encodage lors de l’utilisation d’Oracle, consultez l’article correspondant de la [FAQ](/fr/resources/support-center/knowledge-base/integrations/oracle-odbc).

<div id="known-vulnerability-of-the-odbc-dictionary-functionality">
  ### Vulnérabilité connue de la fonctionnalité des dictionnaires ODBC
</div>

<Note>
  Lors de la connexion à la base de données via le pilote ODBC, le paramètre de connexion `Servername` peut être remplacé. Dans ce cas, les valeurs de `USERNAME` et `PASSWORD` de `odbc.ini` sont envoyées au serveur distant et peuvent être compromises.
</Note>

**Exemple d’utilisation non sécurisée**

Configurons unixODBC pour PostgreSQL. Contenu de `/etc/odbc.ini` :

```text theme={null}
[gregtest]
Driver = /usr/lib/psqlodbca.so
Servername = localhost
PORT = 5432
DATABASE = test_db
#OPTION = 3
USERNAME = test
PASSWORD = test
```

Si vous exécutez ensuite une requête telle que

```sql theme={null}
SELECT * FROM odbc('DSN=gregtest;Servername=some-server.com', 'test_db');
```

Le pilote ODBC enverra les valeurs de `USERNAME` et `PASSWORD` contenues dans `odbc.ini` à `some-server.com`.

<div id="example-of-connecting-postgresql">
  ### Exemple de connexion à PostgreSQL
</div>

Système d’exploitation Ubuntu.

Installation de unixODBC et du pilote ODBC pour PostgreSQL :

```bash theme={null}
$ sudo apt-get install -y unixodbc odbcinst odbc-postgresql
```

Configuration de `/etc/odbc.ini` (ou `~/.odbc.ini` si vous êtes connecté avec l’utilisateur qui exécute ClickHouse) :

```text theme={null}
    [DEFAULT]
    Driver = myconnection

    [myconnection]
    Description         = PostgreSQL connection to my_db
    Driver              = PostgreSQL Unicode
    Database            = my_db
    Servername          = 127.0.0.1
    UserName            = username
    Password            = password
    Port                = 5432
    Protocol            = 9.3
    ReadOnly            = No
    RowVersioning       = No
    ShowSystemTables    = No
    ConnSettings        =
```

La configuration du dictionnaire dans ClickHouse :

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    CREATE DICTIONARY table_name (
        id UInt64,
        some_column UInt64 DEFAULT 0
    )
    PRIMARY KEY id
    SOURCE(ODBC(connection_string 'DSN=myconnection' table 'postgresql_table'))
    LAYOUT(HASHED())
    LIFETIME(MIN 300 MAX 360)
    ```
  </Tab>

  <Tab title="Fichier de configuration">
    ```xml theme={null}
    <clickhouse>
        <dictionary>
            <name>table_name</name>
            <source>
                <odbc>
                    <!-- Vous pouvez spécifier les paramètres suivants dans connection_string : -->
                    <!-- DSN=myconnection;UID=username;PWD=password;HOST=127.0.0.1;PORT=5432;DATABASE=my_db -->
                    <connection_string>DSN=myconnection</connection_string>
                    <table>postgresql_table</table>
                </odbc>
            </source>
            <lifetime>
                <min>300</min>
                <max>360</max>
            </lifetime>
            <layout>
                <hashed/>
            </layout>
            <structure>
                <id>
                    <name>id</name>
                </id>
                <attribute>
                    <name>some_column</name>
                    <type>UInt64</type>
                    <null_value>0</null_value>
                </attribute>
            </structure>
        </dictionary>
    </clickhouse>
    ```
  </Tab>
</Tabs>

<br />

Vous devrez peut-être modifier `odbc.ini` afin d’indiquer le chemin complet vers la bibliothèque avec le pilote `DRIVER=/usr/local/lib/psqlodbcw.so`.

<div id="example-of-connecting-ms-sql-server">
  ### Exemple de connexion à MS SQL Server
</div>

Sous Ubuntu.

Installation du pilote ODBC pour la connexion à MS SQL :

```bash theme={null}
$ sudo apt-get install tdsodbc freetds-bin sqsh
```

Configuration du driver :

```bash theme={null}
    $ cat /etc/freetds/freetds.conf
    ...

    [MSSQL]
    host = 192.168.56.101
    port = 1433
    tds version = 7.0
    client charset = UTF-8

    # test TDS connection
    $ sqsh -S MSSQL -D database -U user -P password

    $ cat /etc/odbcinst.ini

    [FreeTDS]
    Description     = FreeTDS
    Driver          = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
    Setup           = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
    FileUsage       = 1
    UsageCount      = 5

    $ cat /etc/odbc.ini
    # $ cat ~/.odbc.ini # if you signed in under a user that runs ClickHouse

    [MSSQL]
    Description     = FreeTDS
    Driver          = FreeTDS
    Servername      = MSSQL
    Database        = test
    UID             = test
    PWD             = test
    Port            = 1433

    # (optional) test ODBC connection (to use isql-tool install the [unixodbc](https://packages.debian.org/sid/unixodbc)-package)
    $ isql -v MSSQL "user" "password"
```

Remarques :

* pour déterminer la plus ancienne version de TDS prise en charge par une version donnée de SQL Server, consultez la documentation du produit ou reportez-vous à [MS-TDS Product Behavior](https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-tds/135d0ebe-5c4c-4a94-99bf-1811eccb9f4a)

Configuration du dictionnaire dans ClickHouse :

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    CREATE DICTIONARY test (
        k UInt64,
        s String DEFAULT ''
    )
    PRIMARY KEY k
    SOURCE(ODBC(table 'dict' connection_string 'DSN=MSSQL;UID=test;PWD=test'))
    LAYOUT(FLAT())
    LIFETIME(MIN 300 MAX 360)
    ```
  </Tab>

  <Tab title="Fichier de configuration">
    ```xml theme={null}
    <clickhouse>
        <dictionary>
            <name>test</name>
            <source>
                <odbc>
                    <table>dict</table>
                    <connection_string>DSN=MSSQL;UID=test;PWD=test</connection_string>
                </odbc>
            </source>

            <lifetime>
                <min>300</min>
                <max>360</max>
            </lifetime>

            <layout>
                <flat />
            </layout>

            <structure>
                <id>
                    <name>k</name>
                </id>
                <attribute>
                    <name>s</name>
                    <type>String</type>
                    <null_value></null_value>
                </attribute>
            </structure>
        </dictionary>
    </clickhouse>
    ```
  </Tab>
</Tabs>
