【问题标题】:Connect to Teradata Database using R + DBI library + ODBC使用 R + DBI 库 + ODBC 连接到 Teradata Database
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 其实 OP 的主要问题是使用 DSN 与驱动程序,两种 ODBC 方法。 DSN 预先准备好所有驱动程序和其他连接细节,避免了在应用层写出的需要。驱动程序必须在应用层中包含所有需要的连接详细信息。
  • 是也不是,@Parfait。预配置的 DSN 确实包含连接所需的所有属性——包括driver= 属性。 OP 不知道 DBI 会接受与 RODBC 相同的简单 ODBC 连接字符串(即使用 dsn=),因此试图创建自动构建的完整 ODBC 连接字符串(driver=...;attr1=...;attr2=...;uid=...;pwd=...;etc.)使用 dsn=...;uid=...;pwd=... 字符串时由 ODBC 库提供。
  • 您的回复我相信与我的一致,无论是使用 RODBC 还是 DBI(甚至超出 R),有两种方法可以与 ODBC 连接:1)驱动程序或 2)DSN。同意。主要问题是 OP 不知道 DBI 中的 DSN 版本。失败的无 DSN 驱动程序尝试表明 OP 不满足 DSN 携带的所有属性。我发表评论是因为您的开场白强调了 JDBC,这是 OP 的一个切题问题,与 OP 的尝试无关。实际上,您的上述评论应该包含在您对未来读者的回答中。
【解决方案2】:

对于那些发现迟到的人,原始 DBI 调用只有在提供了驱动程序在 ODBC 管理器中显示的确切名称时才有效。打开 ODBC 数据源管理器应用程序并单击驱动程序选项卡。输入与名称列中显示的完全一致的驱动程序名称,它应该可以工作。例如,“Teradata Database ODBC Driver 16.10”而不是“Teradata”,如上所示。

【讨论】:

  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2023-03-24
  • 2012-01-04
  • 2019-06-23
  • 2019-10-25
  • 2016-12-17
  • 2015-09-28
  • 2017-08-20
  • 1970-01-01
  • 2017-10-15
相关资源
最近更新 更多