Puede usar este método para conectarse a cualquier base de datos que tenga un controlador ODBC.
Ejemplo de configuración:
DDL
Archivo de configuración
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'
))
<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>
Campos de configuración:
| Configuración | Descripción |
|---|
db | Nombre de la base de datos. Omítalo si el nombre de la base de datos está definido en los parámetros de <connection_string>. |
table | Nombre de la tabla y del esquema, si existe. |
connection_string | Cadena de conexión. |
invalidate_query | Consulta para comprobar el estado del diccionario. Opcional. Lea más en la sección Actualización de los datos del diccionario con LIFETIME. |
background_reconnect | Se vuelve a conectar a la réplica en segundo plano si falla la conexión. Opcional. |
query | Consulta personalizada. Opcional. |
Los campos table y query no pueden usarse juntos. Debe declararse uno de los dos: table o query.
ClickHouse recibe los caracteres de comillas del controlador ODBC y pone entre comillas todos los ajustes en las consultas al controlador, por lo que es necesario definir el nombre de la tabla respetando el uso de mayúsculas y minúsculas en la base de datos.
Si tiene problemas de codificación al usar Oracle, consulte la entrada correspondiente de FAQ.
Vulnerabilidad conocida de la funcionalidad de los diccionarios ODBC
Al conectarse a la base de datos mediante el parámetro de conexión Servername del controlador ODBC, este puede sustituirse. En ese caso, los valores de USERNAME y PASSWORD de odbc.ini se envían al servidor remoto y pueden verse comprometidos.
Ejemplo de uso no seguro
Configuremos unixODBC para PostgreSQL. Contenido de /etc/odbc.ini:
[gregtest]
Driver = /usr/lib/psqlodbca.so
Servername = localhost
PORT = 5432
DATABASE = test_db
#OPTION = 3
USERNAME = test
PASSWORD = test
Si luego haces una consulta como
SELECT * FROM odbc('DSN=gregtest;Servername=some-server.com', 'test_db');
El controlador ODBC enviará los valores de USERNAME y PASSWORD del archivo odbc.ini a some-server.com.
Ejemplo de conexión a PostgreSQL
Sistema operativo Ubuntu.
Instalación de unixODBC y del controlador ODBC para PostgreSQL:
$ sudo apt-get install -y unixodbc odbcinst odbc-postgresql
Configuración de /etc/odbc.ini (o de ~/.odbc.ini si inició sesión con un usuario que ejecuta ClickHouse):
[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 configuración del diccionario en ClickHouse:
DDL
Archivo de configuración
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)
<clickhouse>
<dictionary>
<name>table_name</name>
<source>
<odbc>
<!-- Puede especificar los siguientes parámetros en 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>
Puede que tenga que editar odbc.ini para especificar la ruta completa a la biblioteca con el controlador DRIVER=/usr/local/lib/psqlodbcw.so.
Ejemplo de conexión a MS SQL Server
Sistema operativo Ubuntu.
Instalación del controlador ODBC para conectarse a MS SQL:
$ sudo apt-get install tdsodbc freetds-bin sqsh
Configuración del controlador:
$ cat /etc/freetds/freetds.conf
...
[MSSQL]
host = 192.168.56.101
port = 1433
tds version = 7.0
client charset = UTF-8
# probar conexión TDS
$ 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 # si inició sesión con un usuario que ejecuta ClickHouse
[MSSQL]
Description = FreeTDS
Driver = FreeTDS
Servername = MSSQL
Database = test
UID = test
PWD = test
Port = 1433
# (opcional) probar conexión ODBC (para usar isql-tool instale el paquete [unixodbc](https://packages.debian.org/sid/unixodbc))
$ isql -v MSSQL "user" "password"
Observaciones:
- para determinar la versión más antigua de TDS compatible con una versión específica de SQL Server, consulta la documentación del producto o revisa MS-TDS Product Behavior
Configuración del Diccionario en ClickHouse:
DDL
Archivo de configuración
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)
<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>