در این راهنما، فرآیند برقراری ارتباط دوطرفه و اجرای کوئری بین 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 و باز کردن پورت
- در محیط SSMS (SQL Server Management Studio) بر روی Instance راستکلیک کرده، به مسیر Properties > Security بروید و گزینه SQL Server and Windows Authentication mode را فعال کنید.
- در SQL Server Configuration Manager، سرویس TCP/IP را فعال و پورت پیشفرض را روی 1433 تنظیم کنید.
- پورت 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;