Подключение к базе данных Teradata с помощью библиотеки R + DBI + ODBC

Я пытаюсь подключиться к базе данных Teradata в R с помощью библиотеки DBI (если это имеет значение, я работаю в Windows). Я могу успешно подключиться с помощью библиотеки RODBC, поэтому я знаю, что мои учетные данные и т. д. верны.

Я подозреваю, что проблема в следующем:

  • Я неправильно указываю механизм аутентификации
  • Неправильный драйвер: вместо использования ODBC, возможно, мне следует использовать JDBC?

Фон:

Во-первых, вот моя информация ODBC, если я смотрю ее администратором источника базы данных ODBC:

  • Имя = имя_имя
  • Драйвер = Терадата
  • Имя или IP-адрес = address.here.ok
  • Механизм = лдап
  • Имя пользователя = мое_имя_пользователя

Снимок экрана: окно установки драйвера ODBC для базы данных Teradata

Использование 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 из проблемы, поднятой в Git


person i_love_chocolate    schedule 23.01.2019    source источник
comment
Как и R, DBI основан на C и говорит на языке ODBC. Если бы он был основан на Java, он говорил бы на JDBC. Я предлагаю вам проверить с жестко заданными UID и PWD, прежде чем использовать функцию askForPassword. Тем не менее, я считаю, что вы можете добиться успеха с DBI::dbConnect(odbc::odbc() ,dsn = "name_name" ,uid = rstudioapi::askForPassword("Username") ,pwd = rstudioapi::askForPassword("Password") ).   -  person TallTed    schedule 24.01.2019
comment
Спасибо @TallTed за объяснение, а также за решение. Ваше предложение сработало :). Если вы хотите поместить это как ответ, я проголосую за него, в противном случае я напишу ваше решение и отмечу вас за него. Ваше здоровье! Очень признателен!   -  person i_love_chocolate    schedule 25.01.2019


Ответы (1)


Как и R, DBI основан на C и говорит на языке ODBC. Если бы он был основан на Java, он говорил бы на JDBC.

Я бы посоветовал вам проверить с жестко закодированными UID и PWD, прежде чем использовать функцию askForPassword.

Тем не менее, я верю, что вы добьетесь успеха с...

DBI::dbConnect(odbc::odbc() 
    ,dsn = "name_name" 
    ,uid = rstudioapi::askForPassword("Username") 
    ,pwd = rstudioapi::askForPassword("Password")
   )
person TallTed    schedule 25.01.2019
comment
На самом деле основная проблема OP заключается в использовании DSN и драйвера, двух методов ODBC. DSN подготавливаются заранее со всеми сведениями о драйверах и других соединениях, что позволяет избежать необходимости записи на прикладном уровне. Драйверы должны включать все необходимые сведения о подключении на уровне приложения. - person Parfait; 26.01.2019
comment
Да и нет, @Parfait. Предварительно настроенный DSN содержит все атрибуты, необходимые для подключения, включая атрибут driver=. OP не знал, что DBI примет ту же простую строку подключения ODBC (т. е. с использованием dsn=), что и RODBC, и поэтому пытался создать полную строку подключения ODBC (driver=...;attr1=...;attr2=...;uid=...;pwd=...;etc.), которая автоматически создается библиотеками ODBC при использовании dsn=...;uid=...;pwd=... нить. - person TallTed; 28.01.2019
comment
Ваш ответ, я думаю, перекликается с моим, что есть два метода подключения к ODBC, будь то использование RODBC или DBI (даже помимо R): 1) драйвер или 2) DSN. Согласованный. Основная проблема заключалась в том, что OP не знал о версии DSN в DBI. Неудачные попытки драйвера без DSN указывают на то, что OP не удовлетворяет всем атрибутам, которые несет DSN. Я прокомментировал, потому что ваш открыватель подчеркнул JDBC, который является второстепенным вопросом OP и не связан с попытками OP. Фактически, ваш комментарий выше должен быть в теле вашего ответа для будущих читателей. - person Parfait; 28.01.2019