J.6. tds_fdw#

J.6. tds_fdw

J.6. tds_fdw

J.6.1. Обзор

Версия: 2.0.5

Скачать с nexus-public

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

Этот адаптер внешних данных требует библиотеку, которая реализует интерфейс DB-Library, такую как FreeTDS. Это было протестировано с FreeTDS, но не с проприетарными реализациями DB-Library.

Это должно поддерживать Tantor SE 14+.

Текущая версия еще не поддерживает JOIN push-down или операции записи.

Он поддерживает WHERE и pushdown столбцов, когда match_column_names включен.

J.6.2. Установка

Чтобы установить tds_fdw, cкачайте установочный скрипт db_extension_installer.sh и сделайте его исполняемым:

wget https://public.tantorlabs.ru/db_extension_installer.sh && \
chmod +x db_extension_installer.sh

Далее вы можете установить tds_fdw:

J.6.2.1. Локально из скачанного пакета

  1. Скачайте пакет tds_fdw, подходящий для вашей операционной системы, с сайта nexus-public.

  2. Выполните установку tds_fdw с помощью db_extension_installer.sh из скачанного пакета:

    ./db_extension_installer.sh \
      --from-file=<path to tds_fdw package>
    

J.6.2.2. Автоматически из репозитория пакетов

  1. Установите значение переменной окружения NEXUS_URL:

    export NEXUS_URL="nexus-public.tantorlabs.ru"
    
  2. Выполните установку tds_fdw с помощью db_extension_installer.sh со следующими параметрами:

    ./db_extension_installer.sh \
      --database-type=tantor \
      --database-major-version=15 \
      --edition=se \
      --extension=tds_fdw
    

J.6.3. Использование

J.6.3.1. Создание Внешнего Сервера

J.6.3.1.1. Опции
J.6.3.1.1.1. Параметры внешнего сервера, которые принимаются:
  • servername

    Требуется: Да

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

    Имя сервера, адрес или имя хоста удаленного сервера.

    Это может быть DSN, как указано в freetds.conf. См. Поиск имени FreeTDS.

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

  • port

    Требуется: Нет

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

  • database

    Требуется: Нет

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

  • dbuse

    Требуется: Нет

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

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

    Для Azure, dbuse в настоящее время должен быть установлен в 0.

  • language

    Требуется: Нет

    Язык для использования в сообщениях и локаль для использования в форматах дат. FreeTDS может по умолчанию использовать us_english на большинстве систем. Вы, вероятно, также можете изменить это в freetds.conf.

    Для получения информации, связанной с этим для MS SQL Server, см. SET LANGUAGE в MS SQL Server.

    Для получения информации, связанной с Sybase ASE, см. опции входа в Sybase ASE и SET LANGUAGE в Sybase ASE.

  • character_set

    Требуется: Нет

    Клиентская кодировка, используемая для подключения, если вам нужно установить это по какой-либо причине.

    Для версий протокола TDS 7.0+ соединение всегда использует UCS-2, поэтому этот параметр ничего не делает в этих случаях. См. Локализация и TDS 7.0.

  • tds_version

    Требуется: Нет

    Версия протокола TDS для использования с этим сервером. См. Выбор версии протокола TDS и История версий TDS.

  • msg_handler

    Требуется: Нет

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

    Функция, используемая для обработчика сообщений TDS. Опции включают «notice» и «blackhole». С опцией «notice» сообщения TDS преобразуются в уведомления Tantor SE. С опцией «blackhole» сообщения TDS игнорируются.

  • fdw_startup_cost

    Требуется: Нет

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

  • fdw_tuple_cost

    Требуется: Нет

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

  • sqlserver_ansi_mode

    Требуется: Нет

    Эта опция поддерживается только для SQL Server. По умолчанию установлено значение «false». Установка этого параметра в «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 Server, которые явно устанавливают их в OFF, если не настроено иначе.

J.6.3.1.1.2. Параметры внешней таблицы, принимаемые в определении сервера:

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

  • use_remote_estimate

  • row_estimate_method

J.6.3.1.2. Пример
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');

J.6.3.2. Создание внешней таблицы

J.6.3.2.1. Опции
J.6.3.2.1.1. Принимаемые параметры внешней таблицы:
  • query

    Требуется: Да (взаимоисключающе с table)

    Строка запроса для использования при запросе внешней таблицы.

  • schema_name

    Требуется: Нет

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

  • table_name

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

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

    Таблица на удалённом сервере для выполнения запроса.

  • match_column_names

    Требуется: Нет

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

  • use_remote_estimate

    Требуется: Нет

    Будем ли мы оценивать размер таблицы, выполняя некоторую операцию на удаленном сервере (как определено row_estimate_method), или будем использовать только локальную оценку, как определено local_tuple_estimate.

  • local_tuple_estimate

    Требуется: Нет

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

  • row_estimate_method

    Требуется: Нет

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

    Это может быть одно из следующих значений:

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

    • showplan_all: Это получает оценочное количество строк, используя SET SHOWPLAN_ALL MS SQL Server.

J.6.3.2.1.2. Параметры столбцов внешней таблицы, которые принимаются:
  • column_name

    Требуется: Нет

    Имя столбца на удаленном сервере. Если это не установлено, предполагается, что удаленное имя столбца совпадает с локальным именем столбца. Если для таблицы параметр match_column_names установлен в 0, то имена столбцов вообще не используются, поэтому это игнорируется.

J.6.3.2.2. Пример

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

Или используя определение запроса:

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

J.6.3.3. Создание отображения пользователя

J.6.3.3.1. Опции

Параметры сопоставления пользователя, которые принимаются:

  • username

    Требуется: Да

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

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

  • password

    Требуется: Да

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

J.6.3.3.2. Пример
CREATE USER MAPPING FOR postgres
   SERVER mssql_svr 
   OPTIONS (username 'sa', password '');

J.6.3.4. Импорт иностранной схемы

J.6.3.4.1. Опции
J.6.3.4.1.1. Принимаемые параметры внешней схемы:
  • import_default

    Требуется: Нет

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

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

  • import_not_null

    Требуется: Нет

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

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

J.6.3.4.2. Пример
IMPORT FOREIGN SCHEMA dbo
   EXCEPT (mssql_table)
   FROM SERVER mssql_svr
   INTO public
   OPTIONS (import_default 'true');

J.6.3.5. Переменные

J.6.3.5.1. Доступные переменные
  • tds_fdw.show_before_row_memory_stats - выводить статистику контекста памяти в журнал Tantor SE перед извлечением каждой строки.

  • tds_fdw.show_after_row_memory_stats - выводить статистику контекста памяти в журнал Tantor SE после извлечения каждой строки.

  • tds_fdw.show_finished_memory_stats - выводить статистику контекста памяти в журнал Tantor SE после завершения запроса.

J.6.3.5.2. Установка переменных

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

postgres=# SET tds_fdw.show_finished_memory_stats=1;
SET

J.6.3.6. EXPLAIN

EXPLAIN (VERBOSE) покажет запрос, отправленный на удаленную систему.

J.6.4. Заметки о наборах символов/кодировке

  1. Если вы получаете ошибку, подобную этой, с MS SQL Server при работе с данными Unicode:

    Примечание

    Уведомление DB-Library: № сообщения: 4004, Состояние сообщения: 1, Сообщение: Данные Unicode в правиле сортировки «только Unicode» или данные ntext не могут быть отправлены клиентам, использующим DB-Library (таким как ISQL) или ODBC версии 3.7 или более ранней., Server: PILLIUM, Процесс: , Строка: 1, Уровень: ОШИБКА 16: Ошибка DB-Library: DB #: 4004, Сообщение DB: Общая ошибка SQL Server: Проверьте сообщения от SQL Server, OS #: -1, Сообщение OS: (null), Уровень: 16

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

  2. Хотя многие более новые версии протокола TDS будут использовать только USC-2 для связи с сервером, FreeTDS преобразует UCS-2 в набор символов клиента по вашему выбору. Чтобы установить набор символов клиента, можно установить client charset в freetds.conf. См. Файл freetds.conf и Локализация и TDS 7.0.

J.6.5. Зашифрованные соединения с MSSQL

Это обрабатывается FreeTDS, поэтому это нужно настроить в freetds.conf. См. Файл freetds.conf и в freetds.conf settings ищите encryption.