从错误中我们可以看到您正在使用 unixODBC,并且我认为“DSI”是 Vertica 自称的内容,因为 ODBC 错误文本的格式为 [] 中的条目,从左到右作为通过不同组件的路径(请参阅示例诊断消息)。
我认为该消息应该是“找不到 SQLGetPrivateprofileString”。SQLGetPrivateProfileString 是 ODBC 驱动程序管理器提供的 API,用于从 odbc.ini 文件中读取条目。我相信它应该在 libodbcinst.so 共享对象中找到,但是,某些发行版(例如,Ubuntu/Debian)会从共享对象中删除符号,因此很难验证这一点。
在您的 DSN 中,驱动程序是文件“/opt/vertica/lib/libverticaodbc_unixodbc.so”。虽然在 odbc.ini 中命名驱动程序并在 odbcinst.ini 文件中添加一个条目更为常见,但您的 DSN 看起来还不错。例如:
/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 驱动程序都找不到 libodbcinst.so 中的符号 SQLGetPrivateProfileString,因此请确保 a)您有 libodbcinst.so b)您的动态链接器知道它(如何完成取决于您的平台 - 在 Linux 上请参阅 /etc/ld.so.conf 和 LD_LIBRARY_PATH 以及 ld.so 的手册页) c)在其上运行 ldd(或等效项)以确保没有缺少的依赖项。
vertica.ini 文件可能是驱动程序存储驱动程序特定配置的位置 - 有些驱动程序会这样做。如果此文件的格式类似于上面的 odbc 格式,则它也可以使用 SQLGetPrivateProfileString 作为此文件,因为您可以告诉 ODBC API 使用哪个文件。
除此之外,除了联系 vertica,我没有更多的想法。