使用 R + DBI 库 + ODBC 连接到 Teradata 数据库

Connect to Teradata Database using R + DBI library + ODBC

我正在尝试使用 DBI 库连接到 R 中的 Teradata 数据库(如果重要的话我在 Windows)。我可以使用 RODBC 库成功连接,所以我知道我的凭据等是正确的。

我怀疑问题是:


背景:

首先,这是我的 ODBC 信息,如果我在 ODBC 数据库源管理员那里查看的话:

使用 R 3.5.1 (2018-07-02),RStudio,Windows 10.


什么有效:

library(RODBC) 
con = odbcConnect(dsn = "name_name"
                  ,uid = rstudioapi::askForPassword("Username")
                  ,pwd = rstudioapi::askForPassword("Password")
                  )

我用 DBI 尝试过但失败了:

library(DBI)

con <- DBI::dbConnect(odbc::odbc()
                      ,driver = "Teradata"
                      ,DBCName = "name_name"
                      ,host   = "address.here.ok"
                      ,uid    = rstudioapi::askForPassword("Database user")
                      ,pwd    = rstudioapi::askForPassword("Database password"))

错误:Error: nanodbc/nanodbc.cpp:950: 28000: [Teradata][ODBC Teradata Driver][Teradata Database] The UserID, Password or Account is Invalid

con <- DBI::dbConnect(odbc::odbc()
                      ,driver = "Teradata"
                      ,DBCName = "name_name"
                      ,host   = "address.here.ok"
                      ,uid    = rstudioapi::askForPassword("Database user")
                      ,pwd    = rstudioapi::askForPassword("Database password")
                      ,MechanismName = "ldap")

错误:Error: nanodbc/nanodbc.cpp:950: 28000: [Teradata][ODBC Teradata Driver][Teradata Database] The UserID, Password or Account is Invalid

我在没有正确指定机制 (ldap) 的类似情况下看到过这个错误,所以也许 MechanismName 是错误的?

我知道我可以在连接字符串中说出我喜欢的任何内容,并且不会引发任何错误,所以如果 MechanismName 不是指定身份验证机制的正确方法,我将不会返回错误。例如:

con <- DBI::dbConnect(odbc::odbc()
                      ,driver = "Teradata"
                      ,DBCName = "name_name"
                      ,host   = "address.here.ok"
                      ,uid    = rstudioapi::askForPassword("Database user")
                      ,pwd    = rstudioapi::askForPassword("Database password")
                      ,MechanismName = "ldap")
                      ,made_up_input = "I like cats"

给出错误:Error: nanodbc/nanodbc.cpp:950: 28000: [Teradata][ODBC Teradata Driver][Teradata Database] The UserID, Password or Account is Invalid

提前致谢。

编辑:想到使用 MechanismName from an issue raised in Git

与 R 一样,DBI 也是基于 C 的并且使用 ODBC。如果它基于 Java,它会说 JDBC。

我建议您在使用 askForPassword 函数之前使用硬编码的 UID 和 PWD 进行测试。

也就是说,我相信你会成功 --

DBI::dbConnect(odbc::odbc() 
    ,dsn = "name_name" 
    ,uid = rstudioapi::askForPassword("Username") 
    ,pwd = rstudioapi::askForPassword("Password")
   )

对于那些晚发现的人来说,只有提供了在您的 ODBC 管理器中显示的驱动程序的确切名称,原始 DBI 调用才会起作用。打开 ODBC Data Source Administrator 应用程序并单击“驱动程序”选项卡。完全按照名称列中显示的名称输入驱动程序名称,它应该可以工作。例如,'Teradata Database ODBC Driver 16.10' 而不是上面显示的 'Teradata'。