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

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

Ограничения

Расширение tds_fdw появилось в дистрибутиве поставки Компонента с версии 4.4.0.

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

  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 10.10.0.1 --port 1433 --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.
Предыдущий раздел
tcn
Следующий раздел
test_decoding
Была ли страница полезной?