01.10.2020 1 min to read

Oracle DBLINK to SQL Server over ODBC

Category : Статьи

Дано:

  • Oracle Linux 7.8 с Oracle Database 19c EE 19.0.0.0.0, ORDS 20.2, APEX 20.1, приложение в APEX
  • MS Server 2016 с SQL Server 13.0.1601.5 (SQL Server 2016 RTM), база данных ERP Галактика, Server Collation Cyrillic_General_CI_AS
    • 10.2.1.108:1433 имя базы GALERP
    • имя пользователя с необходимыми правами чтения, подключения gal-api-user и пароль SECRET_PASSWORD
    • авторизация SQL Server (не Active Directory)

Необходимо обращаться к данным SQL Server из PL/SQL с применением технологии DB Link.

Есть два варианта создания подключения: использовать Oracle Transparent Gateway или ODBC. Мы используем ODBC.

Microsoft выпустила ODBC Driver for SQL Server для Linux и теперь нет необходимости устанавливать сторонний. Подробно установка описана https://docs.microsoft.com/ru-ru/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-ver15

Установка Microsoft ODBC Driver for SQL Server сводится к добавлению репозитория, установке пакетов и настройке переменных окружения

sudo curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo

sudo ACCEPT_EULA=Y yum install msodbcsql17

sudo ACCEPT_EULA=Y yum install mssql-tools

В нашем случае есть специальный файл с переменными окружениями пользователя oracle

echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> /etc/profile.d/oraee.sh

Файл /etc/odbcinst.ini с описанием установленных в систему драйверов ODBC обновится автоматически при установке. Имя драйвера изменено на MSODBC специально для удобства использования.

[root@oradb18 apex]# cat /etc/odbcinst.ini
[MSODBC]
Description=Microsoft ODBC Driver 17 for SQL Server
Driver=/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.6.so.1.1
UsageCount=1

Файл c описанием DSN (имя источника данных) должен содержать описание каждой базы данных к которой необходимо подключаться. На этом этапе мы определяем имя подключения как GALSQL, используем адрес сервера и имя базы данных

[root@oradb18 apex]# cat /etc/odbc.ini
[ODBC Data Sources]
GALSQL = GAL MSSQL Server

[GALSQL]
Driver = MSODBC
Description = GAL MSSQL Server
Trace = No
Server = 10.2.1.108
Database = GALERP
Port = 1433
QuotedId=YES
AnsiNPW=YES

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

Для Oracle необходимо настроить Heterogeneous Services, tnsname и listener.

Heterogeneous Services настраивается в $ORACLE_HOME/hs/admin/ Необходимо создать файл описания к каждой базе, к которой создается подключения. Именование файла вида init[ODBC Data Sources].ora, пример: initGALSQL.ora

[root@oradb18 admin]# cat initGALSQL.ora 

HS_FDS_CONNECT_INFO = GALSQL

HS_FDS_TRACE_LEVEL = OFF

HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so

set ODBCINI=/etc/odbc.ini

HS_KEEP_REMOTE_COLUMN_SIZE = LOCAL

HS_NLS_NCHAR=UCS2

HS_LANGUAGE=RUSSIAN_RUSSIA.UTF8

listener.ora tnsnames.ora размещены в $ORACLE_HOME/network/admin

Необходимо добавить сервисы и перезапустить listener

[root@oradb18 admin]# cat listener.ora
# listener.ora Network Configuration File: /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
***

***
SID_LIST_LISTENER =
 (SID_LIST =
  (SID_DESC =
    (SID_NAME = GALSQL)
      (PROGRAM = dg4odbc)
        (ORACLE_HOME = /opt/oracle/product/19c/dbhome_1)
  )
)

[root@oradb18 admin]# cat tnsnames.ora
***

***
GALSQL =
  (DESCRIPTION=
     (ADDRESS=(PROTOCOL=tcp)(HOST=oradb18)(PORT=1521))
      (CONNECT_DATA=(SID=GALSQL))
          (HS=OK)
  )

Перезапуск и вся остальная работа в Oracle с правами пользователя CREATE DATABASE LINK

[root@oradb18 admin]# su - oracle -c 'lsnrctl stop'
[root@oradb18 admin]# su - oracle -c 'lsnrctl start'

CREATE DATABASE LINK "DBLINK_GALSQL"
CONNECT TO "gal-api-user" IDENTIFIED BY "SECRET_PASSWORD"
USING 'GALSQL';

Пример обращения к данным:

select * from ABONENTS@"GALSQL"