H.2. tds_fdw

Модуль tds_fdw предоставляет обёртку сторонних данных tds_fdw, которая может подключаться к базам данных, использующим протокол TDS (Tabular Data Stream, поток табличных данных), например Sybase и Microsoft SQL Server.

Для этой обёртки требуется библиотека, реализующая интерфейс DB-Library, например FreeTDS. Обёртка была протестирована с FreeTDS, но не с проприетарными реализациями DB-Library.

H.2.1. Ограничения

При включённом match_column_names поддерживаются условия WHERE и вынос столбцов наружу. Однако вынос наружу JOIN и пишущие операции не поддерживаются.

H.2.2. Установка tds_fdw

tds_fdw поставляется вместе с Postgres Pro Standard в виде отдельного пакета tds_fdw (подробные инструкции по установке приведены в Главе 16).

Установите расширение tds_fdw с помощью команды CREATE EXTENSION.

H.2.3. Настройка tds_fdw

H.2.3.1. Управление наборами символов/кодировкой

Хотя многие новые версии протокола TDS для связи с сервером используют только стандарт USC-2, FreeTDS преобразует UCS-2 в клиентскую кодировку по вашему выбору. Чтобы установить клиентскую кодировку, можно задать для переменной client charset значение freetds.conf. За подробностями обратитесь к описанию The freetds.conf File (файла freetds.conf) и Localization and TDS 7.0 (локализации и TDS 7.0).

При получении указанной ниже ошибки во время работы Microsoft 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

В таком случае придётся вручную указать в файле freetds.conf версию tds 7.0 или выше. За подробностями обратитесь к описанию Файла freetds.conf и Выбора версии протокола TDS.

H.2.3.2. Настройка зашифрованных подключений к MSSQL

Такие подключения настраиваются в файле freetds.conf. Найдите "шифрование" в разделе freetds.conf settings файла freetds.conf.

H.2.4. Использование

Чтобы обеспечить доступ к базе данных с помощью tds_fdw, выполните следующие шаги:

  1. Создайте объект стороннего сервера с помощью CREATE SERVER, который будет представлять каждую базу данных, доступную для подключения.

  2. Создайте сопоставление пользователей с помощью CREATE USER MAPPING для каждого пользователя базы данных, которому нужно разрешить доступ к каждому стороннему серверу.

  3. Создайте стороннюю таблицу с помощью CREATE FOREIGN TABLE или IMPORT FOREIGN SCHEMA для каждой таблицы, к которой нужно получить доступ.

H.2.4.1. Создание стороннего сервера

Чтобы создать сторонний сервер, выполните команду CREATE SERVER со следующими параметрами:

servername

Имя сервера, адрес или имя узла стороннего сервера. Значением может быть DSN, как указано в freetds.conf. За подробностями обратитесь к разделу Поиск по имени FreeTDS. Можно задать в этом параметре список имён серверов, разделённый запятыми, тогда будут выполняться попытки подключиться к каждому серверу до тех пор, пока не будет установлено первое подключение. Такой список может использоваться для автоматического переключения на резервный сервер.

Обязательный: да

Значение по умолчанию: 127.0.0.1

port

Порт стороннего сервера. Вместо этого его можно указать в freetds.conf (если servername является DSN).

Обязательный: нет

database

База данных для подключения на этом сервере

Обязательный: нет

dbuse

Если dbuse равен 0, tds_fdw подключится напрямую к database. Если dbuse не равен 0, tds_fdw подключится к базе данных сервера по умолчанию, а затем выберет базу данных, вызвав функцию dbuse() библиотеки DB-Library. Чтобы использовать Azure, для dbuse необходимо установить значение 0.

Обязательный: нет

По умолчанию: 0

language

Язык, используемый для сообщений, и локаль, используемая для форматов дат. В большинстве систем для FreeTDS по умолчанию может использоваться английский (США). Вероятно, их также можно изменить в freetds.conf. За дополнительной информацией по этой настройке для MS SQL Server обратитесь к разделу SET LANGUAGE in MS SQL Server (SET LANGUAGE в MS SQL Server), а для Sybase ASE — к разделам Sybase ASE login options (Параметры входа в Sybase ASE) и SET LANGUAGE in Sybase ASE (SET LANGUAGE в Sybase ASE).

Обязательный: нет

character_set

Клиентская кодировка, которая будет использоваться при подключении. В протоколе TDS версии 7.0 и выше для подключения всегда используется UCS-2, поэтому в таких случаях этот параметр ничего не делает. За подробностями обратитесь к разделу Localization and TDS 7.0 (локализация и TDS 7.0).

Обязательный: нет

tds_version

Версия протокола TDS, которая будет использоваться для этого сервера. За подробностями обратитесь к разделам Choosing a TDS protocol version (Выбор версии протокола TDS) и History of TDS Versions (История версий TDS).

Обязательный: нет

msg_handler

Функция, используемая для обработчика сообщений TDS. Допустимо одно из следующих значений:

  • notice: сообщения TDS преобразуются в замечания PostgreSQL

  • blackhole: сообщения TDS игнорируются

Обязательный: нет

По умолчанию: blackhole

fdw_startup_cost

Стоимость, которая используется при планировании запросов для представления издержек использования этой обёртки сторонних данных.

Обязательный: нет

fdw_tuple_cost

Стоимость, которая используется при планировании запросов для представления издержек выборки строк с этого сервера.

Обязательный: нет

sqlserver_ansi_mode

Стоимость, которая используется для представления издержек выборки строк с этого сервера, используемых при планировании запросов.

Этот параметр поддерживается только для SQL Server. Установка значения true включит следующие параметры стороннего сервера после успешного подключения к нему:

  • CONCAT_NULLS_YIELDS_NULL ON

  • ANSI_NULLS ON

  • ANSI_WARNINGS ON

  • QUOTED_IDENTIFIER ON

  • ANSI_PADDING ON

  • ANSI_NULL_DFLT_ON ON

Эти параметры в целом сопоставимы с параметром SQL Server ANSI_DEFAULTS. Параметр sqlserver_ansi_mode, напротив, в настоящее время не активирует следующие параметры:

  • CURSOR_CLOSE_ON_COMMIT

  • IMPLICIT_TRANSACTIONS

Это соответствует поведению собственных драйверов ODBC и OLEDB для SQL-серверов, которые явно отключают эти параметры, если не настроено иначе.

Обязательный: нет

По умолчанию: false

Некоторые параметры сторонней таблицы также могут быть установлены на уровне сервера. К ним относятся:

Пример H.1. Создание стороннего сервера

CREATE SERVER mssql_svr
    FOREIGN DATA WRAPPER tds_fdw
    OPTIONS (servername '127.0.0.1', port '1433', database 'tds_fdw_test', tds_version '7.1');

H.2.4.2. Создание сопоставлений пользователей

Чтобы создать сопоставление пользователя, выполните команду CREATE USER MAPPING со следующими параметрами:

username

Имя пользователя учётной записи на стороннем сервере

Важно

Если вы используете Azure SQL, имя пользователя для стороннего сервера должно быть в формате username@servername. Если используется только имя пользователя, аутентификация завершится ошибкой.

Обязательный: да

password

Пароль учётной записи на стороннем сервере

Обязательный: да

Пример H.2. Создание сопоставления пользователя

CREATE USER MAPPING FOR postgres
    SERVER mssql_svr 
    OPTIONS (username 'sa', password '');

H.2.4.3. Создание сторонней таблицы

Чтобы создать стороннюю таблицу, выполните команду CREATE FOREIGN TABLE со следующими параметрами:

query

Строка запроса, используемая для обращения к сторонней таблице

Обязательный: Да (взаимоисключающий с table_name)

schema_name

Схема, в которой находится таблица. Имя схемы также можно включить в table_name.

Обязательный: нет

table_name

Таблица на стороннем сервере, к которой выполняется запрос

Псевдонимы: таблица

Обязательный: Да (взаимоисключающий с query)

match_column_names

Сопоставить локальные столбцы с удалёнными, сравнивая их имена в таблицах вместо использования порядка, в котором они появляются в наборе результатов. Требуется для WHERE и выноса столбцов наружу.

Обязательный: нет

use_remote_estimate

Оценить размер таблицы, выполнив какую-нибудь операцию на удалённом сервере, как определено в row_estimate_method, вместо использования локальной оценки, как определено в local_tuple_estimate

Обязательный: нет

local_tuple_estimate

Локально заданная оценка количества кортежей, которая используется, когда отключён параметр use_remote_estimate

Обязательный: нет

row_estimate_method

Может принимать одно из следующих значений:

  • execute: выполнить запрос на удалённом сервере и получить фактическое количество строк в запросе

  • showplan_all: получить оценку количества строк с помощью MS SQL Server SET SHOWPLAN_ALL

Обязательный: нет

По умолчанию: execute

Пример H.3. Создание сторонней таблицы

Использование определения 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');

Установка имени расположенного удалённо столбца:

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');

H.2.4.4. Импорт сторонней схемы

Чтобы импортировать стороннюю схему, выполните команду IMPORT FOREIGN SCHEMA со следующими параметрами:

import_default

Управляет включением выражений столбцов DEFAULT в определения сторонних таблиц

Обязательный: нет

По умолчанию: false

import_not_null

Управляет включением ограничений столбцов NOT NULL в определения сторонних таблиц

Обязательный: нет

По умолчанию: true

Пример H.4. Импорт сторонней схемы

IMPORT FOREIGN SCHEMA dbo
    EXCEPT (mssql_table)
    FROM SERVER mssql_svr
    INTO public
    OPTIONS (import_default 'true');

H.2.4.5. Задание переменных

Чтобы задать переменную, выполните команду SET.

Доступны следующие переменные:

tds_fdw.show_before_row_memory_stats

Выводить статистику контекста памяти в журнал Postgres Pro перед выборкой каждой строки

tds_fdw.show_after_row_memory_stats

Выводить статистику контекста памяти в журнал Postgres Pro после выборки каждой строки

tds_fdw.show_finished_memory_stats

Вывести статистику контекста памяти в журнал Postgres Pro после завершения запроса

Пример H.5. Задание переменной

postgres=# SET tds_fdw.show_finished_memory_stats=1;
SET

H.2.4.6. Просмотр запроса, выданного на удалённо расположенной системе

Чтобы просмотреть запрос, выданный в удалённо расположенной системе, выполните команду EXPLAIN [ VERBOSE ].

H.2.5. Автор

Джефф Монти