tds_fdw. Оболочка внешних данных MSSQL, Sybase
Версия: 2.0.2.
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: драйвер
freetds
версии не ниже 1.1.20.Схема размещения:
ext
.
Модуль представляет собой оболочку внешних данных PostgreSQL для подключения к базам данных Sybase и Microsoft SQL server, использующим протокол табличного потока данных TDS.
Для работы внешней оболочки данных tds_fdw
требуется библиотека, реализующая интерфейс DB-Library, например, FreeTDS. Работа расширения была протестирована с FreeTDS (не с проприетарными реализациями DB-Library).
Расширение tds_fdw
позволяет работать с таблицами базы данных MSSQL как с собственными таблицами Pangolin. Для подключения к сторонним базам данных Microsoft SQL Server используется драйвер freetds
, который должен быть установлен на сервере с СУБД.
Оригинальное решение предполагает обязательное сохранение логина и пароля от сторонней БД при создании сопоставления пользователей, поэтому расширение для Pangolin дорабатывается с целью использовать для хранения пароля в шифрованном хранилище pg_auth_config
.
Параметры
Параметр | Описание |
---|---|
tds_fdw.show_before_row_memory_stats | Вывод статистики контекста памяти в лог PostgreSQL перед извлечением каждой строки |
tds_fdw.show_after_row_memory_stats | Вывод статистики контекста памяти в лог PostgreSQL после извлечения каждой строки |
tds_fdw.show_finished_memory_stats | Вывод статистики контекста памяти в лог PostgreSQL после завершения транзакции |
Для установки параметра используйте команду SET
:
SET tds_fdw.show_finished_memory_stats=1;
Foreign server
Параметры сервера внешних данных:
Параметр | Обязательный | Описание | Ссылки на документацию |
---|---|---|---|
servername | Да | Имя сервера, IP-адрес или fqdn внешнего сервера или DSN, указанный в файле freetds.conf ; в опции DSN можно передать через запятую список серверов, при этом указанные в списке серверы будут последовательно применяться до первого успешного подключения; используется для автоматического переключения на другой сервер в случае неисправности;Значение по умолчанию – 127.0.0.1 | FreeTDS name lookup |
port | Нет | Порт стороннего сервера; параметр опциональный. Можно не указывать порт в этом параметре, а указать в файле freetds.conf , если в параметре servername указан DSN | |
database | Нет | Внешняя база данных для подключения | |
dbuse | Нет | Подключаться напрямую к БД, если параметр dbuse = 0 (значение по умолчанию);Если dbuse не равен 0 , tds_fdw будет подключаться к базе данных по умолчанию, затем выберет базу данных вызовом функции dbuse() из библиотеки DB-Library | |
language | Нет | Язык, используемый в сообщениях, и локаль, используемая для форматирования дат; FreeTDS по умолчанию использует us_english , но также может определить язык в freetds.conf | – MS SQL Server: SET LANGUAGE in MS SQL Server; – Sybase ASE: Sybase ASE login options и SET LANGUAGE in Sybase ASE |
character_set | Нет | Клиентский набор символов, используемый для подключения, если нужно устанавлив ать его по какой-то причине; Для протокола TDS версии выше 7.0, подключение использует UCS-2, данный параметр не требуется менять в большинстве случаев | Localization and TDS 7.0 |
tds_version | Нет | Версия протокола TDS используемого для данного сервера | Choosing a TDS protocol version; History of TDS Versions |
msg_handler | Нет | Функция обработчика сообщений TDS; Допустимые значения: – notice : сообщения от TDS будут переданы в сообщения PostgreSQL;– blackhole (по умолчанию): сообщения TDS будут игнорироваться | |
fdw_startup_cost | Нет | Стоимость, которая используется при планировании запросов для представления накладных расходов на использование этого источника внешних данных | |
fdw_tuple_cost | Нет | Стоимость, которая используется при планировании запросов для представления накладных расходов на выборку строк с этого сервера |
Foreign table
Параметры внешней таблицы:
Параметр | Обязательный | Описание |
---|---|---|
query | Да, если не указан параметр table_name | Строка запроса формирующая внешнюю таблицу; не может быть указан одновременно с параметром table_name |
schema_name | Нет | Имя схемы содержащей внешнюю таблицу; имя схемы может быть также включено в параметр table_name |
table_name | Да, если не указан параметр query | Имя внешней таблицы; не может быть указан одновременно с параметром query ; алиас: table |
match_column_names | Нет | Задает логический признак, следует ли сопоставлять локальные столбцы с удаленными столбцами путем сравнения их имен (1 ) или использовать порядок их отображения в результирующем наборе (0 ) |
use_remote_estimate | Нет | Задает логический признак, оценивать ли размер таблицы, выполняя какую-либо операцию на удаленном сервере (как определено row_estimate_method ), или использовать локальную оценку, как определено local_tuple_estimate |
local_tuple_estimate | Нет | Локально установленная оценка количества кортежей; используется, когда параметр use_remote_estimate выключен (0 ) |
row_estimate_method | Нет | Может принимать одно из следующих значений: – execute (значение по умолчанию): выполнить запрос на удаленном сервере и получить актуальное количество строк в запросе;– showplan_all : получить расчетное количество строк с использованием MS SQL Server's SET SHOWPLAN_ALL |
column_name | Нет | Допустимый параметр столбцов в foreign table – имя столбца на удаленном сервере; если этот параметр не задан, предполагается, что удаленное имя столбца совпадает с локальным именем столбца; если для match_column_names для таблицы установлено значение 0 , то имена столбцов не используются и этот параметр игнорируется |
Пример:
Использование table_name
:
CREATE FOREIGN TABLE mssql_table (
id integer,
data varchar)
SERVER mssql_svr
OPTIONS (table_name 'dbo.mytable', row_estimate_method 'showplan_all');
Использование schema_name
и table_name
:
CREATE FOREIGN TABLE mssql_table (
id integer,
data varchar)
SERVER mssql_svr
OPTIONS (schema_name 'dbo', table_name 'mytable', row_estimate_method 'showplan_all');
Использование query
:
CREATE FOREIGN TABLE mssql_table (
id integer,
data varchar)
SERVER mssql_svr
OPTIONS (query 'SELECT * FROM dbo.mytable', row_estimate_method 'showplan_all');
Использование внешнего column_name
:
CREATE FOREIGN TABLE mssql_table (
id integer,
col2 varchar OPTIONS (column_name 'data'))
SERVER mssql_svr
OPTIONS (schema_name 'dbo', table_name 'mytable', row_estimate_method 'showplan_all');
User mapping
Параметры соответствия пользователей:
Параметр | Обязательный | Описание |
---|---|---|
username | Да | Логин пользователя на внешнем сервере |
password | Нет | Пароль пользователя на внешнем сервере; если не задан, то поиск пароля будет выполня ться по параметрам сервера из foreign server в хранилище pg_auth_config |
Пример:
CREATE USER MAPPING FOR postgres
SERVER mssql_svr
OPTIONS (username 'sa', password '');
Foreign schema
Параметр | Обязательный | Значение по умолчанию | Описание |
---|---|---|---|
import_default | Нет | false | Задает включение значения DEFAULT для столбцов в определения внешних таблиц |
import_not_null | Нет | true | Задает включение ограничения столбца NOT NULL в определения внешних таблиц |
Пример:
IMPORT FOREIGN SCHEMA dbo
EXCEPT (mssql_table)
FROM SERVER mssql_svr
INTO public
OPTIONS (import_default 'true');
Explain
EXPLAIN (VERBOSE) показывает запрос, сформированный в удаленной системе:
explain select * from tds."Inventory";
Пример ответа:
NOTICE: tds_fdw: Query executed correctly
NOTICE: tds_fdw: Getting results
QUERY PLAN
---------------------------------------------------------------------
Foreign Scan on "Inventory" (cost=200.00..500.04 rows=4 width=100)
(1 row)
Замечания
-
Возможна исключительная ситуация, когда из MS SQL Server при работе с данными в Unicode получены ошибки вида:
NOTICE: DB-Library notice: Msg #: 4004, Msg state: 1, Msg: Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier., Server: PILLIUM\SQLEXPRESS, Process: , Line: 1, Level: 16
ERROR: DB-Library error: DB #: 4004, DB Msg: General SQL Server error: Check messages from the SQL Server, OS #: -1, OS Msg: (null), Level: 16В этом случае необходимо вручную установить параметр
tds_version
в файлеfreetds.conf
в значение 7.0 или выше. -
Несмотря на то, что новые версии протокола TDS используют USC-2 для взаимодействия с сервером, FreeTDS конвертирует UCS-2 в набор символов, выбранный при настройке.
Для того чтобы установить необходимый набор символов, необходимо задать параметр
client charset
в файлеfreetds.conf
. -
Возможно использование шифрованного соединения с базой данных MS SQL Server.
Данная возможность предоставляется драйвером FreeTDS. Для настройки необходимо сконфигурировать файл
freetds.conf
. -
Некоторые типы данных, используемы е в MS SQL Server, например
DATETIMEOFFSET
, не поддерживаются или не имеют аналогов в Pangolin.Необходимо это учитывать при подготовке к настройке оболочки внешних данных.
Описание в документации:
Доработка
В рамках доработки tds_fdw
было реализовано использование защищенного хранилища паролей pg_auth_config
.
Описание утилиты шифрования и хранения параметров подключения к базе данных (pg_auth_config
) в документе «Функциональное администрирование», раздел «Засекречивание и хранение параметров подключения».
Параметры подключения к внешней базе данных берутся из pg_auth_config
при условии, если они:
- не указаны в
pg_user_mappings
; - присутствуют в
pg_auth_config
.
Установка
Для работы расширения tds_fdw
необходимо, чтобы в операционной системе был установлен драйвер freetds
версии не ниже 1.1.20. Репозиторий EPEL в /etc/yum.repos.d/mirror.repo
должен быть включен.
Установка драйвера freetds
:
sudo yum install freetds
Вместе с установкой драйвера будут установлены зависимости:
freetds-libs
;unixODBC
.
При наличии прав администратора СУБД включение модуля выполняется запросом:
CREATE EXTENSION tds_fdw SCHEMA ext;
Исключительная ситуация следующего вида при создании расширения в базе данных означает, что драйвер freetds
был установлен некорректно или его версия ниже 1.1.20.
ERROR: could not load library "/usr/pangolin-5.4.0/lib/tds_fdw.so": libsybdb.so.5: cannot open shared object file: No such file or directory
Настройка
Добавьте параметры подключения к базе данных MSSQL при помощи утилиты pg_auth_config
:
pg_auth_config add --host <ip_address_mssql> --port <mssql_port> --user <mssql_user> --database <mssql_database>
Пароль будет запрошен интерактивно.
Выдайте права на использование расширения пользователю:
GRANT USAGE ON FOREIGN DATA WRAPPER tds_fdw TO <user>;
Использование модуля
-
Создайте сторонний сервер MSSQL.
CREATE SERVER mssql_svr
FOREIGN DATA WRAPPER tds_fdw
OPTIONS (servername '127.0.0.1', port '1433', database 'tds_fdw_test'); -
Выдайте права на использование стороннего сервера пользователю.
GRANT USAGE ON FOREIGN SERVER mssql_svr TO tdsuser;
-
Добавьте параметры подключения к базе данных MsSQL в хранилище
pg_auth_config
.pg_auth_config add --host <IP-адрес> --port <Порт> --user mssql_user --database test_mssqldb
-
Создайте соответствие пользователей в БД Pangolin и MSSQL.
CREATE USER MAPPING FOR <postgres_user>
SERVER mssql_svr
OPTIONS (username 'mssql_user'); -
Создайте стороннюю таблицу или выполнить импорт схемы.
-
сторонняя таблица:
CREATE FOREIGN TABLE pgschema.mssql_table (
id integer,
data varchar)
SERVER mssql_svr
OPTIONS (schema_name 'dbo', table_name 'mytable', row_estimate_method 'showplan_all'); -
импорт схемы:
IMPORT FOREIGN SCHEMA dbo
FROM SERVER mssql_svr
INTO pgschema
OPTIONS (import_default 'true');
-
-
Выполните транзакцию.
SELECT * FROM pgschema.mssql_table;
Ссылки на документацию разработчика
Дополнительно поставляемый модуль tds_fdw: https://access.crunchydata.com/documentation/tds_fdw/latest/.
Исходный код расширения tds_fdw: https://github.com/tds-fdw/tds_fdw.
Описание драйвера FreeTDS: https://www.freetds.org/index.html.