Administrasi database link

Database link, atau dikenal dengan db link, adalah sarana komunikasi antar dua database. Dengan db link, kita bisa melakukan query dari satu database ke database lain. Sering dipakai dalam sistem database terdistribusi (distributed system) dan replikasi (replication).

Pada dasarnya tidak ada batasan apakah kedua database Oracle yang berkomunikasi melalui db link itu versinya sama atau tidak, kecuali secara eksplisit disebutkan Oracle. Yang pasti, database yang sama versinya (walaupun beda OS-nya) komunikasi db link terjadi secara perfect. Kalau kedua database beda versi, menurut pengalaman saya:

  • Dari 8i ke 9i (atau sebaliknya) gak masalah
  • Dari 8i ke 10g (atau sebaliknya) ada masalah, misalnya data bisa diquery tapi hasilnya “no rows selected” padahal seharusnya ada rows-nya.
  • Dari 9i ke 10g (atau sebaliknya) gak malasalah

Ada pertanyaan: masalahnya penyebabnya apa pak dan bagaimana pemecahannnya?

Penjelasan saya: Saya dah lupa, itu sekitar 2 tahun yang lalu. Pernah bikin SR ke Oracle, kayaknya sih emang ada incompatibility db link antara 8i dan 10g. CMIIW. Akhirnya yang saya lakukan:

  1. Untuk sementara waktu, saya bikin view-view di 9i (yang datanya merupakan query pakai db link ke database yang 10g). Trus … dari 8i saya query pakai db link ke 9i. Jadi, saya pakai database 9i untuk ‘jembatan’.
  2. Karena tabel di 10g yang mesti diquery dari 8i ada banyak, pakai solusi sementara di atas adalah melelahkan. Akhirnya database yang 8i saya upgrade ke 9i.

Langkah-langkah membuat database link

Misalkan saya punya database tsrep (IP 10.21.75.200). Di database ini saya akan membuat user TSREP_USER yang mempunyai tabel TSREP_TAB. Guide untuk membuat user ada di Administrasi User
SQL> conn SYSTEM
SQL> create user TSREP_USER identified by TSREP_PASS;
SQL> grant connect, resource to TSREP_USER;
SQL> conn TSREP_USER
SQL> create table TSREP_TAB (NOMOR number);
SQL> insert into TSREP_TAB values (45);
SQL> commit;

Saya ingin melakukan query di tabel TSREP_TAB dari database lain (misalnya database TSPRIM). Di database TSPRIM lakukan langkah-langkah berikut:

  1. Buat tnsnames
    Kita bisa melakukannya pakai netca atau secara manual menambahkan entry berikut ke file $ORACLE_HOME/network/admin/tnsnames.ora
    tsrep=
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.21.75.200)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SID = tsrep)
    )
    )
  2. Persiapkan user yang akan melakukan query
    SQL> conn SYSTEM
    SQL> create user TS_USER identified by TS_PASS;
    SQL> grant connect, resource to TS_USER;
    SQL> conn TS_USER
  3. Beri grant “create database link” ke user TS_USER agar bisa membuat db link
    SQL> conn SYSTEM
    SQL> grant create database link to TS_USER;
  4. Buat database link
    Format perintahnya adalah:
    create database link NAMA_DATABASE_LINK
    connect to NAMA_USER_DI_DATABASE_REMOTE
    identified by PASSWORD_USER_DI_DATABASE_REMOTE
    using TNSNAMES

    Berikut ini contohnya:
    SQL> conn TS_USER
    SQL> create database link GET_TSREP connect to TSREP_USER identified by TSREP_PASS using 'tsrep';
    Kalau user TS_USER tidak diberi grant “create database link” akan muncul error ini
    ORA-01031: insufficient privileges
  5. coba query ke tabel di schema TSREP_USER di database TSREP. Tambahkan @NAMADATABASE_LINK di belakang tabel/view yang akan di-query. Contoh:
    SQL> select * from TSREP_TAB@GET_TSREP;Bisa juga query ke view-view yang bisa diakses oleh user TSREP_USER di database TSREP
    SQL> select * from tab@GET_TSREP;
    SQL> select * from dual@GET_TSREP;
    SQL> select * from user_tables@GET_TSREP;

DATABASE LINK PUBLIC
Db link yang baru dibuat di atas hanya bisa diakses oleh user yang membuatnya (TS_USER). Agar db link bisa diakses oleh user lain, maka:

  • User lain tersebut membuat db link sendiri
  • Perlu dibuat PUBLIC database link. Db link PUBLIC bisa diakses oleh semua user database.

Yang bisa membuat db link public adalah user yang punya privilege DBA (misalnya SYS dan SYSTEM) atau user biasa yang mempunyai privilege “create public database link”. Contoh, beri privilege ke user TS_USER:
SQL> conn SYSTEM
SQL> grant create public database link to TS_USER;

Cara membuat db link public sama seperti db link biasa, hanya tambahkan kata PUBLIC sebelum nama db link. Contoh:
SQL> conn TS_USER
SQL> create PUBLIC database link GET_TSREP_PUB connect to TSREP_USER identified by TSREP_PASS using 'tsrep';

Sekarang coba query db link tersebut dari user lain. Misalkan saya sudah punya user TEST
SQL> conn TEST
SQL> select * from dual@GET_TSREP;
ORA-02019: connection description for remote database not found

User TEST tidak bisa query ke db link GET_TSREP karena db link ini secara privat milik user lain (TS_USER). Tetapi bisa query ke db link GET_TSREP_PUB yang public itu:
SQL> conn TEST
SQL> select * from dual@GET_TSREP_PUB;

MENGUBAH DATABASE LINK
Misalkan kita ingin mengubah definisi db link, contoh: mengubah nama user untuk connect atapun password. Tidak ada command alter buat db link. Kalau begitu, ya mesti

  • Drop (hapus) db link yang dimaksud
  • Buat db link lagi dengan dengan spesifikasi (definisi) yang dikendaki

MENGAPUS DATABASE LINK
SQL> conn TS_USER
SQL> drop database link GET_TSREP;

Untuk db link public, tidak bisa dihapus dengan cara di atas. Akan ada error berikut:
SQL> conn TS_USER
SQL> drop database link GET_TSREP_PUB;
ORA-02024: database link not found

Untuk itu harus disebutkan juga clause PUBLIC
SQL> drop public database link GET_TSREP_PUB;

Yang bisa menghapus db link public hanya user dengan privilege DBA (misalnya SYS dan SYSTEM) dan user biasa yang diberi privilege “drop public database link”. Walaupun user TS_USER punya privilege untuk membuat db link public, dia tetep tidak bisa mengapus db link public sebelum diberi privilege “drop public database link” (meski db link public itu dia sendiri yang membuatnya)
SQL> conn TS_USER
SQL> drop public database link GET_TSREP_PUB;
ORA-01031: insufficient privileges

Beri privilege ke user TS_USER
SQL> conn SYSTEM
SQL> grant drop public database link to TS_USER;

This entry was posted in Administration, Concept and tagged , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *