【发布时间】:2019-06-17 15:14:30
【问题描述】:
我正在尝试使用 DBI 库连接到 R 中的 Teradata 数据库(如果重要的话,我在 Windows 上)。我可以使用 RODBC 库成功连接,因此我知道我的凭据等是正确的。
我怀疑问题是:
- 我没有正确指定身份验证机制
- 错误的驱动程序:也许我应该使用 JDBC 而不是使用 ODBC?
背景:
如果我查看 ODBC 数据库源管理器,首先这是我的 ODBC 信息:
- 姓名 = name_name
- 驱动程序 = Teradata
- 名称或 IP 地址 = address.here.ok
- 机制 = ldap
- 用户名 = 我的用户名
使用 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") )获得成功。 -
感谢@TallTed 的解释和解决方案。你的建议奏效了:)。如果你想把它作为答案,我会投票,否则我会写下你的解决方案并归功于你。干杯!非常感谢!
标签: r windows odbc teradata r-dbi