H.7. TDS Foreign data wrapper#

H.7. TDS Foreign data wrapper

H.7. TDS Foreign data wrapper #

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

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

Это должно поддерживать PostgreSQL 9.2+.

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

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

H.7.1. О tds_fdw #

Версия: 2.0.4

GitHub

Автор: Geoff Montee

H.7.2. Установка на RHEL и клонах (CentOS, Rocky Linux, AlmaLinux, Oracle…) #

Этот раздел описывает, как установить tds_fdw на Rocky Linux 8.9. Дистрибутивы RHEL должны быть аналогичными.

Примечание

Для простоты мы будем использовать yum, так как он работает как псевдоним для dnf на более новых дистрибутивах.

H.7.2.1. Вариант A: yum/dnf (выпущенные версии) #

H.7.2.1.1. баз данных #

Если вам нужно установить PostgreSQL, сделайте это, следуя инструкциям по установке для RHEL.

H.7.2.1.2. tds_fdw #

Команда разработчиков PostgreSQL упаковывает tds_fdw, но они не предоставляют FreeTDS.

Сначала установите репозиторий EPEL:

sudo yum install epel-release

А затем установите tds_fdw:

sudo yum install tds_fdw11.x86_64

H.7.2.2. Вариант B: Скомпилировать tds_fdw #

H.7.2.2.1. баз данных #

Если вам нужно установить PostgreSQL, сделайте это, следуя инструкциям по установке для RHEL.

Убедитесь, что, кроме postgresqlXX-server, postgresqlXX-devel также установлен

Вам нужно включить репозиторий PowerTools для RHEL8 и его клонов, или репозиторий CBR для RHEL9 и его клонов.

H.7.2.2.2. Установите FreeTDS devel и зависимости для сборки #

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

Примечание

Вам необходимо установить репозиторий EPEL, чтобы установить FreeTDS

sudo yum install epel-release
sudo yum install freetds-devel

Некоторые другие зависимости также необходимы для установки PostgreSQL и затем компиляции tds_fdw:

sudo yum install clang llvm make redhat-rpm-config wget
H.7.2.2.3. ВАЖНО: CentOS7/Oracle7 и PostgreSQL >= 11 #

При использовании официальных пакетов PostgreSQL с postgresql.org, JIT с bitcode включен по умолчанию и потребует установки llvm5 и clang из LLVM5 в /opt/rh/llvm-toolset-7/root/usr/bin/clang для возможности компиляции.

У вас есть LLVM5 в репозитории EPEL CentOS7, но нет LLVM7, поэтому вам нужно установить коллекции программного обеспечения CentOS.

Вы можете легко сделать это с помощью следующих команд:

sudo yum install centos-release-scl
H.7.2.2.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}
make USE_PGXS=1 PG_CONFIG=/usr/pgsql-11/bin/pg_config
sudo make USE_PGXS=1 PG_CONFIG=/usr/pgsql-11/bin/pg_config install

Примечание

Если у вас есть несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, затем настройте PG_CONFIG соответствующим образом.

H.7.2.2.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

yum install git
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1 PG_CONFIG=/usr/pgsql-11/bin/pg_config
sudo make USE_PGXS=1 PG_CONFIG=/usr/pgsql-11/bin/pg_config install

Примечание

Если у вас есть несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, затем настройте PG_CONFIG соответствующим образом.

H.7.2.3. Финальные шаги #

H.7.2.3.1. Запустить сервер #

Если это новая установка, инициализируйте каталог данных и запустите сервер:

sudo /usr/pgsql-11/bin/postgresql11-setup initdb
sudo systemctl enable postgresql-11.service
sudo systemctl start postgresql-11.service
H.7.2.3.2. Установить расширение #
/usr/pgsql-11/bin/psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;

H.7.3. Установка на Ubuntu #

Этот раздел описывает, как установить tds_fdw на Ubuntu 18.04. Другие дистрибутивы Ubuntu должны быть аналогичными.

H.7.3.1. Установите FreeTDS и создайте зависимости #

Оболочка внешних данных TDS требует библиотеки, которая реализует интерфейс DB-Library, такой как FreeTDS.

sudo apt-get update
sudo apt-get install libsybdb5 freetds-dev freetds-common

Некоторые другие зависимости также необходимы для установки PostgreSQL и последующей компиляции tds_fdw:

sudo apt-get install gnupg gcc make

H.7.3.2. Установка PostgreSQL #

Если вам нужно установить PostgreSQL, сделайте это, следуя инструкциям по установке apt. Например, чтобы установить PostgreSQL 11 на Ubuntu:

sudo bash -c 'source /etc/os-release; echo "deb http://apt.postgresql.org/pub/repos/apt/ ${VERSION_CODENAME}-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-keys 0xACCC4CF8
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install postgresql-11 postgresql-client-11 postgresql-server-dev-11

Примечание

Если у вас уже установлен PostgreSQL на вашей системе, убедитесь, что пакет postgresql-server-dev-XX также установлен (где XX обозначает вашу версию PostgreSQL).

H.7.3.3. Установить tds_fdw #

H.7.3.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
sudo apt-get install wget
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}/
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.3.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

sudo apt-get install git
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.3.3.3. Запустить сервер #

Если это новая установка, запустите сервер:

sudo service postgresql start
H.7.3.3.4. Установить расширение #
psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;

H.7.4. Установка на Debian #

Этот раздел описывает, как установить tds_fdw на Debian 10. Другие дистрибутивы Debian должны быть аналогичными.

H.7.4.1. Установите FreeTDS и создайте зависимости #

Оболочка внешних данных TDS требует библиотеки, которая реализует интерфейс DB-Library, такой как FreeTDS.

sudo apt-get update
sudo apt-get install libsybdb5 freetds-dev freetds-common

Некоторые другие зависимости также необходимы для установки PostgreSQL и последующей компиляции tds_fdw:

sudo apt-get install gnupg gcc make

H.7.4.2. Установка PostgreSQL #

Если вам нужно установить PostgreSQL, сделайте это, следуя инструкциям по установке apt. Например, чтобы установить PostgreSQL 11 на Debian:

sudo bash -c 'source /etc/os-release; echo "deb http://apt.postgresql.org/pub/repos/apt/ ${VERSION_CODENAME}-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-keys 0xACCC4CF8
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install postgresql-11 postgresql-client-11 postgresql-server-dev-11

Примечание

Если у вас уже установлен PostgreSQL на вашей системе, убедитесь, что пакет postgresql-server-dev-XX также установлен (где XX обозначает вашу версию PostgreSQL).

H.7.4.3. Установить tds_fdw #

H.7.4.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
sudo apt-get install wget
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}/
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.4.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

sudo apt-get install git
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.4.3.3. Запустить сервер #

Если это новая установка, запустите сервер:

sudo service postgresql start
H.7.4.3.4. Установить расширение #
psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;

H.7.5. Установка на openSUSE #

Этот раздел описывает, как установить tds_fdw на openSUSE Leap 15.1. Другие дистрибутивы openSUSE и SUSE должны быть аналогичными.

H.7.5.1. Установите FreeTDS и создайте зависимости #

Оболочка внешних данных TDS требует библиотеки, которая реализует интерфейс DB-Library, такой как FreeTDS.

sudo zypper install freetds-devel

Некоторые другие зависимости также необходимы для установки PostgreSQL и последующей компиляции tds_fdw:

sudo zypper install gcc make

H.7.5.2. Установка PostgreSQL #

Если вам нужно установить PostgreSQL, например, 10.X:

sudo zypper install postgresql10 postgresql10-server postgresql10-devel

Примечание

Если у вас уже установлен PostgreSQL на вашей системе, убедитесь, что пакет postgresqlXX-devel также установлен (где XX обозначает вашу версию PostgreSQL).

H.7.5.3. Установить tds_fdw #

H.7.5.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}/
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.5.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

zypper in git
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.5.3.3. Запустить сервер #

Если это новая установка, запустите сервер:

sudo service postgresql start
H.7.5.3.4. Установить расширение #
psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;

H.7.6. Установка на OSX #

Этот раздел описывает, как установить tds_fdw на OSX, используя Homebrew менеджер пакетов для необходимых пакетов.

H.7.6.1. Установите FreeTDS #

Оболочка внешних данных TDS требует библиотеки, которая реализует интерфейс DB-Library, такой как FreeTDS.

brew install freetds

Note: Если вы устанавливаете FreeTDS из другого источника, например, MacPorts, возможно, вам придется изменить значение TDS_INCLUDE в вызовах make ниже (например, -I/opt/local/include/freetds для MacPorts).

H.7.6.2. Установка PostgreSQL #

Если вам нужно установить PostgreSQL, сделайте это, следуя инструкциям по установке apt. Например, чтобы установить PostgreSQL 9.5 на Ubuntu:

brew install postgres

Или используйте Postgres.app: http://postgresapp.com/

H.7.6.3. Установить tds_fdw #

H.7.6.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}
make USE_PGXS=1 TDS_INCLUDE=-I/usr/local/include/
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.6.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1 TDS_INCLUDE=-I/usr/local/include/
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.6.3.3. Запустить сервер #

Если это новая установка, запустите сервер:

brew services start postgresql

Или эквивалентная команда, если вы не используете Homebrew.

H.7.6.3.4. Установить расширение #
psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;

H.7.7. Установка на Alpine (и Docker) #

Этот раздел описывает, как установить tds_fdw на Alpine Linux 3.10.3. Другие дистрибутивы Alpine Linux должны быть аналогичными.

H.7.7.1. Установите FreeTDS и создайте зависимости #

Оболочка внешних данных TDS требует библиотеки, которая реализует интерфейс DB-Library, такой как FreeTDS.

apk add --update freetds-dev

Некоторые другие зависимости также необходимы для установки PostgreSQL и последующей компиляции tds_fdw:

apk add gcc libc-dev make

В случае, если вы получите fatal error: stdio.h: No such file or directory позже (на make USE_PGXS=1) - установка musl-dev может помочь (https://stackoverflow.com/questions/42366739/gcc-cant-find-stdio-h-in-alpine-linux):

apk add musl-dev

H.7.7.2. Установка PostgreSQL #

Если вам нужно установить PostgreSQL, сделайте это, установив из APK. Например, чтобы установить PostgreSQL 11.6 на Alpine Linux:

apk add postgresql=11.6-r0 postgresql-client=11.6-r0 postgresql-dev=11.6-r0

В образе docker postgres-alpine вам понадобится только

apk add postgresql-dev

H.7.7.3. Установить tds_fdw #

H.7.7.3.1. Сборка из пакета релиза #

Если вы хотите использовать один из пакетов релиза, вы можете загрузить и установить его с помощью чего-то подобного:

export TDS_FDW_VERSION="2.0.4"
apk add wget
wget https://github.com/tds-fdw/tds_fdw/archive/v${TDS_FDW_VERSION}.tar.gz
tar -xvzf v${TDS_FDW_VERSION}.tar.gz
cd tds_fdw-${TDS_FDW_VERSION}/
make USE_PGXS=1
sudo make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.7.3.2. Сборка из репозитория #

Если вы предпочитаете использовать текущую версию разработки, вы можете клонировать и собрать репозиторий git с помощью чего-то вроде следующего:

apk add git
git clone https://github.com/tds-fdw/tds_fdw.git
cd tds_fdw
make USE_PGXS=1
make USE_PGXS=1 install

Примечание

Если у вас установлено несколько версий PostgreSQL и вы не хотите собирать для версии по умолчанию, сначала найдите, где находится бинарный файл pg_config, запишите полный путь, а затем добавьте PG_CONFIG=<PATH> после USE_PGXS=1 в командах make.

H.7.7.3.3. Запустить сервер #

Если это новая установка, создайте начальный кластер и запустите сервер:

mkdir /var/lib/postgresql/data
chmod 0700 /var/lib/postgresql/data
chown postgres. /var/lib/postgresql/data
su postgres -c 'initdb /var/lib/postgresql/data'
mkdir /run/postgresql/
chown postgres. /run/postgresql/
su postgres -c 'pg_ctl start -D /var/lib/postgresql/data "-o -c listen_addresses=\"\""'
H.7.7.3.4. Установить расширение #
psql -U postgres
postgres=# CREATE EXTENSION tds_fdw;
H.7.7.3.5. Пример Dockerfile #

Этот Dockerfile соберет PostgreSQL 11 в Alpine Linux с tds_fdw из основной ветки

FROM library/postgres:11-alpine
RUN apk add --update freetds-dev && \
    apk add git gcc libc-dev make && \
    apk add postgresql-dev postgresql-contrib && \
    git clone https://github.com/tds-fdw/tds_fdw.git && \
    cd tds_fdw && \
    make USE_PGXS=1 && \
    make USE_PGXS=1 install && \
    apk del git gcc libc-dev make && \
    cd ..  && \
    rm -rf tds_fdw

Вы можете легко адаптировать Dockerfile, если хотите использовать пакет релиза.

Этот Dockerfile работает так же, как и официальный образ PostgreSQL, только с добавленным tds_fdw. См. Docker Hub library/postgres для подробностей.

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

H.7.8.1. Создание Внешнего Сервера #

H.7.8.1.1. Опции #
H.7.8.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 преобразуются в уведомления PostgreSQL. С опцией «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, если не настроено иначе.

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

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

  • use_remote_estimate

  • row_estimate_method

H.7.8.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');

H.7.8.2. Создание внешней таблицы #

H.7.8.2.1. Опции #
H.7.8.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.

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

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

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

H.7.8.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');

H.7.8.3. Создание отображения пользователя #

H.7.8.3.1. Опции #

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

  • username

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

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

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

  • password

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

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

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

H.7.8.4. Импорт иностранной схемы #

H.7.8.4.1. Опции #
H.7.8.4.1.1. Принимаемые параметры внешней схемы: #
  • import_default

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

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

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

  • import_not_null

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

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

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

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

H.7.8.5. Переменные #

H.7.8.5.1. Доступные переменные #
  • tds_fdw.show_before_row_memory_stats - выводить статистику контекста памяти в журнал PostgreSQL перед выборкой каждой строки.

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

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

H.7.8.5.2. Установка переменных #

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

postgres=# SET tds_fdw.show_finished_memory_stats=1;
SET

H.7.8.6. EXPLAIN #

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

H.7.9. Заметки о наборах символов/кодировке #

  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.

H.7.10. Зашифрованные соединения с MSSQL #

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

H.7.11. Поддержка #

Если вы обнаружите какие-либо ошибки или хотите запросить улучшения, пожалуйста, отправьте свои комментарии на страницу проблем проекта на GitHub.

Кроме того, я подписан на несколько списков рассылки PostgreSQL, включая pgsql-general и pgsql-hackers. Если tds_fdw упоминается в электронном письме, отправленном в один из этих списков, я обычно это вижу.

H.7.12. Отладка #

H.7.12.1. Тестирование скриптов #

Тестирование должно следовать этому рабочему процессу:

  • Сначала создайте MSSQL Server

    1. Создайте сервер (локальный, контейнер, виртуальная машина или azure)

    2. Создайте тестовую базу данных с соответствующим пользователем и правами доступа

    3. Запустите mssql-tests.py на этом сервере.

  • Далее, создайте сервер PostgreSQL

    1. Создайте сервер (на вашем компьютере, с помощью docker или VM)

    2. Скомпилируйте и установите расширение tds_fdw

    3. Создайте тестовую базу данных и схему с правильным пользователем и привилегиями доступа

    4. На этой базе данных вам сначала нужно установить tds_fdw: CREATE EXTENSION tds_fdw;

    5. Вы можете запустить postgresql_test.py

H.7.12.2. Отладка #

Может быть интересно создать полную настройку для целей отладки и использовать тесты, чтобы проверить, не произошло ли регресса. Для этого вы можете использовать параметр --debugging при запуске postgresql-tests.py.

Тестовая программа остановится сразу после создания соединения и предоставит вам PID бэкенда, используемый для тестирования. Это позволит вам подключить gdb в другой сессии оболочки (gdb --pid=<PID>). После подключения с помощью gdb, просто установите точки останова там, где нужно, и выполните cont. Затем вы можете нажать любую клавишу в тестовом скрипте оболочки, чтобы начать тестирование.

Также, в случае сбоя теста, --debugging позволит точно определить, где скрипт завершился с ошибкой, используя информацию класса Diagnostics из psycopg2, и предоставит соответствующий SQL, внедренный в PostgreSQL.

H.7.12.3. Добавление или изменение тестов #

Существуют две папки, в которые добавляются тесты:

  • tests/mssql содержит тесты для взаимодействия с сервером MSSQL с использованием mssql-tests.py. Такие тесты обычно используются для создания необходимых вещей для самих тестов PostgreSQL.

  • tests/postgresql содержит тест для взаимодействия с сервером PostgreSQL с использованием postgresql-tests.py. Такие тесты обычно используются для проверки функциональности tds_fdw.

Каждый тест состоит из двух файлов с одинаковым именем и различным расширением в этом формате:

XXX_description

Например: 000_my_test.json и 000_my_test.sql.

Правило1: XXX используется для задания порядка скриптов.

Правило2: Если скрипт создает элемент или добавляет строку, он должен предполагать, что такой элемент или строка уже существует, и обрабатывать это (например, удаляя таблицу перед ее созданием)

H.7.12.3.1. Файл JSON #

Всегда имеет следующий формат:

{
    "test_desc" : "<My description>",
    "server" : {
        "version" : {
            "min" : "<Min.Required.Ver>",
            "max" : "<Max.Supported.Ver>"
        }
    }
}
  • test_desc может быть любой произвольной строкой, описывающей тест.

  • min и max являются версией в формате X.W[.Y[.Z]] для MSSQL и PostgreSQL соответственно.

    • min является обязательным, как минимум 7.0.623 для MSSQL (MSSQL 7.0 RTM) и 9.2.0 для PostgreSQL.

    • max также является обязательным, но он может быть пустой строкой, если тест поддерживает до самой последней версии MSSQL или PostgreSQL.

Вы можете проверить список версий для MSSQL (формат X.Y.Z и X.Y.W.Z), PostgreSQL (форматы X.Y.Z и X.Y), чтобы при необходимости скорректировать значения min и max.

Чтобы проверить файл JSON, вы можете использовать скрипт validate-test-json.

H.7.12.3.2. SQL файл #

Это обычный SQL файл для одного или нескольких запросов для MSSQL или PostgreSQL.

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

Для MSSQL скриптов значения берутся из параметров mssql-tests.py:

  • @SCHEMANAME: Имя схемы MSSQL.

Для скриптов PostgreSQL значения берутся из параметров postgresql-tests.py:

  • @PSCHEMANAME: Имя схемы PostgreSQL

  • @PUSER: Пользователь PostgreSQL

  • @MSERVER: MSSQL сервер

  • @MPORT: Порт MSSQL

  • @MUSER: Пользователь MSSQL

  • @MPASSWORD: Пароль MSSQL

  • @MDATABASE: База данных MSSQL

  • @MSCHEMANAME: Имя схемы MSSQL

  • @TDSVERSION: Версия TDS