tds_fdw
Оболочка внешних данных MSSQL, Sybase.
Связанные компоненты: драйвер
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 (VERBOSE) показывает запрос, сформированный в удаленной системе:
explain select * from tds."Inventory";
Пример ответа:
Раскрыть type=sqlNOTICE: 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
, не поддерживаются или не имеют аналогов в Компонненте. Необходимо это учитывать при подготовке к настройке оболочки внешних данных.
Расширение
tds_fdw
появилось в дистрибутиве поставки Компонента с версии 4.4.0.-
Создать сторонний сервер 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 10.10.0.1 --port 1433 --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.