Πώς μπορούμε να συνδέσουμε SQL Server με Oracle Database με χρήση Linked Server
- Πώς συλλέγουμε to actual execution plan από τα queries με χρήση Extended Event και πως διαβάζουμε τα δεδομένα του - 2 Δεκέμβριος 2024
- Πώς βρίσκουμε τι δικαιώματα έχει ένας χρήστης σε βάση δεδομένων της Oracle - 1 Νοέμβριος 2024
- Πώς ενεργοποιούμε το Unified Auditing σε Oracle Database - 7 Οκτώβριος 2024
Ο SQL Server μας δίνει τη δυνατότητα να μπορούμε να συνδεόμαστε και να εκτελούμε queries σε απομακρυσμένα Database Instances που δεν είναι απαραίτητο όμως να είναι στο ίδιο RDBMS. Στο άρθρο αυτό θα δούμε συγκεκριμένα πώς γίνεται από instance του SQL Server προς instance της Oracle Database με τη χρήση Linked Server.
Σε προηγούμενο άρθρο είχαμε δει πως συνδέουμε SQL Server με Oracle με τη χρήση PolyBase. Η κύρια διαφορά είναι ότι με τον Linked Server δεν διαβάζουμε απλά δεδόμενα αλλά μπορούμε να εκτελέσουμε Stored Procedures και να τροποποιούμε τα δεδομένα με inserts, updates, deletes.
* Όλες τις διαφορές μεταξύ Linked Server και PolyΒase μπορούμε να τις διαβάσουμε από εδώ.
Η εγκατάσταση
Για αρχή θα πρέπει να κατεβάσουμε τον Oracle Database Client από εδώ.
Στην συνέχεια θα πρέπει να τον κάνουμε εγκατάσταση στον server που φιλοξενεί τον SQL Server.
Κατά την εγκατάσταση ως installation type επιλέγουμε Administrator:
Στην επόμενη καρτέλα επιλέγουμε Windows Build-in Account:
Αφήνουμε τις επόμενες καρτέλες ως έχουν και ολοκληρώνουμε την εγκατάσταση.
Έπειτα πάμε στο παρακάτω φάκελο στο path που έχει δημιουργηθεί και βάζουμε όπου user το όνομα του χρήστη στον οποίο έγινε η εγκατάσταση:
C:\app\client\user\product\19.0.0\client_1\network\admin
Μέσα στον φάκελο αυτό θα υπάρχει ένα αρχείο με όνομα tnsnames.ora. Το κάνουμε edit και προσθέτουμε την παρακάτω εγγραφή βάζοντας ένα όνομα (π.χ. ORADEV), το hostname, την πόρτα και ως service_name το όνομα της βάσης ή του service που θέλουμε να συνδεθούμε:
ORADEV=
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracledev1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = oradev)
)
)
Για να δοκιμάσουμε ότι μέχρι στιγμής παίζουν όλα καλά μπορούμε να ανοίξουμε ένα Command Prompt και να κάνουμε tnsping με το όνομα της εγγραφής στο tnsnames.ora:
Αν εμφανίσει στο τέλος OK συμαίνει ότι είμαστε μια χάρα, σε αντίθετη περίπτωση μπορεί να μας κόβει κάποιο firewall ή δικτυακό θέμα.
Αφού βεβαιωθούμε ότι η επικοινωνία λειτουργεί, συνδεόμαστε στον SQL Server από το SQL Server Management Studio και επιλέγουμε Server Objects και δεξί κλικ Linked Server, New Linked Server…:
Στην καρτέλα General ορίζουμε το όνομα που θέλουμε να έχει ο Linked Server, ως Server type Provider Oracle Provider for OLE DB και ως Data source το όνομα που δώσαμε στην εγγραφή στο tnsnames.ora*:
*Μπορούμε εναλλακτικά αντί να βάλουμε την έγγραφη από το tnsnames.ora να κάνουμε χρήση του ezconnect βάζοντας ip , πόρτα και service, για παράδειγμα oracle.dataplatform.gr:1521/orcl
Στην καρτέλα Security επιλέγουμε Be made using this security context και βάζουμε τα credentials του χρήστη με της Oracle με τον οποίο θα συνδεόμαστε:
Για το παράδειγμα μας έχω φτιάξει έναν χρήστη με όνομα “Stratos” που έχει δικαίωμα connect, resource, unlimited quota στο tablespace users και έχω φτιάξει σε αυτόν έναν πίνακα “Pelates” με 3 εγγραφές:
-- Create the user create user STRATOS identified by "password" default tablespace USERS temporary tablespace TEMP profile DEFAULT quota unlimited on users; -- Grant/Revoke role privileges grant connect to STRATOS; grant resource to STRATOS; -- Create table create table stratos.pelates ( id INTEGER, onoma VARCHAR2(10) ); insert into pelates values(1,'Stratos'); insert into pelates values(2,'Nikos'); insert into pelates values(3,'Giorgos'); commit;
Ολοκληρώνοντας τον Linked Server μπορούμε με τη χρήση openquery να καλέσουμε τον Linked Server που φτιάξαμε και να ορίσουμε το query που θέλουμε να τρέξει προς την Oracle:
select * from openquery([oracle server], 'select onoma from pelates');
Σε περίπτωση που κατά την εκτέλεση του μας εμφανίσει το παρακάτω σφάλμα:
Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "ORACLE SERVER".
Τότε εκτελούμε την παρακάτω εντολή που θα μας διορθώσει εύκολα το πρόβλημα:
EXEC master.dbo.sp_MSset_oledb_prop N'OraOLEDB.Oracle', N'AllowInProcess', 1