Πώς μπορούμε να έχουμε απομακρυσμένη πρόσβαση σε άλλη βάση δεδομένων της Oracle
- Τι είναι η PostgreSQL και πως κάνουμε μία πλήρης εγκατάσταση - 2 Σεπτέμβριος 2024
- Πώς ρυθμίζουμε το replication του GoldenGate ώστε να διαβάζει από το Standby του Oracle Data Guard - 2 Αύγουστος 2024
- Πώς μπορούμε να συνδέσουμε Oracle Database με SQL Server με χρήση Oracle Gateway σε Linux - 1 Ιούλιος 2024
Σε αυτό το άρθρο θα αναλύσουμε τον τρόπο που μπορούμε να έχουμε πρόσβαση σε πίνακες / views που βρίσκονται σε απομακρυσμένη βάση δεδομένων της Oracle. Για να το πετύχουμε αυτό χρειαζόμαστε να φτιάξουμε ένα object που ονομάζεται Database Link.
Με τη χρήση Database Link μπορούμε να καλούμε πίνακες και views που βρίσκονται σε άλλη βάση δεδομένων σε queries προσθέτοντας στο τέλος “@” και το όνομα του Database Link. Εκτός από SELECT μπορούμε να κάνουμε και INSERT, UPDATE, DELETE στους πίνακες αυτούς.
Η προετοιμασία
Για αρχή πρέπει να πάμε στον φάκελο που βρίσκεται το αρχείο tnsnames.ora στον τοπικό server μας. Σε αυτό το αρχείο βρίσκονται οι δικτυακές ρυθμίσεις που απαιτούνται για να συνδεθεί ένας χρήστης στη βάση δεδομένων της Oracle.
cd $ORACLE_HOME/network/admin
Κάνοντας edit το αρχείο θα πρέπει κάτω από την εγγραφή για την τρέχων μας βάση (ORCL) να προσθέσουμε και μία εγγραφή για την απομακρυσμένη που θέλουμε να συνδεθούμε (REMOTEDB). Εκεί θα πρέπει να ορίσουμε Host,Port και ως Service_name το όνομα της βάσης / service που θέλουμε να συνδεθούμε.
*Επειδή για τον παράδειγμα δεν είχα κάποιο άλλο instance έβαλα μία εγγραφή με το ίδιο.
vi $ORACLE_HOME/network/admin/tnsnames.ora
Στην απομακρυσμένη βάση θα πρέπει να έχουμε φτιάξει έναν χρήστη που θα έχει δικαίωμα να συνδέεται , μαζί με ότι άλλο δικαίωμα θέλουμε σε συγκεκριμένα objects να βλέπουμε.
Στην περίπτωση μας θα δώσουμε δικαίωμα select σε έναν μόνο πίνακα:
-- Create the user create user dblink_user identified by password default tablespace USERS temporary tablespace TEMP profile DEFAULT; -- Grant/Revoke role privileges grant connect to dblink_user; grant resource to dblink_user; grant select on scott.dept to dblink_user;
Δημιουργία Public Database Link
Στην τοπική μας βάση θα δημιουργήσουμε το Public Database Link. Το Public σημαίνει ότι μπορεί να γίνει χρήση από οποιονδήποτε χρήστη της βάσης δεδομένων.
Θα χρειαστεί στο connect να ορίσουμε τα credentials του χρήστη που φτιάξαμε πριν στην απομακρυσμένη βάση και στο using την εγγραφή στο tnsnames.ora που προσθέσαμε:
create public database link REMOTEDB connect to dblink_user identified by password using 'REMOTEDB'; --drop public database link REMOTEDB;
Αν κάνουμε select το view dba_db_links, θα δούμε το database link που φτιάξαμε:
select * from dba_db_links;
Είμαστε έτοιμοι να δοκιμάσουμε το query στον πίνακα, το μόνο που χρειάζεται είναι μετά το όνομα του πίνακα να προσθέσουμε με “@” το όνομα του database link:
select * from scott.dept@REMOTEDB;
Αν προσπαθήσουμε να προσπελάσουμε άλλον πίνακα που δεν έχει πρόσβαση ο απομακρυσμένος χρήστης που φτιάξαμε το database link (dblink_user), τότε θα επιστρέψει σφάλμα:
select * from scott.bonus@REMOTEDB;
Δημιουργία Private Database Link
Επειδή όμως δεν είναι ασφαλές να μπορεί οποιοδήποτε χρήστης σε μία βάση να έχει πρόσβαση σε ένα database link μπορούμε να φτιάξουμε database link που να λειτουργεί μόνο σε συγκεκριμένο χρήστη.
Για αρχή θα πρέπει να δώσουμε το δικαίωμα CREATE DATABASE LINK στον χρήστη που θα θέλουμε να κάνει χρήση το database link:
grant CREATE DATABASE LINK to stratos;
Έπειτα συνδεόμαστε ώς αυτός ο χρήστης (π.χ. connect stratos/password) και δημιουργούμε το database link όπως πριν χωρίς την λέξη PUBLIC:
create database link REMOTEDB_FROM_STRATOS connect to dblink_user identified by password using 'REMOTEDB'; --drop database link REMOTEDB_FROM_STRATOS
Αν τώρα ξανακάνουμε select το παρακάτω view με sysdba χρήστη θα δούμε ότι έχουμε δύο database link, το ένα ανήκει στον PUBLIC και το άλλο στον χρήστη που φτιάξαμε:
select * from dba_db_links;
Οπότε συνδεδεμένοι ως αυτός ο χρήστης αν τρέξουμε το query με το δικό του database link θα λειτουργήσει κανονικά:
select * from scott.dept@REMOTEDB_FROM_STRATOS;
Αν προσπαθήσουμε να τρέξουμε το ίδιο query με οποιονδήποτε άλλο χρήστη, θα λάβουμε το σφάλμα με το παρακάτω μήνυμα: