Записать в предполагаемое местоположение БД с помощью функции odbc :: dbWriteTable () - PullRequest
0 голосов
/ 15 января 2019

В библиотеке odbc есть явление, похожее на ошибку, которое уже много лет известно как проблема со старой, более медленной библиотекой RODBC, однако обходные решения для RODBC, похоже, не работают с odbc.

Проблема:

Очень часто человек может захотеть создать таблицу SQL из двумерного объекта R. В этом случае я делаю это с SQL Server (т. Е. T-SQL). Учетная запись, используемая для аутентификации, например, «sysadmin-account» может отличаться от владельца и создателя базы данных, в которой будут размещаться создаваемые таблицы, но учетная запись имеет полные разрешения на чтение / запись для целевой БД.

Вызов odbc() для этого выглядит так и выполняется "успешно"

library(odbc)

db01 <- odbc::dbConnect(odbc::odbc(), "UserDB_odbc_name")
odbc::dbWriteTable(db01, "UserDB.dbo.my_table", r_data)

Это соединяет и создает таблицу, но вместо создания таблицы в предполагаемом месте UserDB.dbo.my_table, она создается в UserDB.sysadmin-account.dbo.my_table.

Технически, .dbo является потомком базы данных UserDB. то, что это делает, создает новый дочерний объект UserDB с именем sysadmin-account с собственным дочерним элементом .dbo, а затем создает в нем таблицу.

С помощью RODBC и некоторых других библиотек / языков мы обнаружили, что обходным решением было изменить ссылку на местоположение целевой таблицы в вызове на «.dbo.my_table» или в некоторых случаях «..dbo.my_table». Также я думаю, что выполнение запроса к use UserDB иногда используется, чтобы помочь с RODBC.

Ни одно из этих решений не имеет никакого эффекта при odbc().

Обновление

  • Попробовал библиотеку DBI в качестве потенциальной замены безрезультатно
  • Найден обходной путь отправки данных в глобальную временную таблицу с последующим использованием оператора SQL для копирования из временной таблицы в нужное место
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...