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)

Замечания#

  1. Возможна исключительная ситуация, когда из 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 или выше.

  2. Несмотря на то, что новые версии протокола TDS используют USC-2 для взаимодействия с сервером, FreeTDS конвертирует UCS-2 в набор символов, выбранный при настройке.

    Для того чтобы установить необходимый набор символов, необходимо задать параметр client charset в файле freetds.conf.

  3. Возможно использование шифрованного соединения с базой данных MS SQL Server.

    Данная возможность предоставляется драйвером FreeTDS. Для настройки необходимо сконфигурировать файл freetds.conf.

  4. Некоторые типы данных, используемые в 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>;

Использование модуля#

  1. Создайте сторонний сервер MSSQL.

    CREATE SERVER mssql_svr
       FOREIGN DATA WRAPPER tds_fdw
       OPTIONS (servername '127.0.0.1', port '1433', database 'tds_fdw_test');
    
  2. Выдайте права на использование стороннего сервера пользователю.

    GRANT USAGE ON FOREIGN SERVER mssql_svr TO tdsuser;
    
  3. Добавьте параметры подключения к базе данных MsSQL в хранилище pg_auth_config.

    pg_auth_config add --host <IP-адрес> --port <Порт> --user mssql_user --database test_mssqldb
    
  4. Создайте соответствие пользователей в БД Pangolin и MSSQL.

    CREATE USER MAPPING FOR <postgres_user>
       SERVER mssql_svr
       OPTIONS (username 'mssql_user');
    
  5. Создайте стороннюю таблицу или выполнить импорт схемы.

    • сторонняя таблица:

      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');
      
  6. Выполните транзакцию.

    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.