راهنمای گام‌به‌گام راه‌اندازی Oracle Database Gateway (DG4ODBC) برای اتصال Oracle 19c به SQL Server

در این راهنما، فرآیند برقراری ارتباط دوطرفه و اجرای کوئری بین Oracle Database 19c (مستقر بر روی Oracle Linux 9 / RHEL 9) و Microsoft SQL Server 2022 (مستقر بر روی Windows Server 2022) از طریق ابزار Oracle Database Gateway for ODBC (DG4ODBC) و Database Link شرح داده می‌شود.

۱. اطلاعات معماری و مشخصات سرورها

  • سرور اوراکل (Oracle Linux 9.x):
    • Hostname: dc1.vahiddb.com
    • IP Address: 192.168.56.31
    • Oracle Base: /u01/app/oracle
    • Oracle Home: /u01/app/oracle/product/19c/dbhome
    • Grid Home (در صورت وجود RAC/GI): /u01/app/19c/grid
    • DB / PDB Name: vahiddb / vahidpdb
  • سرور مقصد (SQL Server 2022 on Windows Server):
    • IP Address: 192.168.56.19
    • Port: 1433
    • Database Name: testdb
    • SQL User: ora_link / OraPassword#123

۲. آماده‌سازی سمت Microsoft SQL Server

۲.۱. فعال‌سازی Mixed Mode Authentication و باز کردن پورت

  1. در محیط SSMS (SQL Server Management Studio) بر روی Instance راست‌کلیک کرده، به مسیر Properties > Security بروید و گزینه SQL Server and Windows Authentication mode را فعال کنید.
  2. در SQL Server Configuration Manager، سرویس TCP/IP را فعال و پورت پیش‌فرض را روی 1433 تنظیم کنید.
  3. پورت 1433 را در Windows Defender Firewall باز کنید:
New-NetFirewallRule -DisplayName "SQL Server Port 1433" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow

۲.۲. ساخت دیتابیس، کاربر و جدول تستی

اسکریپت زیر را در SSMS اجرا کنید:

CREATE DATABASE testdb;
GO

USE testdb;
GO

CREATE LOGIN ora_link WITH PASSWORD = 'OraPassword#123', CHECK_POLICY = OFF;
CREATE USER ora_link FOR LOGIN ora_link;
ALTER ROLE db_datareader ADD MEMBER ora_link;
ALTER ROLE db_datawriter ADD MEMBER ora_link;
GO

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    emp_name VARCHAR(100),
    department VARCHAR(50),
    salary DECIMAL(10,2)
);

INSERT INTO employees VALUES 
(1, 'Ali Rezaei', 'IT', 75000),
(2, 'Sara Mohammadi', 'HR', 62000),
(3, 'Vahid Karimi', 'Database', 90000);
GO

۳. آماده‌سازی و کانفیگ لینوکس (سرور dc1)

۳.۱. نصب پکیج unixODBC و درایور مایکروسافت

با کاربر root دستورات زیر را اجرا کنید:

dnf install -y unixODBC

فایل RPM درایور مایکروسافت را نصب کرده و با وارد کردن عبارت yes لایسنس را تأیید کنید:

dnf install -y msodbcsql18-18.4.1.1-1.x86_64.rpm

۳.۲. پیکربندی فایل‌های ODBC

فایل /etc/odbc.ini را ویرایش کرده و DSN را تعریف کنید:

cat << "EOF" > /etc/odbc.ini
[MSSQLTEST]
Driver=ODBC Driver 18 for SQL Server
Server=192.168.56.19,1433
Database=testdb
TrustServerCertificate=yes
Encrypt=no
EOF

۳.۳. تست اتصال ODBC در لینوکس با دستور isql

با کاربر oracle دستور زیر را اجرا کنید تا از صحت اتصال شبکه و درایور مطمئن شوید:

isql -v MSSQLTEST ora_link 'OraPassword#123'

خروجی مورد انتظار و تست کوئری:

+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> SELECT * FROM employees;
+------------+----------------------+--------------------+----------+
| emp_id     | emp_name             | department         | salary   |
+------------+----------------------+--------------------+----------+
| 1          | Ali Rezaei           | IT                 | 75000.00 |
| 2          | Sara Mohammadi       | HR                 | 62000.00 |
| 3          | Vahid Karimi         | Database           | 90000.00 |
+------------+----------------------+--------------------+----------+
SQLRowCount returns 0
3 rows fetched
SQL> quit

۴. پیکربندی Oracle Database Gateway (DG4ODBC)

۴.۱. ایجاد فایل پیکربندی Gateway (init<SID>.ora)

با کاربر oracle فایل $ORACLE_HOME/hs/admin/initMSSQLTEST.ora را ایجاد کنید:

cat << "EOF" > $ORACLE_HOME/hs/admin/initMSSQLTEST.ora
HS_FDS_CONNECT_INFO = MSSQLTEST
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so.2
HS_FDS_SQLLEN_INTERPRETATION = 64
HS_FDS_SUPPORT_STATISTICS = FALSE
HS_KEEP_REMOTE_MM_AND_SEC = TRUE
HS_NLS_NCHAR = UCS2
set ODBCINI=/etc/odbc.ini
set ODBCSYSINI=/etc
HS_LANGUAGE = AMERICAN_AMERICA.AL32UTF8
EOF

۴.۲. پیکربندی listener.ora

فایل listener.ora را (در محیط‌های Grid/ASM در مسیر $GRID_HOME/network/admin/listener.ora و در محیط‌های Standalone در $ORACLE_HOME/network/admin/listener.ora) ویرایش کنید و بخش SID_DESC مربوط به ایجنت dg4odbc را اضافه کنید:

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = vahiddb)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome)
      (SID_NAME = vahiddb)
    )
    (SID_DESC =
      (PROGRAM = dg4odbc)
      (SID_NAME = MSSQLTEST)
      (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome)
      (ENVS = "LD_LIBRARY_PATH=/usr/lib64:/opt/microsoft/msodbcsql18/lib64:/u01/app/oracle/product/19c/dbhome/lib,ODBCINI=/etc/odbc.ini,ODBCSYSINI=/etc")
    )
  )

سپس لیسنر را ریلود کنید:

lsnrctl reload
lsnrctl status

۴.۳. پیکربندی tnsnames.ora

فایل $ORACLE_HOME/network/admin/tnsnames.ora را ویرایش کرده و ورودی زیر را اضافه کنید:

MSSQLTEST =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dc1.vahiddb.com)(PORT = 1521))
    (CONNECT_DATA =
      (SID = MSSQLTEST)
    )
    (HS = OK)
  )

صحت TNS را تست کنید:

tnsping MSSQLTEST

۵. ساخت Database Link و تست نهایی در اوراکل

وارد دیتابیس شوید:

sqlplus / as sysdba

ساخت Database Link و اجرای کوئری:

ALTER SESSION SET CONTAINER = vahidpdb;

CREATE PUBLIC DATABASE LINK mssql_link
CONNECT TO "ora_link" IDENTIFIED BY "OraPassword#123"
USING 'MSSQLTEST';

SELECT * FROM "employees"@mssql_link;

خروجی موفقیت‌آمیز:

    emp_id emp_name             department     salary
---------- -------------------- ------------ --------
         1 Ali Rezaei           IT              75000
         2 Sara Mohammadi       HR              62000
         3 Vahid Karimi         Database        90000

عملیات درج داده (INSERT) و ساخت Synonym:

جهت انجام عملیات درج (DML)، ابتدا در SQL Server دسترسی را به کاربر بدهید:

USE testdb;
GO
ALTER ROLE db_datawriter ADD MEMBER ora_link;
GO

سپس در سمت اوراکل با استفاده از نام مستعار (Synonym)، داده جدید را درج و کامیت کنید:

CREATE OR REPLACE SYNONYM mssql_emp FOR "employees"@mssql_link;

INSERT INTO mssql_emp ("emp_id", "emp_name", "department", "salary")
VALUES (4, 'Reza Ahmadi', 'DevOps', 88000);

COMMIT;

SELECT * FROM mssql_emp;