Из ошибки видно, что вы используете unixODBC, и я предполагаю, что «DSI» - это то, что Vertica называет себя, поскольку текст ошибки ODBC отформатирован с записями в [] слева направо в качестве пути через различные компоненты (см. Пример диагностических сообщений ).
Я предполагаю, что сообщение должно быть "Не найден SQLGetPrivateprofileString". SQLGetPrivateProfileString - это API, предоставляемый диспетчером драйверов ODBC для чтения записей из файла odbc.ini. Я считаю, что он должен быть найден в общем объекте libodbcinst.so, однако некоторые дистрибутивы (например, Ubuntu / Debian) удаляют символы из общих объектов, поэтому это трудно проверить.
В вашем DSN драйвером является файл "/opt/vertica/lib/libverticaodbc_unixodbc.so". Хотя более обычно имя драйвера в файле odbc.ini и добавление записи в файл odbcinst.ini, ваш DSN выглядит нормально. e.g.:
/etc/odbcinst.ini:
[Easysoft ODBC-SQL Server SSL]
Driver=/usr/local/easysoft/sqlserver/lib/libessqlsrv.so
Setup=/usr/local/easysoft/sqlserver/lib/libessqlsrvS.so
Threading=0
FileUsage=1
DontDLClose=1
/etc/odbc.ini:
[SQLSERVER_SAMPLE_SSL]
Driver=Easysoft ODBC-SQL Server SSL
Description=Easysoft SQL Server ODBC driver
.
.
См. В приведенном выше примере, что делает это таким образом, позволяет указать дополнительные параметры, связанные с драйвером, такие как Threading (а быстрый поиск в сети показывает, что Vertica может использовать Threading = 1, который менее ограничивает использование многопоточной программы), и DontDLClose. Однако, как я уже сказал, все должно работать так, как у вас сейчас.
Теперь следующий бит зависит от вашей платформы, и я не заметил, указали ли вы одну. Вам нужно проверить этот общий объект для вашего драйвера ODBC и посмотреть, от чего он зависит. В Linux вы делаете что-то вроде этого:
$ ldd /usr/local/easysoft/sqlserver/lib/libessqlsrv.so
linux-gate.so.1 => (0xb76ff000)
libodbcinst.so.1 => /usr/lib/libodbcinst.so.1 (0xb75fe000)
libesextra_r.so => /usr/local/easysoft/lib/libesextra_r.so (0xb75fb000)
libessupp_r.so => /usr/local/easysoft/lib/libessupp_r.so (0xb75de000)
libeslicshr_r.so => /usr/local/easysoft/lib/libeslicshr_r.so (0xb75cd000)
libestdscrypt.so => /usr/local/easysoft/lib/libestdscrypt.so (0xb75c8000)
libm.so.6 => /lib/libm.so.6 (0xb75a2000)
libc.so.6 => /lib/libc.so.6 (0xb7445000)
libltdl.so.7 => /usr/lib/libltdl.so.7 (0xb743b000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb7421000)
/lib/ld-linux.so.2 (0xb7700000)
libdl.so.2 => /lib/libdl.so.2 (0xb741d000)
, который показывает, что этот драйвер ODBC зависит от libodbcinst.so.1 и динамического компоновщика, который его нашел. Я полагаю, что ваш драйвер Vertica должен выглядеть аналогично в этом отношении, хотя возможно, что драйвер Vertica динамически загружает сам этот общий объект при первой загрузке. В любом случае, похоже, что драйвер Vertica не может найти символ SQLGetPrivateProfileString, который находится в libodbcinst.so, поэтому убедитесь, что a) у вас есть libodbcinst.so b) ваш динамический компоновщик знает об этом (как это делается зависит от вашей платформы - в Linux) см. /etc/ld.so.conf и LD_LIBRARY_PATH и справочную страницу для ld.so) c) запустите на нем ldd (или его эквивалент), чтобы не пропустить зависимости.
Возможно, в файле vertica.ini драйвер хранит конфигурацию, специфичную для драйвера - некоторые драйверы делают это. Если формат этого файла похож на формат odbc, приведенный выше, он также может использовать SQLGetPrivateProfileString для этого файла, поскольку вы можете указать этому ODBC API, какой файл использовать.
Помимо этого, у меня нет больше идей, кроме как связаться с vertica.