Дано:
- 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"