Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Σε αυτό το άρθρο θα δούμε πως μπορούμε να εκτελούμε queries σε απομακρυσμένο SQL Server από Oracle Database σε Oracle Linux / Red Hat Linux.
Σε προηγούμενο άρθρο είχαμε δεί πως γίνεται η αντίστροφη διαδικασία ώστε να συνδεόμαστε από SQL Server Instance σε Oracle Database μέσω Linked Server. Αυτή τη φορά θα εγκαταστήσουμε ένα Oracle Database Gateway που μέσω αυτού θα φτιάξουμε ένα Database Link προς μία βάση δεδομένων που βρίσκεται σε SQL Server.
Η εγκατάσταση του Oracle Gateway μπορεί να γίνει είτε σε κάποιον από τους database servers είτε σε κάποιο τρίτο μηχάνημα που θα λειτουργεί ως ενδιάμεσος. Στο συγκεκριμένο παράδειγμα θα τον προχωρίσουμε την εγκατάσταση στον Linux Oracle Database.
Τα βήματα
Στο SQL Server Instance
Για αρχή θα πρέπει στο SQL Server Instance να φτιάξουμε ένα login που θα έχει πρόσβαση read στη βάση δεδομένων που θέλουμε να διαβάσουμε από την Oracle Database. Στο παράδειγμά μας θα φτιάξουμε έναν χρήστη που ονομάζεται oraclepw και θα έχει πρόσβαση στη βάση mig_db:
USE [master] GO CREATE LOGIN [oraclegw] WITH PASSWORD=N'password', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO USE [mig_db] GO CREATE USER [oraclegw] FOR LOGIN [oraclegw] GO USE [mig_db] GO ALTER ROLE [db_datareader] ADD MEMBER [oraclegw] GO
Στο Oracle Database Linux Server
Στο Linux που βρίσκεται η Oracle Database κατεβάζουμε τον ODBC driver για SQL Server και να τον κάνουμε εγκατάσταση.
Για να γίνει η εγκατάσταση τρέχουμε όπως είναιτον παρακάτω κώδικα:
#Red Hat Enterprise Server 7 and Oracle Linux 7 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo exit sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts sudo ACCEPT_EULA=Y yum install -y msodbcsql18 # optional: for bcp and sqlcmd sudo ACCEPT_EULA=Y yum install -y mssql-tools18 echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc source ~/.bashrc # optional: for unixODBC development headers sudo yum install -y unixODBC-devel
Στη συνέχεια ανοίγουμε το αρχείο που περιέχει την λίστα με τους drivers ώστε να δούμε ότι υπάρχει η εγγραφή με τον ODBC για SQL Server και να κρατήσουμε το path που βρίσκεται ο driver του:
vi /etc/odbcinst.ini
[ODBC Driver 18 for SQL Server]
Description=Microsoft ODBC Driver 18 for SQL Server
Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1
UsageCount=1
Έπειτα πάμε στον να προσθέσουμε το DSN (Data Source Name) entry για τον ODBC:
vi /etc/odbc.ini
Εκεί βάζουμε την εγγραφή όπως το παρακάτω παράδειγμα αλλάζοντας το όνομα της, το όνομα του server, το όνομα της βάσης δεδομένων και ως driver το path από το προηγούμενο βήμα:
[MIG_DB]
Description = MSSQL Server
Trace = No
Server = SMATZOURANISLP
Database = MIG_DB
Port = 1433
TDS_Version = 7.2
Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.1.so.2.1
TrustServerCertificate=Yes
Για να δοκιμάσουμε ότι δουλεύει, τρέχουμε το παρακάτω βάζοντας το DSN name, το όνομα του χρήστη που φτιάξαμε στον SQL Server και το password:
isql MIG_DB oraclegw 'password' -v
Αν δουλεύει σωστά θα εμφανίσει το παρακάτω μήνυμα:
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
Σαν επόμενο βήμα θα πρέπει να δημιουργήσουμε το παρακάτω αρχείο βάζοντας το ανάλογο όνομα με το DSN:
vi $ORACLE_HOME/hs/admin/initMIG_DB.ora
Σε αυτό προσθέτουμε τις παρακάτω εγγραφές αλλάζοντας μόνο την παράμετρο HS_FDS_CONNECT_INFO
με το το όνομα του DSN που έχουμε φτιάξει, ως HS_LANGUAGE
ορίζουμε το encoding της Oracle Database που θα είναι το destination:
HS_FDS_CONNECT_INFO = MIG_DB
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=AMERICAN_AMERICA.AL32UTF8
Έπειτα πάμε στο listener.ora και προσθέτουμε την παρακάτω εγγραφή βάζοντας ως SID_NAME το όνομα του DSN (για να το αφήσουμε όσο ποιο απλό γίνεται) και το ανάλογο ORACLE_HOME
:
vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER=
(SID_DESC=
(SID_NAME=MIG_DB)
(ORACLE_HOME=/oracle/nfs/app/oracle/product/12.1.0.2/dbhome_1)
(PROGRAM=dg4odbc)
)
Αφού προσθέσουμε την εγγραφή στον listener τον κάνουμε reload:
lsnrctl reload
Στη συνέχεια αυτή την εγγραφή που φτιάξαμε στο listener την προσθέτουμε και στο tnsnames.ora:
vi $ORACLE_HOME/network/admin/tnsnames.ora
* Προσέχουμε ως host βάζουμε τον Linux Oracle Database Server και όχι τον SQL Server, με την πόρτα ως έχει.
MIG_DB =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=oracledev1)(PORT=1521))
(CONNECT_DATA=(SID=MIG_DB))
(HS=OK)
)
Τέλος φτιάχνουμε το Database Link, ορίζοντας ένα όνομα, το login του SQL Server, το password και τo όνομα της εγγραφής που προσθέσαμε στο tnsnames.ora:
sqlplus / as sysdba CREATE DATABASE LINK SQLDBLINK CONNECT TO "oraclegw" IDENTIFIED BY "password" USING 'MIG_DB';
Η δοκιμή
Αφού φτιάξαμε το Database Link μπορούμε με query στην Oracle Database να καλούμε τους πίνακες της βάσης δεδομένων στον SQL Server όπως παρακάτω:
select * from dbo.customers@sqldblink;
Στην περίπτωση που μας εμφανίσει το παρακάτω σφάλμα:
ERROR at line 1:
ORA-02085: database link SQLDBLINK connects to HO.WORLD
Τότε πρέπει να απενεργοποιήσουμε τα global names με την παρακάτω εντολή:
alter system set global_names = false scope=both;