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
settingsfreetds.conf
.
H.2.4. Использование #
Чтобы обеспечить доступ к базе данных с помощью tds_fdw, выполните следующие шаги:
Создайте объект стороннего сервера с помощью CREATE SERVER, который будет представлять каждую базу данных, доступную для подключения.
Создайте сопоставление пользователей с помощью CREATE USER MAPPING для каждого пользователя базы данных, которому нужно разрешить доступ к каждому стороннему серверу.
Создайте стороннюю таблицу с помощью 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 преобразуются в замечания PostgreSQLblackhole
: сообщения 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 ServerSET 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.5. Автор #
Джефф Монти