You are on page 1of 154

DATABASE LANJUT DENGAN MENGGUNAKAN IBM DB2 & JAVA

DIKTAT KULIAH

Oleh: Hendra, MT. Jimmy S.Kom.

PROGRAM STUDI TEKNIK INFORMASI STMIK IBBI MEDAN 2012

KATA PENGANTAR
Database merupakan jantung dari sistim informasi, karena didalam database tersimpan semua data yang dibutuhkan untuk diolah menjadi informasi. Kinerja dari suatu aplikasi berbasis database sangat dipengaruhi oleh kinerja dari database yang digunakan serta teknik pemrograman yang digunakan. Suatu rancangan database yang baik memperhatikan faktor integritas data, kinerja dan kemanan dari database tersebut. Pada buku ini kita akan mulai dari pengolahan data dengan flat file untuk meletakan dasar pemikiran bagi mahasiswa mengapa DBMS sangat berperan dalam pengembangan aplikasi sehingga pengembang dapat fokus kepada aturan bisnis daripada pengelolaan data pada media penyimpanan fisik. Kemudian akan dilanjutkan dengan teori siklus hidup database, pemodelan database dengan menggunakan ERD, proses normalisasi, proses denormalisasi, perancangan database, tuning kinerja database, pembuatan trigger, UDF, stored procedure, database security, dan proses backup restore. Pada buku ini kita membuat contoh dengan menggunakan RDBMS DB2 Universal Database yang merupakan sistim database yang mapan dan digunakan di perusahaanperusahaan skala menengah dan besar. Sebagai praktek kita juga memberikan contoh pengaplikasian database dengan konektivitas dengan Java melalui JDBC. Penulis berusaha membuat buku ini mudah dipahami dan contoh-contoh berdasarkan pengalaman penulis selama ini baik sebagai Dosen maupun praktisi dibidang pengembangan sistim informasi. Akhirnya penulis mengucapkans selamat membaca, dan berlatih, dan selamat datang ke database kelas Enterprise yaitu IBM DB2, dan tak lupa penulis mengucapkan terima kasih kepada Team IBM Indonesia yang telah memberikan kesempatan bagi penulis untuk ikut serta dalam pelatihan Db2 dalam kerangka IBM Academic Initiative on Campus. Medan, 7 Maret 2012 Penulis

DAFTAR ISI Bagian 1, Pengantar Database......................................................................................1 Bagian 2, Model Database Relational.........................................................................11 Bagian 3, Siklus Hidup Database...............................................................................18 Bagian 4, ER-Diagram................................................................................................25 Bagian 5, Normalisasi.................................................................................................35 Bagian 6, Normalisasi Lanjutan.................................................................................47 Bagian 7, Denormalisasi.............................................................................................62 Bagian 8, Perancangan Database................................................................................69 Bagian 9, Performance-Tuning...................................................................................78 Bagian 10, UDF..........................................................................................................91 Bagian 11, Stored Procedure......................................................................................99 Bagian 12, Konsistensi Transaksi.............................................................................104 Bagian 13, Konsistensi Konkurensi..........................................................................112 Bagian 14, Data Control Language..........................................................................130 Bagain 15, Backup, Restore dan Recovery..............................................................140

Database Lanjut dengan IBM DB2

Bab 1, Pengantar Database


Data merupakan fakta dari sesuatu yang diperoleh dari hasil dari pengukuran, maupun hasil dari catatan transaksi masa lampau. Data dapat diolah menjadi informasi untuk mengambarkan kondisi masa lalu dan kondisi saat ini, kemudian data dapat diolah lebih lanjut untuk mendapatkan pengetahuan dan memprediksi kondisi masa depan. Agar data dapat diolah secara efisien dan efektif, tentu saja harus disimpan dalam bentuk yang terstruktur, sehingga memudahkan pencarian, pembacaan kembali.

Database
Database merupakan suatu koleksi dari informasi yang berkaitan, teratur, dan dapat dengan mudah diakses, diatur, dan diperbaharui. Dalam kehidupan modern, kita senantiasa berinteraksi dengan database, terutama bagi kita yang membawa perangkat telepon bergerak, pada saat anda berkenalan dengan seseorang dan melakukan pertukaran nomor telepon bergerak, maka kita akan merekam nama dan nomor orang tersebut pada data contact, ketika kita ingin menghubungi orang tersebut, maka kita dapat melakukan pencarian berdasarkan nama, dan jika ada perubahan data, maka kita dapat memperbaharui data contact.

DBMS
Database management system adalah suatu paket software komputer yang mengendalikan pembuatan, pemeliharaan, dan pemakaian dari database. Tujuan utama dari DBMS adalah untuk mengintegrasikan data pada suatu lokasi yang tersentralisasi dan menyediakan suatu akses berbagi pakai yang aman. Integrasi data organisasi pada suatu lokasi terpusat yang terkendali mengurangi redundancy dan memastikan konsistensi data. Secara teori dua data yang disimpan pada dua tempat yang berbeda maka besar kemungkinan dua item yang diperkirakan sama tetapi kenyataannya tidak sama, misalnya data mahasiswa disimpan pada dua tabel yang berbeda, bisa saja pembaharuan dilakukan pada tabel yang satu tetapi tidak dilakukan pada tabel yang lain. Pemakaian DBMS memberikan kemudahan bagi pengembang untuk memfokuskan diri pada pengembangan aplikasi, sedangkan penanganan data fisik akan diambil alih oleh DBMS. Dewasa ini berbagai paket software DBMS yang tersedia dipasar mulai dari sistim besar sampai kepada perangkat mobile, mulai dari komersil dengan support sampai kepada open source dengan support maupun tanpa support (community edition). seperti Oracle, DB2, MSSQL, ProgresSQL, MySQL, FirebirdSQL, SqlLite.

Model Data
Pada awal perkembangan aplikasi komputer, penanganan data fisik dilakukan langsung oleh programmer dengan menggunakan sistem flat file ataupun simple text file yang dapat berupa fixed length, maupun menggunakan seperator koma, aplikasi mengakses Hendra, MT. & Jimmy, S.Kom. 1

Database Lanjut dengan IBM DB2 data secara sequensial untuk melakukan proses batch. Pada perkembangan selanjutnya menggunakan sistim random akses, dimana data disimpan sebagai tipe data record yang memiliki ukuran tetap, akses terhadap data menggunakan file pointer, sehingga pembacaan maupun penulisan dapat dilakukan secara acak ke record tertentu. Model lainnya yang digunakan pada mainframe adalah model hierarki dan network, model hirarki dalam bentuk model tree, dimana memiliki akar dan beberapa tingkatan cabang, setiap item memiliki hanya satu link kepada induknya. Akses data dimulai dari akar dan ditelusuri ke item-item dibawahnya sampai item yang diinginkan ditemukan. Pada model network memiliki banyak link diantara item data. Indek yang saling berhubungan memungkinkan akses data dari berbagai arah. Model data relasional diperkenalkan perama kali oleh E.F. Codd dari IBM Research pada tahun 1970 dengan judul A Relational Model of Data for Large Shared Databanks. Model relational ini didasarkan pada suatu konsep dari relational matematika, dan menggunakan teori himpunan dan logika first order predicate1 sebagai dasar teorinya. Pada model relational, database diekspresikan sebagai koleksi dari relasi-relasi. Suatu relasi secara fisik direpresentasikan sebagai suatu tabel dimana masing-masing baris berkoresponden dengan satu record individu, dan setiap kolom berkoresponden dengan suatu atribut individu, diaman atribut dapat muncul dalam berbagai urutan dalam tabel. Pada model relational, sebuah baris disebut sebagai tuple, dan sebuah judul kolom disebut sebagai suatu atribut, dan tabel tersebut disebut sebagai relasi. (Sesuatu yang sering disalah artikan bahwa model relasional mengambil nana dari kenyataan bahwa tabel dalam database relasional dapat berelasi satu sama lainnya). Pemakaian model relasi memiliki keuntungan tampilan dan kecepatan akses. Kamus data untuk model relasi memuat nama tabel, beserta nama kolom dan tipe data untuk setiap kolom, selain itu kamus data juga menyimpan informasi seluruh user dan hak-hak istimewanya.

Evolusi teknologi database


Database dan industri manajemen data berevolusi didalam pengembangan dari berbagai fungsi kritikal yang dimulai dari koleksi data dan database, pembuatan, manajemen data (termasuk penyimpanan dan pengambilan, proses transaksi database), dan data analisa maju (termasuk data warehouse dan data mining). Sejak tahu 1960 database dan IT berevolusi secara sistematis dari pemrosesan file secara primitif sampai kepada sistim database yang memuaskan, penelitian dan pengembangan database sejak tahun 1970-an yang berkembang dari suatu model database hierarki dan network ke model database relasional (dimana data disimpan dalam struktur tabel relasional), peralatan modeling data, indexing dan metode akses, dan pemakai bahasa pertanyaan yang nyaman dan fleksibel, antar muka pemakai, optimisasi query, manajemen transaksi, metode yang efisien untuk online transaction processing (OLTP), dimana suatu query ditampikan sebagai suatu transaksi read-only, berkontribusi secara
1

All human are mortal. Socrates is human. Threrefore: Socrates is mortal. Human(h) Mortal(h), Human(Socrates) Mortal(Socrates).

Hendra, MT. & Jimmy, S.Kom.

Database Lanjut dengan IBM DB2 substansial kepada evolusi dan diterima secara luas dari teknologi relasional sebagai peralatan utama untuk penyimpanan yang efisien, pengambilan dan pengaturan data dalam ukuran besar. Setelah pengembangan dari DBMS, teknologi database bergerak maju kepada pengembangan dari sistim database yang maju, data warehouse, dan data mining untuk analisa data tingkat tinggi dan database berbasis web yang digambarkan oleh diagram berikut ini:

Gambar 1, Evolusi teknologi database (Sumber: Jiawei Han, Micheline Kamber, Jian Pei, 2012) Hendra, MT. & Jimmy, S.Kom. 3

Database Lanjut dengan IBM DB2

Pengelolaan Flat File


Pengembangan aplikasi yang berorientasi kepada data, tidak terlepas dari pemakaian file untuk penyimpanan data secara permanen (data tidak hilang ketika sistim di-shutdown). Data yang tersimpan didalam file membutuhkan format dengan struktur yang tertentu, sehingga dapat dikenali dan dipisahkan kembali masing-masing elemen data, pendekatan yang dapat dilakukan untuk pembeda terhadap masing-masing elemen data dalam file teks adalah menggunakan ukuran tetap, maupun menggunakan simbol pemisah seperti koma maupun titik koma. Contoh database dalam format teks ukuran tetap NIM 110102001 110102002 110102003 110102004 NAMA Hendra Susan Sukiman Jimmy MATAKULIAH Database Database Database Database NILAI B B B B

Contoh database dalam format teks dengan pemisah titik koma NIM;NAMA;MATAKULIAH;NILAI; 110102001;Hendra;Database; B; 110102002;Susan;Database;B; 110102003;Sukiman;Database;B; 110102004;Jimmy;Database;B; Penyimpanan data dalam bentuk teks membutuhkan usaha yang besar bagi programmer untuk membuat fasilitas pembacaan teks sequential, melakukan proses pemisahan terhadap masing-masing komponen data. Jika terjadi perubahan struktur data, seperti penghapusan maupun penyisipan kolom, maka keseluruhan teks file harus ditulis ulang. Pengolahan data dalam format teks dapat efektif dan unggul untuk pengolahan data yang kecil dan tingkat perubahan yang rendah dan bersifat sequential, seperti untuk penyimpanan setting parameter perangkat lunak, contohnya pada sistim operasi linux menyimpan user dan password pada file passwd dan shadow. Data dalam bentuk format teks juga umumnya digunakan pada pertukaran data elektronis, dimana data diekstrak dari suatu sistim, kemudian di load ke sistim lainnya. Pengenalan terhadap struktur data dalam teks file biasanya di hardcode pada program aplikasi. Dalam praktek, sering juga dijumpai penyimpanan data dalam spreadsheet, dimana Hendra, MT. & Jimmy, S.Kom. 4

Database Lanjut dengan IBM DB2 memungkinkan data dapat dicari, diringkas secara cepat, tetapi kendala yang dihadapi adalah keterbatasan jumlah baris penyimpanan data, dan kebutuhan data yang dapat diakses bersama oleh beberapa pemakai dalam waktu yang bersamaan.

Pengolahan file sequential pada Java


Suatu sequential file tidak memiliki struktur yang tertentu, pembacaan dan penulisan data dilakukan secara berurutan, masing-masing baris diakhiri dengan CR/LF.

Menulis ke teks file


Salah satu class yang dapat digunakan untuk pengolahan file karakter adalah Class FileWriter, dan penulisan ke file menggunakan Class PrintWriter.
outFile = new FileWriter("c:\\siswa.txt"); PrintWriter out = new PrintWriter(outFile);

Perintah tersebut diatas, akan membuat file c:\siswa.txt yang baru, file c:\siswa.txt telah ada, maka akan di-overwrite. Agar file yang telah ada tidak di-overwrite, melainkan dibuka untuk append, maka dapat ditambahkan argumen true pada FileWriter.
outFile = new FileWriter("c:\\siswa.txt",true); PrintWriter out = new PrintWriter(outFile);

Pembuatan format text dengan ukuran tetap pada masing-masing elemen dapat menggunakan bantuan metoda format() pada String.
String myFormat = "%1$-10s%2$-20s%3$-20s%4$-1s";

Deklarasi variabel string myFormat diatas mempersiapkan format ukuran tetap pada masing-masing elemen yaitu (%1$-10s) adalah format untuk elemen pertama sebagai string dengan panjang 10 karakter, (%2$-20s) adalah format untuk elemen kedua sebagai string dengan panjang 20 karakter, (%3$-20), dan seterusnya, sehingga
out.println(String.format(myFormat, "110102001","Hendra","Database","B"));

Perintah tersebut diatas akan menuliskan data masing-masing elemen yang telah diformat dengan fungsi format String berdasarkan pola yang telah dipersiapkan pada variabel myFormat. Anda dapat menyimpan masing-masing elemen data dengan menggunakan pemisah titik koma (;) dengan format string sebagai berikut:
String myFormat = "%1s;%2s;%3s;%4$1s;";

Hendra, MT. & Jimmy, S.Kom.

Database Lanjut dengan IBM DB2

Membaca dari teks file


Salah satu class yang dapat digunakan untuk pengolahan file karakter adalah Class FileReader, dan pembacaan baris teks menggunakan Class BufferedReader. Untuk jelasnya dapat melihat program berikut ini.
FileReader inFile; try { //open existing file inFile = new FileReader("c:\\siswa.txt"); BufferedReader br = new BufferedReader(inFile); String s; while((s = br.readLine()) != null) { System.out.println(s); } inFile.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0;

Untuk memisahkan masing-masing elemen berukuran tetap dari String, dapat menggunakan metoda substring(), dan trim() untuk memotong kelebihan spasi kanan pada elemen. Untuk jelasnya dapat dilihat pada potongan program berikut ini :
System.out.println("Nim : " + s.substring(0, 9).trim()); System.out.println("Nama : " + s.substring(10, 29).trim()); System.out.println("Mata kuliah : " + s.substring(30, 49).trim()); System.out.println("Nilai : " + s.substring(50, 51).trim());

Untuk memisahkan masing-masing elemen yang dipisahkan dengan titik koma (;) dari String, dapat menggunakan metoda split(), untuk jelasnya dapat melihat potongan program berikut :
String elemen[]; while((s = br.readLine()) != null) { elemen = s.split(";"); System.out.println("Nim : " + elemen[0]); System.out.println("Nama : " + elemen[1]); System.out.println("Mata kuliah : " + elemen[2]); System.out.println("Nilai : "

Hendra, MT. & Jimmy, S.Kom.

Database Lanjut dengan IBM DB2


+ elemen[3]); } Menutup file

Sesuatu hal yang perlu diingat didalam pengolahan file adalah, menutup kembali teks file setelah tidak digunakan lagi.
out.flush(); out.close();

Praktek 1
1. Buatlah sebuah folder pada drive E, dengan menggunakan nomor nim Anda. 2. Aktifkan Netbeans IDE, dan buatlah sebuah aplikasi Java Application. Project Name : Sequential Project Location : E:\ nim anda Otomatis pada project window, akan ditampilkan struktur aplikasi sebagai berikut:

dan pada Main.java, otomatis akan ditampilkan struktur program sebagai berikut: package sequential; public class Main { public static void main(String[] args) { // lakukan pengetikan program anda disini. } } dan ini merupakan struktur dasar program java, dan ketikan program sebagai berikut: package sequential; import java.io.BufferedReader; import java.io.FileWriter; Hendra, MT. & Jimmy, S.Kom. 7

Database Lanjut dengan IBM DB2 import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.ArrayList; import java.util.logging.Level; import java.util.logging.Logger; public class Main { static ArrayList <String[]> list = new ArrayList <String[]>(); public static void main(String[] args) { try { InputStreamReader converter = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(converter); String nim; do { System.out.println("Ketik quit untuk selesai"); System.out.println("Masukan nim:"); nim = in.readLine(); if (!"quit".equals(nim.toLowerCase())) { System.out.println("Masukan nama:"); String nama = in.readLine(); System.out.println("Masukan matakuliah:"); String matakuliah = in.readLine(); System.out.println("Masukan nilai:"); String nilai = in.readLine(); list.add(new String[]{nim, nama, matakuliah, nilai}); } else { tulisData(); } } while (!"quit".equals(nim.toLowerCase())); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } private static int tulisData() { FileWriter outFile; try { //create or append to eof outFile = new FileWriter("c:\\siswa.txt", true); PrintWriter out = new PrintWriter(outFile); Hendra, MT. & Jimmy, S.Kom. 8

Database Lanjut dengan IBM DB2 String myFormat = "%1$-10s%2$-20s%3$-20s%4$-1s"; for(String[] data : list) { out.println(String.format(myFormat, data[0],data[1],data[2],data[3])); } out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; } } 3. Buatlah project baru dengan nama SequentialRead yang mencetak kembali masing-masing data dari C:\siswa.txt. package sequentialread; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class Main { public static void main(String[] args) { FileReader inFile; try { //open existing file inFile = new FileReader("c:\\siswa.txt"); BufferedReader br = new BufferedReader(inFile); String s; while ((s = br.readLine()) != null) { System.out.println("Nim : " + s.substring(0, 9).trim()); System.out.println("Nama : " + s.substring(10, 29).trim()); System.out.println("Mata kuliah : " + s.substring(30, 49).trim()); System.out.println("Nilai : " + s.substring(50, 51).trim()); } inFile.close(); } catch (IOException e) { Hendra, MT. & Jimmy, S.Kom. 9

Database Lanjut dengan IBM DB2 // TODO Auto-generated catch block e.printStackTrace(); } } } 4. Buatlah program SequentialCsv, dan SequentialReadCsv untuk pembuatan text file dengan pemisah data menggunakan titik comma (;)

Hendra, MT. & Jimmy, S.Kom.

10

Database Lanjut dengan IBM DB2

Bab 2, Model Database Relational


Database relasional menyimpan data dalam bentuk dua dimensi yang terlihat oleh pemakai sebagai koleksi dari relasi-relasi (tabel-tabel). Masing-masing relasi terbuat dari tuple-tuple atau record-record dan atribut-atribut atau field-field (untuk selanjutnya kita akan menggunakan istilah tabel, record dan field yang digunakan secara luas). Mahasiswa Nim 110102001 110102002 110102003 110102004

Nama Hendra Susan Sukiman Jimmy

Alamat Jl. Rencong Jl. Thamrin Jl. Batu Jl. Mangkubumi

Jurusan SI SI SI SI

Telepon -

Urutan record pada tabel secara fisik adalah tidak berpengaruh, dan setiap record dalam tabel memiliki identitas berdasarkan suatu field yang memiliki nilai unique yang biasanya merupakan Candidate key2 (secara praktis RDBMS dideklarasikan sebagai primary key). Ada dua karakteristik dari database relational yang memperbolehkan keberadaan data tidak tergantung kepada bagaimana penyimpanannya secara fisik dikomputer, yaitu pemakai tidak perlu tahu lokasi fisik dari suatu record sebagai usaha untuk mengambil data tersebut, tentu hal ini berbeda dengan model hierarki maupun network, dimana pengetahuan struktur merupakan hal yang penting untuk mendapatkan data. Sebagaimana model relasional semakin popular, dan banyak vendor database yang mengiklankan bahwa produk mereka merupakan RDBMS, dan untuk berjuang agar modelnya tidak menjadi kabur, Codd memformulasikan 12 aturan yang merupakan kriteria untuk acuan apakah suatu produk database adalah relasional. Ide Codd bahwa database harus memenuhi semua dari duabelas kriteria dibawah ini untuk dikatakan sebagai relasional. 1. Aturan informasi, data dapat hanya direpresentasikan dengan satu cara, sebagai nilai-nilai didalam posisi kolom pada baris tertentu dari suatu tabel. 2. Aturan garansi akses, setiap nilai didalam suatu database harus dapat diakses dengan menspesifikasikan sebuah nama tabel, sebuah nama kolom, dan sebuah baris. Baris tersebut dispesifikasikan oleh nilai dari primary key. 3. Pananganan yang sistematis terhadap null, data yang tidak ada harus dapat dibedakan dengan nilai tertentu seperti nol dan string kosong. 4. Catalog relasi online, pemakai yang terotorisasi harus dapat mengakses kepada
2

Pada model relational suatu candidate key adalah minimal superkey untuk relasi tersebut yang merupakann himpunan atribut tersebut tidak ada dua tuple yang memiliki superkey yang sama, dan tidak ada proper subset untuk atribut tersebut.

Hendra, MT. & Jimmy, S.Kom.

11

Database Lanjut dengan IBM DB2 struktur database (katalognya) dengan menggunakan bahasa pertanyaan yang mereka gunakan untuk mengakses kepada data di database. 5. Aturan sub bahasa yang komprehensif, sistem harus mendukung minimal satu bahasa relasional yang mana dapat digunakan bersamaan secara interaktif dan didalam program aplikasi, yang mana mendukung definisi data (DDL), manipulasi data (DML), dan fungsi kendali data (DCL). Saat ini adalah suatu bahasa yaitu SQL. 6. Aturan update pada view, semua view yang mana secara teoritis dapat diupdate harus dapat diupdate oleh sistem. 7. Sistem harus mendukung suatu himpunan pada satu operasi insert, update, dan delete. Hal ini berarti bahwa sistem harus mampu melakukan insertion, update, dan delete pada banyak baris didalam satu operasi. 8. Tidak tergantung secara data fisik, perubahan kepada bagaimana data disimpan haruslah tidak memberi pengaruh kepada aplikasi. 9. Tidak tergantung secara logika, perubahan pada tabel-tabel tidak harus mempengaruhi aplikasi. Sebagai contoh, penambahan suatu kolom baru pada suatu tabel tidak akan menghentikan suatu aplikasi yang mengakses kepada baris semula. 10. Bebas integritas, integritas dari konstrain harus dinyatakan secara terpisah dari program aplikasi dan tersimpan didalam katalog. 11. Bebas distribusi, distribusi dari bagian database ke berbagai lokasi tidak mengubah fungsi dari aplikasi. 12. Aturan nonsubversion, jika sistem menyediakan suatu interface satu record pada satu saat (fasilitas fasiltias akses langsung ke tabel seperti bulk load data), hal tersebut harus tidak memungkinkan untuk digunakan melewati relational security ataupun integrity constraint. Selain duabelas aturan tersebut diatas, pada tahun 1990, Codd menambah satu aturan tambahan yaitu: untuk semua sistem yang mengiklankan sebagai, atau menyatakan sebagai RDBMS, maka sistim tersebut harus mampu mengatur database secara keseluruhan dengan kemampuan relasional, dan tidak ada masalah terhadap penambahan kemampuan yang dapat didukung oleh sistem.

Pembuatan Database dengan DB2


Pembuatan database pada DB2 universal database dapat menggunakan DB2 Command Window yang dapat diaktifkan dengan perintah db2cmd, selanjutnya anda dapat menggunakan perintah db2start untuk mengaktifkan service DB2, dan perintah db2stop untuk mematikan service. Untuk membuat database dengan nama Akademik dan menyimpan ke drive D, anda dapat menggunakan perintah sebagai berikut ini: db2 create database akademik on d:

Hendra, MT. & Jimmy, S.Kom.

12

Database Lanjut dengan IBM DB2 Kemudian untuk mengaktifkan database yang telah dibuat dapat menggunakan perintah: db2 connect to akademik Objek-objek database pada db2 akan dikelompokan pada suatu schema, dan secara default schema yang digunakan adalah nama dari pemakai yang aktif, untuk pembuatan schema baru dapat menggunakan perintah berikut ini: db2 create schema=nobody dan schema yang sudah tersedia dapat diaktifkan dengan perintah berikut ini: db2 set schema=nobody Untuk pembuatan tabel dapat menggunakan perintah data definition language (DDL) sebagai berikut: db2 create table mahasiswa (nim varchar(12) not null primary key, nama varchar(100), alamat varchar(200), jurusan varchar(10), telepon varchar(20)) Berikut ini adalah beberapa perintah yang dapat digunakan untuk menampilkan objek pada db2. 1. List Database Directory, untuk menampilkan daftar database yang ada pada sistem. 2. Values Current Schema, untuk menampilkan schema yang sedang aktif. 3. List Tables, untuk menampilkan tabel atau view yang ada pada schema yang sedang aktif. 4. List Tables for Schema=nama-schema, digunakan untuk menampilkan tabel atau view yang ada pada schema tertentu. 5. Describe Table nama-tabel, digunakan untuk menampilkan struktur dari suatu table. 6. Describe Table nama-tabel Detail, digunakan untuk menampilkan struktur dari suatu tabel secara detail Salah satu praktek yang baik didalam pemakaian database adalah melakukan backup data, secara sederhana anda dapat melakukan backup data dengan perintah backup database <database alias> to <path>, dengan contoh sebagai berikut: db2 backup database akademik to e:\920403024 Berikut ini adalah image hasil backup perintah tersebut diatas: Hendra, MT. & Jimmy, S.Kom. 13

Database Lanjut dengan IBM DB2

AKADEMIK.0.DB2.NODE0000.CATN0000.20110401155123.001 dimana 20110401155123 adalah timestamp backup file. dan jika suatu saat hasil backup perlu direstore kembali, anda dapat menggunakan perintah restore database <database alias> from <path> taken at <timestamp> to <drive>, pada saat restore anda perlu menyebutkan timestamp dari image backup yang akan direstore dengan contoh berikut ini: db2 restore database akademik from e:\920403024 taken at 20110401155123 Perintah untuk memutuskan koneksi dari database dapat menggunakan perintah: db2 disconnect all

Koneksi ke DB dengan JDBC


JDBC merupakan API yang terdefinisi pada paket java.sql dan javax.sql untuk koneksi pada database tertentu melalui program Java. Untuk melakukan koneksi ke database tertentu, anda perlu memuat driver untuk database bersangkutan dengan metode Class.forName("com.ibm.db2.jcc.DB2Driver"); yang merupakan driver type 4, dan membuka koneksi dengan menggunakan url yang dispesifikasikan pada driver type 4 yaitu: jdbc:db2://<servername>:<port number>/<database name>. Pemakaian tipe driver tergantung kepada versi JDK yang digunakan. Membuka database Untuk dapat menggunakan driver koneksi ke DB2, maka perlu ditambahkan db2jcc4.jar yang merupakan driver untuk JDBC 4.0 (jika JDK anda tidak mendukung, maka dapat menggunakan db2jcc.jar) kedalam project anda, file-file tersebut diatas dapat diperoleh dari lokasi instalasi DB2 yaitu %db2path%sqllib\java.

Untuk menambah file-file jar tersebut, gunakan klik kanan pada node Libraries, dan pilih Add jar/folder, dan kemudian browsing ke folder dimana jar file berada, pilih file-file tersebut dan klik pada open. Jika proses ini berhasil dilakukan maka pada node Libraries akan tampil sebagai berikut: Selanjutnya untuk membuka koneksi ke database dapat menggunakan perintah: Hendra, MT. & Jimmy, S.Kom. 14

Database Lanjut dengan IBM DB2 Class.forName("com.ibm.db2.jcc.DB2Driver"); con = DriverManager.getConnection("jdbc:db2://localhost:50000/akademik", username, password); dan untuk menutup koneksi dapat menggunakan perintah: con.close(); Catatan: nomor port dapat saja berbeda, untuk setting nomor port dapat dilakukan pada db2cc (control center), dengan setup communication pada instance DB2.

Kemudian klik pada Properties(2), dan tentukan nomor port (secara default adalah 50000)

Hendra, MT. & Jimmy, S.Kom.

15

Database Lanjut dengan IBM DB2

Membuat static class MyDbOpenHelper


Anda dapat membuat sebuah static class yang melakukan pembukaan database yang nantinya dapat digunakan oleh seluruh class pada daur hidup aplikasi anda. public class MyDBOpenHelper { private static Connection con; public static boolean bukaDatabase(String username, String password) { boolean berhasil = false; try { Class.forName("com.ibm.db2.jcc.DB2Driver"); con = DriverManager.getConnection("jdbc:db2://localhost:50000/akademik", username, password); berhasil = true; } catch (SQLException ex) { Logger.getLogger(MyDBOpenHelper.class.getName()) .log(Level.SEVERE, null, ex); } catch (ClassNotFoundException e) { e.printStackTrace(); } return berhasil; } public static void closeConnection() { try { con.close(); } catch (SQLException ex) { Logger.getLogger(MyDBOpenHelper.class.getName()) .log(Level.SEVERE, null, ex); } } public static Connection getConnection() { return con; } }

Latihan
1. Aktifkan db2cmd. 2. Buatlah sebuah database akademik Hendra, MT. & Jimmy, S.Kom. 16

Database Lanjut dengan IBM DB2 3. 4. 5. 6. Aktifkan database akademik Buatlah sebuah schema nobody Aktifkan schema nobody Buatlah sebuah tabel mahasiswa dengan struktur sebagai berikut: nim varchar(12) nama varchar(100) alamat varchar(200) jurusan varchar(10) telepon varchar(20) Dalam hal ini nim adalah primary key. 7. Buatlah perintah yang dapat menunjukan struktur dari tabel mahasiswa. 8. Buatlah perintah yang dapat menampilkan database yang ada pada sistim anda. 9. Lakukan backup terhadap database akademik dengan target folder nim anda. 10. Hapus database akademik dengan perintah db2 drop database akademik 11. Tampilkan kembali semua database yang ada pada sistim anda. 12. Lakukan restore kembali database anda. 13. Buatlah suatu aplikasi KoneksiDB, dan buatlah class MyDBOpenHelper yang berisi metode static untuk pembukaan koneksi, penutupan koneksi, dan pengambilan koneksi. 14. Ujilah class tersebut dengan melakukan modifikasi pada metode main aplikasi anda. package koneksidb; public class Main { public static void main(String[] args) { if (MyDBOpenHelper.bukaDatabase("db2admin","password")) { System.out.println("Berhasil buka database"); } else { System.out.println("Gagal buka database"); } } }

Hendra, MT. & Jimmy, S.Kom.

17

Database Lanjut dengan IBM DB2

Bab 3, Siklus hidup database


Sebagaimana siklus hidup dari sistim, pemanfaatan database pada organisasi juga melalui berbagai tahapan proses mulai dari analisa kebutuhan sampai kepada pemanfaatannya. Secara umum tahapan ini dapat dibagi menjadi tahapan analisa kebutuhan, perancangan secara logika, perancangan secara fisik, dan implementasi Pada masing-masing tahapan membutuhkan berbagai alat pemodelan untuk membuat proses menjadi sistematis dan terdokumentasi dengan baik.

Gambar 2, Siklus hidup database (Sumber: Toby J. Teorey, Sam S. Lightstone, Tom Nadeau, H. V. Jagadish , 2011) Hendra, MT. & Jimmy, S.Kom. 18

Database Lanjut dengan IBM DB2 Perancangan database tidak sifatnya linier atau sekali jalan, tetapi merupakan proses berulang (iteratif) dan bertumbuh (incremental). Proses bertumbuh diperlukan untuk menghasilkan database yang dapat digunakan, sedangkan proses berulang bertujuan menyempurnakan maupun memenuhi perubahan spesifikasi kebutuhan terkait dengan perkembangan organisasi maupun perubahan lingkungan.Perancangan database, sama seperti semua perancangan sistim, menggunakan prinsip perataan (Hohmann 1997). Perataan adalah sama seperti air yang mencari perataannya ketika gelas atau botol digerakan. Ketika situasi berubah, anda perlu bergerak untuk menyesuaikan kebutuhan pada saat tersebut, dalam hal ini berarti kadang-kadang kita perlu membuat struktur fisik, dan pada saat yang lain kita perlu merancang ulang dengan membuat model dan struktur baru.

Analisa kebutuhan
Database dimulai dari pemakai dan kebutuhan mereka, pada tahapan ini biasanya dilakukan pengumpulan informasi awal melalui interview baik penghasil data maupun pemakai dari data dan informasi untuk mendapatkan suatu spesifikasi kebutuhan, spesifikasi tersebut meliputi data yang diperlukan untuk proses, hubungan data secara alamiah, dan platform software untuk database.

Perancangan secara logika


Tahapan awal dari perancangan logika adalah pemodelan, yang merupakan suatu skema secara global yang menunjukan semua data dan keterkaitan antara mereka, dikembangkan dengan menggunakan entity-relationship (ER) diagram maupun unifiedmodeling-language (UML). Hal ini merupakan penghubung antara kebutuhan pemakai dengan solusi software yang akan ditawarkan. Abstraksi pada model menyembunyikan kompleksitas dari sistem sehingga pengembang dapat fokus kepada tujuan sistem dan batasannya yang telah disepakati. Semakin luasnya cakupan permasalahan, maka tahapan pemodelan ini semakin penting. Berbagai varian dari ER dapat digunakan untuk pemodelan (Teorey 1999), dimaka berfokus pada entitas dan hubungan antara mereka.

Perancangan secara fisik


Pada perancangan logika, kita terfokus pada entitas, dan kaitan diantaranya melalui beberapa proses iterasi. Pada perancangan fisik lebih terfokus pada proses optimisasi perfomance melalui proses denormalisasi untuk mendapatkan akses yang lebih cepat dengan menghindari data join yang merupakan konsekuensi mengutamakan kecepatan dari pada menjaga integritas, dimana bisa saja data timbul lebih dari satu tempat didalam database (redundancy). Perancangan fisik umumnya terdiri dari pembuatan lokasi akses, dan struktur penyimpanan, pembuatan indeks untuk tuning kinerja.

Hendra, MT. & Jimmy, S.Kom.

19

Database Lanjut dengan IBM DB2

Implementasi
Pekerjaan perancangan tidak selesai begitu saja pada tahapan implementasi, tetapi membutuhkan perawatan dan perubahan untuk merespon perkembangan kebutuhan organisasi maupun perubahan lingkungan terkait dengan tuntutan konsumen maupun perubahan peraturan pemerintah, sehingga siklus hidup database merupakan siklus perulangan dan pertumbuhan yang berkembang untuk memenuhi kebutuhan pemakai.

Mengenal SQL
Structured Query Language (SQL) merupakan bahasa tingkat tinggi yang memperbolehkan pemakai untuk melakukan manipulasi pada database relational. Salah satu keunggulan dari SQL adalah pemakai hanya perlu menspesifikasikan informatsi yang mereka butuhkan tanpa mengetahui bagaimana mereka akan menerimanya. DBMS bertanggung jawab untuk mengatur semua upaya untuk mendapatkan informasi tersebut. SQL dikembangkan oleh Don Chamberlin dan Ray Boyce dari IBM pada tahun 2970 sebagai bagian dari proyek System R: yang merupakan suatu proyek yang dikembangkan untuk menyediakan implementasi praktis dari model relational Codd. Dewasa ini SQL diterima sebagai bahasa standard untuk database relational. SQL diadopsi menjadi bahasa standard pada tahun 1986 oleh ANSI dan oleh ISO pada tahun 1987. Sejak standarisasi, standard SQL telah diupdate enam kali, dan update yang terakhir adalah pada tahun 2008 yang dikenal seabagai SQL:2008.

Data Definition Language (DDL)


DDL adalah singkatan dari Data Definition Language adalah bagian dari SQL yang yang digunakan untuk melakukan definisi terhadap objek database. Dalam hal ini objek adalah schema, table, view, sequence, catalog, index dan alias.

Pembuatan Schema
Schema merupakan pengelompokan secara logika dari objek database, suatu schema biasanya dimiliki oleh seorang pemakai atau aplikasi, suatu database dapat terdiri dari beberapa schema dari pemakai maupun aplikasi yang berbeda, beberapa perintah terkait dengan pengelolaan schema adalah sebagai berikut: 1. Create Schema nama-schema, membuat sebuah schema. 2. Set Schema=nama-schema, mengaktifkan ke schema yang disebutkan, secara default schema yang aktif adalah sesuai dengan username dari pemakai yang sedang aktif. 3. Values Current Schema, menampilan schema yang sedang aktif. 4. List table for schema nama-schema, manampilan tabel-tabel yang terorganisasi pada schema tertentu. Hendra, MT. & Jimmy, S.Kom. 20

Database Lanjut dengan IBM DB2

Table
Table merupakan visualisasi dari data yang diatur secara dua dimensi yang terdiri dari baris dan kolom, untuk pembuatan table digunakan perintah CREATE TABLE. Contoh: create table matakuliah (kmk varchar(6) not null primary key, keterangan varchar(50), semester integer, sks integer default 4) create table krs (nim varchar(12) not null, kmk varchar(6) not null, semester integer not null, id integer NOT NULL GENERATED ALWAYS AS IDENTITY, primary key(nim, kmk, semester)) Catatan: Pernyataan generated always as identity akan menghasilkan auto-increment field pada kolom id. Jika tidak ditentukan schema sebelumnya (set schema=nama-schema atau schema.namatable), maka secara default tabel akan ditempatkan dibawah schema pemakai yang menjalankan perintah create table tersebut.

Menghapus table
Setelah suatu tabel dibentuk, maka dimungkinkan untuk dihapus. Contoh: drop table krs

Menambah dan menghapus column


Setelah suatu tabel dibentuk, maka dimungkinkan untuk ditambah maupun dihapus kolom-kolom yang ada. Contoh: alter table krs drop column semester alter table krs add column semester integer

Hendra, MT. & Jimmy, S.Kom.

21

Database Lanjut dengan IBM DB2

Mengubah definisi column tertentu


Setelah suatu tabel dibentuk, maka dimungkinkan untuk perubahan pada column tertentu Contoh: alter table matakuliah alter column sks set default 2 alter table matakuliah alter column semester set not null alter table matakuliah alter column semester drop not null alter table matakuliah alter column keterangan set data type varchar(100) alter table matakuliah rename column kmk to kodemk

Menambah dan menghilangkan constraint


Dalam beberapa kasus tertentu, kolom-kolom tertentu membutuhkan batasan tertentu untuk memenuhi aturan bisnis tertentu, adapun jenis constraint yang tersedia pada DB2 adalah NOT NULL constraint, Unique constraint, Primary key constraint, Foreign key constraint, Check constraint. Contoh: alter table mahasiswa add constraint pk_mahasiswa primary key(nim) Perintah tersebut diatas berfungsi menambah sebuah primary key dengan field nim pada tabel mahasiswa . Contoh: alter table mahasiswa add constraint unikktp unique (noktp) Perintah tersebut diatas akan menentukan kolom noktp menjadi unik Contoh: alter table matakuliah add constraint batas_semester check(semester > 0 and umur < 10) alter table krs add constraint batas_semester_krs check(semester > 0 and umur < 19) alter table mahasiswa add constraint bataskelamin check (jkelamin in ('P','W')) Perintah tersebut diatas akan menambahkan constraint check dengan kriteria tertentu.

Hendra, MT. & Jimmy, S.Kom.

22

Database Lanjut dengan IBM DB2 Contoh: alter table siswaku drop constraint batasumur Perintah tersebut diatas akan menghapus constraint dengan nama batasumur

SQL statement Object pada Java


Suatu object Statement digunakan untuk menjalankan perintah SQL seperti untuk pembuatan objek database berupa record baru, table dan view, secara sederhana anda dapat membuat suatu objek Statement dan menjalankannya dengan metode executeUpdate (Insert, Update, Delete) ataupun executeQuery (Select) beserta perintah SQL yang anda inginkan, secara default perintah executeUpdate adalah AUTO COMMIT, contoh: public static void createDatabaseObject() { try { Statement stmtEx; stmtEx = con.createStatement(); stmtEx.executeUpdate("create table mahasiswa " + "(nim varchar(12) not null primary key," + "nama varchar(100)," + "alamat varchar(200)," + "jurusan varchar(10)," + "telepon varchar(20))"); } catch (SQLException ex) {
Logger.getLogger(MyDBOpenHelper.class.getName()).log(Level.SEVERE, null, ex);

} }

Batch Update
Jika perintah update yang ingin dijalankan banyak, anda dapat menggunakan batchUpdate, contoh: try { Statement stmtEx; stmtEx = con.createStatement(); con.setAutoCommit(false);
stmtEx.addBatch("insert into relasi (koderelasi, nama, alamat, hubungi, telepon) " + "values ('s001','xxx','','','')"); stmtEx.addBatch("insert into relasi (koderelasi, nama, alamat, hubungi, telepon) " + "values ('c001','xxx','','','')");

Hendra, MT. & Jimmy, S.Kom.

23

Database Lanjut dengan IBM DB2 int[] result = stmtEx.executeBatch(); con.commit(); } catch (SQLException ex) {
Logger.getLogger(MyDBOpenHelper.class.getName()).log(Level.SEVERE, null, ex);

Latihan
1. 2. 3. 4. Tampilkan database yang ada di sistem, dan hapus semua database tersebut Buatlah database akademik yang secara fisik disimpan di drive D: Buatlah masing-masing tabel mahasiswa, matakuliah, dan krs. Buatlah check constraint untuk semester pada matakuliah dalam batasan 1 s/d 9 semester dan krs dalam batasan 1 s/d 18 semester. 5. Aktifkan kembali project KoneksiDB pada bagian sebelumnya, dan tambahkan metode createDatabaseObject pada class MyDBOpenHelper, dan kemudian jalankan metode createDatabaseObject pada metoda main. 6. Tambahkan kemampuan pada metode createDatabaseObject dengan pembuatan tabel Matakuliah, dan Krs, serta check constraint pada soal no. 4.

Hendra, MT. & Jimmy, S.Kom.

24

Database Lanjut dengan IBM DB2

Bab 4, ER-Diagram
Entity-Relationship Diagram merupakan salah satu alat pemodelan database yang banyak digunakan untuk memodelkan data pada tahapan analisa kebutuhan dan perancangan logika serta dokumentasi. ER-Diagram awalnya diusulkan oleh Peter Chen pada tahun 1976. Pada dasarnya pemodelan ER menggunakan tiga jenis objek yaitu entitas, hubungan, dan atribut.

Entitas
Entitas adalah objek data dimana informasi diambil, mereka biasanya berupa orang, tempat, ataupun sesuatu, maupun kejadian dari sumber informasi seperti Mahasiswa, Dosen, Matakuliah, Kelas, Absensi, Ujian. Masing-masing entitas digambarkan sebagai persegi panjang. Dosen Matakuliah Jurusan Mahasiswa Kelas Absensi Ruang

Ujian

Hubungan
Hubungan merepresentasikan asosiasi dunia nyata antara entitas yang satu dengan yang yang lain (Mahasiswa memilih jurusan, Mahasiswa mengambil Matakuliah, Mahasiswa memiliki Ijazah). Hubungan dinyatakan dalam istilah dari tingkatan, konektivitas, dan keberadaan. Hubungan antara entitas dapat berupa cardinalitas3 one-to-one, one-to-many, dan many-to-many. Hubungan ini digambarkan sebagai suatu bentuk ketupat, secara notasi matematika hubungan tersebut dapat digambarkan sebagai berikut: Mahasiswa M1 M2 M3 M4 ... M:1
3

Jurusan

Mahasiswa

Matakuliah

Mahasiswa

Ijazah

SI TI

M1 M2 M3 M4 ... M:N

K1 K2 K3 K4 ...

M1 M2 M3 M4 ... 1:1

S1 S2 S3 S4 ...

Cardinalitas mereferensikan jumlah maksimal dari suatu instant didalam suatu entitas dapat berasosiasi dengan instant lainnya pada entitas yang berhubungan.

Hendra, MT. & Jimmy, S.Kom.

25

Database Lanjut dengan IBM DB2 Secara notasi Chen dapat digambarkan sebagai berikut: M Mahasiswa memilih 1

Jurusan

Mahasiswa

Mengambil

Jurusan

Mahasiswa

Memilki

Ijazah

Atribut
Atribut adalah karakteristik dari entitas yang menyediakan keterangan detail tentang mereka. Atribut dari seorang manhasiswa dapat terdiri dari nim, nama, alamat, jurusan, asal smu, telepon, nama orang tua, dst. Ada dua jenis atribut yaitu indentifier (atau key) yang digunakan secara unik untuk menentukan keberadaan dari suatu entitas, sebagai contoh indentifier atau key dari mahasiswa adalah nim, masing-masing mahasiswa memiliki nim yang berbeda, sehingga tidak ada duplikasi dari nim pada himpunan mahasiswa. Atribut key digambarkan dengan garis bawah pada ER-Diagram.Selanjutnya atribut lainnya adalah deskriptor (bukan key) digunakan untuk menspesifikasikan karakteristik tidak unique dari keberadaan entitas tertentu, sebagai contoh nama, alamat, asal smu, telepon, nama orangtua, dst. nim nama alamat Asal smu

Mahasiswa

Hendra, MT. & Jimmy, S.Kom.

26

Database Lanjut dengan IBM DB2

Berapa notasi ER
Notasi Crow's Foot

Notasi Chen

Hendra, MT. & Jimmy, S.Kom.

27

Database Lanjut dengan IBM DB2

Notasi Bachman

Notasi Martin

Pada notasi Chen hanya menunjukan cardinalitas, dan tidak menunjukan modalitas4 dibandingkan dengan notasi lainnya.

Modalitas mereferensikan jumlah minimal dari suatu instant didalam suatu entitas dapat berasosiasi dengan instant lainnya pada entitas yang berhubungan. Cardinalitas dapat berupa 1 atau Banyak, dan Modalitas dapat berupa 1 atau 0.

Hendra, MT. & Jimmy, S.Kom.

28

Database Lanjut dengan IBM DB2

Menjaga integritas
Salah satu ciri utama dari sistem database adalah perhatian terhadap integritas data, integritas data dibagi menjadi empat jenis yaitu domain integrity, entity integrity, referential integrity, dan semantic integrity. Umumnya integritas domain diaplikasikan pada atribut, integritas entitas diaplikasikan pada record, integritas referensial diaplikasikan pada relasi, dan integritas semantik memastikan data secara logika pada database. Integritas Domain Digunakan untuk menspesifikasikan untuk masing-masing atribut dengan mendefinisikan suatu jangkauan tertentu, hal tersebut untuk menjaga nilai dari atribut berada didalam jangkauan yang ditentukan untuk menjadi valid, contoh untuk jenis kelamin nilai yang valid adalah P atau W, contoh perintah untuk menspesifikasikan integritas domain. Contoh: alter table matakuliah add constraint batas_semester check(semester > 0 and umur < 10) alter table krs add constraint batas_semester_krs check(semester > 0 and umur < 19) alter table mahasiswa add constraint bataskelamin check (jkelamin in ('P','W')) Integritas Entitas Digunakan untuk menjaga konsistensi dari database pada level record, dimana untuk menjaga agar masing-masing record didalam tabel adalah memiliki identitas unique dan dalam hal ini adalah Primary Key dimana tidak memperbolehkan terjadinya nilai duplikat dan bersifat not null. Contoh: create table matakuliah (kmk varchar(6) not null primary key, keterangan varchar(50), semester integer, sks integer) Integritas Referensial Referential integrity diperlukan untuk menjamin semua nilai atribut (foreign key) pada suatu tabel juga ada sebagai satu nilai atribut (primary key) pada tabel yang memiliki hubungan, kecuali kalau nilai atribut pada foreign key tersebut adalah null, misalnya pada tabel mahasiswa tercatat bahwa mahasiswa ini mengambil jurusan TI, tetapi ternyata Hendra, MT. & Jimmy, S.Kom. 29

Database Lanjut dengan IBM DB2 ditabel jurusan tidak terdapat atribut jurusn TI, tentu saja data jurusan TI pada tabel mahasiswa adalah tidak konsisten, karena merujuk kepada sesuatu nilai yang tidak pernah ada, kecuali kalau jurusan pada tabel mahasiswa diisi sebagai null. Contoh: create table mahasiswa (nim varchar(12) not null primary key, nama varchar(100), alamat varchar(200), jurusan varchar(10), telepon varchar(20), namaortu varchar(100), smu varchar(10)) create table jurusan (jurusan varchar(10) not null primary key, keterangan varchar(100), jenjang varchar(10), jlhsemester integer) create table smu (smu varchar(20) not null primary key, keterangan varchar(100), alamat varchar(200), kota varchar(50), kepalasekolah varchar(100), telepon varchar(20)) alter table mahasiswa add constraint fk_jurusan foreign key (jurusan) references jurusan alter table mahasiswa add constraint fk_smu foreign key (smu) references smu Integritas Semantik Semantic integrity memastikan bahwa data yang dimasukan pada suatu record merefleksikan nilai yang diperbolehkan pada record tersebut, nilai tersebut harus berada dalam domain, atau himpunan nilai yang diperbolehkan, berikut ini beberapa konstraint untuk memaksakan integritas semantik seperti tipe data, nilai default, check constraint.

Membuat index
Suatu index adalah himpunan dari pointer kepada baris-baris pada tabel dasar. MasingHendra, MT. & Jimmy, S.Kom. 30

Database Lanjut dengan IBM DB2 masing index didasarkan pada nilai dari data dalam satu atau lebih kolom pada tabel. Ketika suatu index dibuat, database manager akan membangun objek tersebut dan secara otomatis melakukan maintainance terhadapnya. Index digunakan oleh database manager untuk: Meningkatkan perfomance. Dalam banyak kasus, akses kedata menjadi lebih cepat dengan suatu index, walaupun suatu index tidak dapat dibuat untuk sebuah view, tetapi index yang dibuat untuk tabel akan menjadi dasar bagi view untuk meningkatkan perfomance operasi terhadap view tersebut Memastikan keunikan. Suatu tabel dengan suatu index unik tidak dapat memiliki baris dengan nilai yang sama pada key tersebut. Contoh: alter table mahasiswa add column kodepos varchar(5) create index alamat_idx on mahasiswa(alamat, kodepos) create unique index krs_idx on krs(nim, matakuliah, semester) Jika anda mendapatkan pesan kesalahan Operation not allowed for reason code 7 on table ..., maka anda dapat menggunakan perintah REORG TABLE nama_table untuk menghilangkan reorg pending state setelah pemberian perintah ALTER. Catatan: harus dapat dibedakan antara unique constraint dengan unique index, dimana secara DDL mereka disimpan pada tabel yang berbeda pada system catalog, kemudian secara DML, pemeriksaan terhadap unique constraint dilakukan pada akhir statement, tetapi pada unique index pemeriksaan dilakukan secara baris-per-baris. Sebagai contoh anda memiliki suatu kolom yang berisi nilai 1, 2, dan 3. Jika anda memberikan perintah update xxxx set kolom = kolom + 1, maka perintah ini akan berhasil pada unique constraint kolom, tetapi gagal pada unique index kolom.

Latihan
1. Definisikan entitas-entitas yang mungkin pada suatu database Akademik. 2. Definisikan hubungan antara entitas-entitas tersebut dengan menggambarkannya dalam bentuk notasi Chen. 3. Definisikan atribut-atribut untuk masing-masing entitas dan tentukan mana yang merupakan Atribut key. 4. Buatlah perintah SQL untuk pembuatan masing-masing entitas dengan memperhatikan integritas entitas, integritas domain, integritas referensial dan integritas semantik. 5. Buatlah index yang memungkinkan akses data yang cepat untuk pembuatan laporan tertentu atau pencarian berdasarkan kriteria tertentu. 6. Modifikasi metoda createDatabaseObject untuk menghasilkan database Akademik seperti rancangan anda dan team. Hendra, MT. & Jimmy, S.Kom. 31

Database Lanjut dengan IBM DB2

Quiz
Q1) Manakah yang berikut ini yang akan menjadi konsekuensi dari mendefinisikan kolom IDCOL2 pada TABEL2 sebagai foreign key yang mengacu pada primary key (IDCOL1) pada TABEL1? A. DB2 tidak akan pernah lagi memperbolehkan update nilai pada IDCOL1 pada TABLE1 B. Ketika penyisipan suatu baris pada TABEL2, hanya nilai yang diperbolehkan untuk IDCOL2 adalah yang terdapat nilainya pada IDCOL1 C. Ketika penyisipan suatu baris pada TABEL2, hanya nilai diperbolehkan untuk IDCOL2 adalah yang tidak terdapat nilainya pada IDCOL1 D. Ketika suatu perintah SELECT join TABEL1 dengan TABEL2, DB2 akan secara otomatis menambahkan kondisi TABLE1.IDCOL1=TABLE2.IDCOL2 jika tidak dituliskan didalam perintah tersebut. Q2) constraint apa yang dapat diberikan untuk memastikan bahwa, setiap baris yang dimasukan kedalam dalam suatu tabel, sehingga nilai pada suatu kolom tidak dapat melebihi nilai pada kolom lain? A. Check B. Range C. Referential D. Informational Q3) Mana yang berikut ini benar dari suatu index menggunakan dukungan dari suatu constraint UNIQUE? A. Dia harus memiliki atribut UNIQUE. B. Dia tidak dapat dibuat secara ekplisit oleh user. C. Dia harus memiliki atribut UNIQUE dan CLUSTER. D. Dia harus memiliki atribut UNIQUE WHERE NOT NULL Q4) Jika suatu constraint unique didefinisikan pada kolom COL1 pada tabel TAB1, apa yang menjadi karakteristik dari COL1? A. COL1 akan menerima nilai NULL dan dapat direferensi pada tabel lain sebagai spesifikasi bagi foreign key. B. COL1 tidak akan menerima nilai NULL dan tidak dapat direferensikan pada tabel lain sebagai foreign key. C. COL1 tidak akan menerima nilai NULL dan dapat direferensikan pada tabel lain sebagai foreign key D, COL1 tidak akan menerima nilai NULL dan tidak dapat direferensikan pada tabel lain sebagai foreign key Q5) Dua diantara ini yang bersifat optional pada saat penbuatan tabel? A. Nama tabel B. Nama kolom C. Default constraint D. Tipe data Column E. constraint NOT NULL Q6) Pemberian perintah CREATE TABLE berikut: CREATE TABLE table2 LIKE table1 Dua hal dibawah ini tidak akan terjadi ketika perintah tersebut dijalankan? A. TABLE2 akan memiliki nama kolom dan tipe data sama sebagaimana TABLE1 B. TABLE2 akan memiliki kolom default sebagaimana TABLE1 C. TABLE2 akan memiliki karakteristik nullability sebagaimana TABLE1 D. TABLE2 akan memiliki index yang sama sebagaimana TABLE1. E. TABLE2 akan memiliki referential constraints sebagaimana TABLE1 Q7 Jika SQL statements berikut ini dieksekusi:

Hendra, MT. & Jimmy, S.Kom.

32

Database Lanjut dengan IBM DB2


CREATE TABLE tab1 (id SMALLINT NOT NULL PRIMARY KEY, name VARCHAR(25)); CREATE TABLE tab2 (empid SMALLINT, weekno SMALLINT, payamt DECIMAL(6,2), CONSTRAINT const1 FOREIGN KEY (empid) REFERENCES tab1(id) ON UPDATE NO ACTION); Pernyataan berikut ini yang benar adalah? A. Hanya nilai yang terdapat pada kolom ID pada TAB1 yang diperbolehkan untuk disisipkan pada kolom empid pada tabel TAB2 B. Update terhadap nilai pada kolom ID ditabel TAB1 tidak diperbolehkan C. Hanya nilai yang tidak terdapat pada kolom ID ditabel TAB1 yang diperbolehkan disisipkan pada kolom EMPID pada tabel TAB2 D. Ketika nilai yang telah ada dikolom ID pada tabel TAB1 diupdate, nilai yang bersesuaian pada kolom EMPID di tabel TAB2 juga akan diupdate Q8) Mana dari skenario berikut ini yang akan memastikan bahwa nilai pada kolom NEXT_STEPNO pada baris di tabel TABLEX nilainya ada pada kolom STEPNO (biasanya pada baris lain) ditabel yang sama? A. Mendefinisikan constraint UNIQUE pada kolom NEXT_STEPNO dan STEPNO. B. Mendefinisikan constraint CHECK pada kolom NEXT_STEPNO (NEXT_STEPNO = STEPNO). C. Mendefinisikan kolom STEPNO sebagai primary key dari tabel TABLEX dan kolom NEXT_STEPNO sabagai suatu foreign key yang mengacu pada kolom STEPNO pada tabel yang sama. D. Mendefinisikan kolom NEXT_STEPNO sebagai primary key pada TABLEX dan kolom STEPNO sebagai suatu foreing key yang mengacu pada kolom NEXT_STEPNO pada tabel yagn sama. Q9) Berikut ini yang mana merupakan karakteristik dari schema? A. Referensi foreign key tidak dapat keluar dari batasan schema. B. Suatu pemakai DB2 harus dibuat terlebih dahulu sebelum suatu schema dengan nama yang sama dapat dibuat. C. Jika tidak ada schema yang ditentukan ketika suatu objek dibuat, maka secara default schema PUBLIC akan digunakan. D. Suatu schema memungkinkan untuk pembuatan banyak objek pada suatu database tanpa terhadap bentrokan terhadap namespace. Q10) Jenis constraint berikut ini yang dapat digunakan untuk memastikan nilai INTEGER pada suatu kolom hanya akan berisi nilai positif? A. Unique B. Check C. Referential D. Informational Q11) Jenis constraint apa yang digunakan untuk memastikan bahwa setiap baris yang disisipkan pada tabel EMPLOYEE dengan suatu nilai pada kolom WORKDEPT memiliki baris nilai yang berkoresponden pada kolom DEPTNO pada tabel DEPARTEMEN? A. Suatu constraint chek pada tabel EMPLOYEE B. Suatu constraint unique pada tabel kolom WORKDEPT C. Suatu referensi foreign key dari tabel DEPARTEMEN kolom DEPTNO ke kolom WORKDEPT pada tabel EMPLOYEE D. Suatu referensi foreign key dari tabel EMPLOYEE kolom WORKDEPT ke kolom DEPTNO pada tabel DEPARTEMEN Q12) Berikut ini yang tidak dapat digunakan untuk membatasi nilai tertentu yang akan disisipkanpada

Hendra, MT. & Jimmy, S.Kom.

33

Database Lanjut dengan IBM DB2


kolom di tabel tertentu? A. Index B. Check constraint C. Referential constraint D. Default constraint Q13) Jika tabel TAB1 dibuat dengan menggunakan perintah berikut: CREATE TABLE tab1 (col1 INTEGER NOT NULL, col2 CHAR(5), CONSTRAINT cst1 CHECK (col1 in (1, 2, 3))) Dimana yang berikut ini akan berhasil disisipkan pada tabel TAB1? A. INSERT INTO tab1 VALUES (0, 'abc') B. INSERT INTO tab1 VALUES (NULL, 'abc') C. INSERT INTO tab1 VALUES (ABS(2), 'abc') D. INSERT INTO tab1 VALUES (DEFAULT, 'abc') Q14) Perhatikan definisi tabel berikut ini: EMPLOYEES ---------------------EMPID INTEGER NAME CHAR(20) SALARY DECIMAL(10,2) Jika perintah berikut ini dijalankan: CREATE UNIQUE INDEX empid_ui ON employees (empid) Dimana dua pernyataan berikut ini yang benar? A. Lebih dari satu nilai null diperbolehkan pada kolom EMPID di tabel EMPLOYEES. B. Nilai not null diperbolehkan pada kolom EMPID pada tabel EMPLOYEES. C. Satu (dan hanya satu) nilai null yang diperbolehkan pada kolom EMPID pada tabel EMPLOYEES. D. Tidak ada index unique lainnya yang dapat dibuat pada tabel EMPLOYEES. E. Setiap nilai yang ditemukan didalam kolom EMPID dari tabel EMPLOYEES akan berbeda. Q15) Perhatikan perintah berikut: CREATE TABLE tablea (col1 INTEGER NOT NULL, CONSTRAINT const1 CHECK (col1 in (100, 200, 300)) Berikut ini mana yang dapat disisipkan pada TABLEA ? A. 0 B. NULL C. 100 D. '100' Q16) Gambar entitas-entitas yang mungkin pada database perpustakaan, gambarkan hubungan yang mungkin, dan definisikan atribut-atribut dalam notasi Chen. Q17) Buatlah perintah SQL untuk pembuatan tabel, dan check constraint serta referensial integritas. Q18) Buatlah aplikasi java yang dapat membuat database yang dimasuk beserta tabel, referensial integritas yang ada.

Hendra, MT. & Jimmy, S.Kom.

34

Database Lanjut dengan IBM DB2

Bab 5, Normalisasi
Normalisasi digunakan oleh perancang database untuk merancang database sehingga data mudah diatur, diorganisasikan dan menjaga akurasi data didalam database. Tujuan dari normalisasi adalah untuk menghilangkan duplikasi data, mengurangi kompleksitas, dan mempermudah perbaikan data (menghilangkan anomali), memfasilitasi integritas data (konstraint). Pada proses normalisasi akan dilakukan pengujian pada beberapa kondisi apakah ada anomali pada proses insert, update, delete, bila terdapat anomali pada pengujian tersebut berarti rancangan basis data yang ada belum optimal, sehingga perlu dipecahkan relasi pada tabel tersebut menjadi beberapa tabel baru dan membuat relasi antar tabel tersebut. Proses normalisasi lebih mudah dijelaskan dengan contoh dari pada pernyataan apa itu normal satu, normal dua, dan seterusnya, oleh karena itu kita akan mulai dari contoh terlebih dahulu. Kartu Piutang Kode Relasi : H001 Nama : Hendra Soewarno Alamat : Jl. Rencong No., 52-A Medan Hubungi : Hendra Telepon : 081533113285
No. Piutang A001 A002 Tanggal 1-jan-11 5-jan-11 Tgl. JTempo 15-jan-11 19-jan-11 Nilai 100.100 250.000 No. DK B001 B002 B011 Tanggal DK 15-jan-11 16-jan-11 19-jan-11 Kod eDK 101 102 103 Keterangan Pembayaran Potongan tambahan Retur Nilai DK 100.000 100 250.000

Pada tahapan awal kita akan mentransformasikan kartu piutang tersebut diatas menjadi sebuah tabel flat yang berisi semua informasi tersebut diatas sehingga menjadi sebagai berikut.
(1) Kode Relasi H001 H001 (2) Nama Hendra Soewarno Hendra Soewarno (3) Alamat Jl. Rencong No. 52A Medan. Jl. Rencong No. 52A Medan. (9) Nilai (10) No. DK1 (4) Hubungi Hendra Hendra (5) Telepon 081533113285 081533113285

(6) No. Piutan

(7) Tanggal

(8) Tgl. JTempo

(11) Tanggal DK1

(12) KodeDK 1

(13) Keterangan1

(14) Nilai DK1

Hendra, MT. & Jimmy, S.Kom.

35

Database Lanjut dengan IBM DB2


g A001 A002 1-jan-11 5-jan-11 15-jan-11 19-jan-11 100.100 250.000 B001 B011 15-jan-11 19-jan-11 101 101 Pembayaran Retur 100.00 0 250.00 0

(15) No. DK2 B002

(16) Tanggal DK2 16-jan-11

(17) KodeD K2 102

(18) Keterangan2 Potongan tambahan

(19) Nilai DK2 100

Definisi 1NF: Suatu tabel dikatakan memenuhi bentuk normal pertama jika dan hanya jika setiap atribut pada tabel tersebut adalah atomic, atau dengan kata lain adalah tidak ada perulangan kelompok (repeating group) data pada kolom yang sama atau berbeda pada tabel yang sama. Berdasarkan tabel tersebut diatas terlihat bahwa ada perulangan kelompok data pada kolom 11 dan 15, 12 dan 16, 13 dan 17, kolom 14 dan 18, serta kolom 15 dan 19. Solusi agar tabel diatas memenuhi 1NF adalah mengeluarkan kelompok data yang berulang menjadi baris baru, sehingga tabel diatas menjadi sebagai berikut:
(1) Kode Relasi H001 H001 H001 (2) Nama Hendra Soewarno Hendra Soewarno Hendra Soewarno (3) Alamat Jl. Rencong No. 52A Medan. Jl. Rencong No. 52A Medan. Jl. Rencong No. 52A Medan. (9) Nilai 100.100 100.100 250.000 (10) No. DK B001 B002 B011 (11) Tanggal DK 15-jan-11 16-jan-11 19-jan-11 (4) Hubungi Hendra Hendra Hendra (5) Telepon 081533113285 081533113285 081533113285

(6) No. Piutang A001 A001 A002

(7) Tanggal 1-jan-11 1-jan-11 5-jan-11

(8) Tgl. JTempo 15-jan-11 15-jan-11 19-jan-11

(12) KodeD K 101 102 103

(13) Keterangan Pembayaran Potongan tambahan Retur

(14) Nilai DK 100.000 100 250.000

Jika dilihat tabel tersebut diatas, maka telah memenuhi 1NF, dimana nilai pada masingmasing kolom bersifat atomic dan perulangan kelompok telah dihilangkan, tetapi rancangan tersebut diatas menghadapi masalah insert anomali, update anomali dan delete anomali. Insert anomali Ketika kita menyisipkan relasi baru ke tabel diatas, dan relasi tersebut belum memiliki Hendra, MT. & Jimmy, S.Kom. 36

Database Lanjut dengan IBM DB2 piutang, otomatis kolom yang terisi adalah 1, 2, 3, 4, dan 5, sedangkan kolom 6 s/d 14 harus diisi sebagai null, masalah inilah yang disebut sebagai insert anomali. Update anomali Misalkan terjadi perubahan telepon pada kode relasi H001, sehingga perubahan tersebut harus dilakukan pada 3 record yang berbeda, masalah inilah yang disebut sebagai update anomali. Delete anomali Misalkan dilakukan penghapusan data pembayaran pada baris ketiga, menyebabkan terhapusnya data relasi dan piutang, hal inilah yang disebut sebagai delete anomali. Definisi 2NF: untuk memenuhi bentuk normal kedua, suatu tabel harus dalam bentuk 1NF, ditambah dengan setiap kolom bukan key didalam tabel harus bergantung secara fungsional5 terhadap primary key. Jika kita melakukan analisa terhadap tabel tersebut diatas maka kolom 2,3,4, dan 5 adalah memiliki ketergantungan secara fungsional terhadap Kode Relasi, sedangkan kolom 6 s/d 14 adalah tidak memiliki ketergantungan secara fungsional terhadap Kode Relasi, tetapi tergantung kepada No. Piutang, sehingga perlu dipecah menjadi dua tabel berbeda. Relasi
(1) Kode Relasi (PK) H001 (2) Nama Hendra Soewarno (3) Alamat Jl. Rencong No. 52A Medan. (4) Hubungi Hendra (5) Telepon 081533113285

Piutang
(1) No. Piutang A001 A001 A002 (2) Kode Relasi (FK) H001 H001 H001 (3) Tanggal 1-jan-11 1-jan-11 5-jan-11 (4) Tgl. JTempo 15-jan11 15-jan11 19-jan11 (5) Nilai 100.100 100.100 250.000 (6) No. DK B001 B002 B011 (7) Tanggal DK 15-jan-11 16-jan-11 19-jan-11 (8) Kode DK 101 102 103 (9) Keterangan Pembayaran Potongan tambahan Retur (10) Nilai DK 100.000 100 250.000

Jika kita analisa, maka tabel Relasi telah memenuhi 2NF, tetapi untuk tabel Piutang belum memenuhi, dimana kolom 2, 3, 4, dan 5 berasosiasi tepat pada satu No Piutang, sedangkan kolom 6, 7, 8, 9, dan 10 tidak berasosiasi tepat pada satu No. Piutang, tetapi
5

Notasi dari ketergantungan fungsional adalah A B, dalam hal ini berarti bahwa A menentukan B, B secara fungsional tergantung kepada B, A disebut sebagai determinan, dan B disebut sebagai objek dari determinan. A B, jika masing-masing nilai dari A berasosiasi dengan persisnya satu nilai B, sehingga A secara fungsional menentukan B.

Hendra, MT. & Jimmy, S.Kom.

37

Database Lanjut dengan IBM DB2 kepada NoDK, sehingga tabel Piutang dipecah menjadi dua tabel berbeda. Relasi
(1) Kode Relasi (PK) H001 (2) Nama Hendra Soewarno (3) Alamat Jl. Rencong No. 52A Medan. (4) Hubungi Hendra (5) Telepon 081533113285

Piutang
(1) No. Piutang (PK) A001 A002 (2) Kode Relasi (FK) H001 H001 (3) Tanggal 1-jan-11 5-jan-11 (4) Tgl. JTempo 15-jan-11 19-jan-11 (5) Nilai 100.100 250.000

DKPiutang
(1) No. DK (PK) B001 B002 B011 (2) No Piutang (FK) A001 A001 A002 (7) Tanggal DK 15-jan-11 16-jan-11 19-jan-11 (8) KodeDK 101 102 103 (9) Keterangan Pembayaran Potongan tambahan Retur (10) Nilai DK 100.000 100 250.000

Jika dianalisa bahwa tabel-tabel tersebut diatas telah memenuhi 2NF, yaitu masingmasing kolom berasosiasi tepatnya pada masing-masing Primary Key. Definisi 3NF: Agar berada dalam bentuk normal ketiga, suatu tabel harus memenuhi semua syarat pada 2NF, ditambah dengan semua atribut yang tidak tergantung secara langsung terhadap Primary Key harus dikeluarkan (tidak boleh membuat ketergantungan transitive6). Jika dianalisa, maka tabel Relasi, dan Piutang telah memenuhi 3NF, karena semua atribut bergantung kepada Primary Key-nya masing-masing, tetapi khusus untuk tabel pembayaran, kolom keterangan tidak bergantung langsung kepada No. DK sebagai primary key, tetapi tergantung kepada Kode DK, sedangkan Kode DK bergantung secara langsung kepada No. DK, dalam hal ini kolom Keterangan bergantung kepada No DK dengan transisi melalui KodeDK, sehingga kolom Keterangan harus dikeluarkan. KodeDK
(1) KodeDK (PK) 101
6

(2) Keterangan Pembayaran

Untuk memahami ketergantungan transitive, misalkan kita memiliki tiga buah atribut A, B, dan C yang memiliki koneksi sebagai berikut A B dan B C, dengan kata lain A C, jika kita mengetahui nilai A, kita dapat mengetahui nilai B, dan dapat kita gunakan untuk mendapatkan nilai C, ketergantungan jenis inilah yang disebut sebagai ketergantungan transitive.

Hendra, MT. & Jimmy, S.Kom.

38

Database Lanjut dengan IBM DB2


102 103 Potongan tambahan Retur

DKPiutang
(1) No. DK (PK) B001 B002 B011 (2) No Piutang (FK) A001 A001 A002 (7) Tanggal DK 15-jan-11 16-jan-11 19-jan-11 (8) KodeDK (FK) 101 102 103 (10) Nilai DK 100.000 100 250.000

Setelah proses normaliasi dilakukan, maka dapat terlihat bahwa tabel-tebel tersebut telah terhindar dari masalah anomali pada insert, update dan delete. Pada kasus praktek umunya bentuk 3NF telah mencukupi walaupun masih terdapat BCNF, 4NF dan 5NF yang akan dibahas pada bagian selanjutnya.

Mengenal DML
Data manipulation language adalah perintah yang digunakan untuk mengatur data didalam objek skema database. Adapun beberapa perintah DML yang akan dibahas pada bagian ini adalah INSERT, DELETE dan UPDATE.

INSERT
Perintah insert digunakan untuk menyisipkan record kedalam tabel atau view. Penyisipan baris pada view juga menyisipkan menyisipkan baris kedalam tabel. Contoh : create table relasi (koderelasi varchar(10) not null, nama varchar(50), alamat varchar(100), hubungi varchar(50), telepon varchar(20)) alter table relasi add constraint p_key primary key (koderelasi) insert into Relasi (koderelasi, nama, alamat, hubungi, telepon) values ('H001', 'Hendra Soewarno', 'Jl. Rencong No. 52-A Medan', 'Hendra', '081533113285') Perintah tersebut diatas akan menyisipkan satu record baru ke tabel relasi.

Hendra, MT. & Jimmy, S.Kom.

39

Database Lanjut dengan IBM DB2

UPDATE
Perintah update digunakan untuk mengupdate data pada suatu tabel atau view. Anda dapat mengubah nilai dari satu atau lebih baris yang mana memenuhi kondisi. Misalnya berdasarkan data diatas, terjadi perubahan nilai HP dari Sdr. Hendra menjadi 0816306344, sehingga perintah update yang diberikan adalah: update relasi set telepon='081533113285' where koderelasi='H001' Setelah perintah tersebut diatas dijalankan, maka otomatis data pada tabel relasi khususnya nomor telepon Sdr. Hendra menjadi sebagai berikut:

DELETE
Perintah delete digunakan untuk menghapus record-record dari suatu tabel atau view. Anda dapat menghapus semua record dalam tabel yang memenuhi kondisi. Contoh: delete from relasi Perintah tersebut diatas akan menghapus semua record yang ada didalam tabel relasi. Contoh: delete from relasi where koderelasi='H001' Perintah tersebut diatas akan menghapus semua record yang memiliki koderelasi 'H001'

Prepared Statement pada Java


Jika anda mengeksekusi suatu perintah SQL secara berulang-ulang, adalah perlu memperhatikan bahwa setiap perintah yang dilewatkan ke database server akan melalui proses kompilasi, keunggulan dari prepared statement adalah perintah SQL tersebut telah dikompilasi terlebih dahulu (precompiled), sehingga hanya perlu ditentukan nilai masingmasing parameter dan dieksekusi, jadi proses kompilasi hanya terjadi sekali saja. Selain itu pemakaian prepared statement juga dapat menghindarkan terjadinya eksploitasi SQL Injection. Membuat objek prepared statement Pada awalnya perlu dideklarasikan suatu variabel dengan type PreparedStatement, kemudian juga disiapkan SQL statement dengan masing-masing parameter ditandai sebagai ?, karena nanti pada saat kompilasi awal, nilai dari masing-masing parameter belum diketahui, untuk jelasnya lihat koding berikut ini: Hendra, MT. & Jimmy, S.Kom. 40

Database Lanjut dengan IBM DB2

private PreparedStatement insert; String updateString = "insert into relasi (koderelasi," + "nama, alamat, hubungi, telepon) values (?,?,?,?,?)"; public Relasi() { try { insert = MyDBOpenHelper.getConnection().prepareStatement(updateString); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } } Menyediakan nilai untuk parameter Untuk memasukan masing-masing nilai ke parameter, dapat menggunakan metode setxxx seperti setString, setInteger, setDate, setDouble, sesuai dengan tipe data untuk masingmasing parameter. insert.setString(1, koderelasi); insert.setString(2, nama); insert.setString(3, alamat); insert.setString(4, hubungi); insert.setString(5, telepon); Menjalankan prepared statement Setelah nilai untuk masing-masing parameter telah ditentukan, maka dapat menggunakan metode executeUpdate yang akan mengembalikan suatu nilai integer yang menunjukkan jumlah record yang dipengaruhi oleh perintah executeUpdate tersebut. int result = insert.executeUpdate(); System.out.println("Berhasil insert " + result + " baris.");

Latihan:
1. Buatlah sebuah database Piutang pada sistim DB2 anda. 2. Buatlah sebuah project baru dengan nama Piutang, persiapkan class KoneksiDB, kemudian lengkapi dengan metode createDatabaseObject yang mampu membuat objek-objek database Piutang beserta dengan memperhatikan dengan memperhatikan integritas entitas, integritas Hendra, MT. & Jimmy, S.Kom. 41

Database Lanjut dengan IBM DB2 domain, integritas referensial dan integritas semantik.domain integrity. 3. Buatlah entity class untuk Relasi dengan koding sebagai berikut, dan class AddRelasi, serta modifikasi metoda main untuk menjalankan AddRelasi. Metode createDatabaseObject pada MyDBOpenHelper.java public static void createDatabaseObject() { try { Statement stmtEx; stmtEx = con.createStatement(); stmtEx.executeUpdate("create table relasi " + "(koderelasi varchar(10) not null primary key," + "nama varchar(100) not null," + "alamat varchar(200)," + "hubungi varchar(50)," + "telepon varchar(20))"); stmtEx.executeUpdate("create table piutang " + "(nopiutang varchar(10) not null primary key," + "koderelasi varchar(10) not null," + "tanggal date not null," + "tgljtempo date not null," + "nilai decimal(10,2))"); stmtEx.executeUpdate("create table jenisDK " + "(kodeDK varchar(10) not null primary key," + "keterangan varchar(100))"); stmtEx.executeUpdate("create table DKpiutang " + "(noDK varchar(10) not null primary key," + "nopiutang varchar(10) not null," + "tanggalDK date not null," + "kodeDK varchar(10) not null,"+ "nilaiDK decimal(10,2))"); stmtEx.executeUpdate("alter table piutang " + "alter column nilai set default 0"); stmtEx.executeUpdate("alter table DKpiutang " + "alter column nilaiDK set default 0"); stmtEx.executeUpdate("alter table piutang " + "add constraint periksa_tanggal " + "check(tgljtempo >= tanggal)"); stmtEx.executeUpdate("alter table piutang add constraint " + "fk_relasi foreign key (koderelasi) " + "references relasi"); stmtEx.executeUpdate("alter table DKpiutang add constraint " + Hendra, MT. & Jimmy, S.Kom. 42

Database Lanjut dengan IBM DB2 "fk_piutang foreign key (nopiutang) " + "references piutang"); stmtEx.executeUpdate("alter table DKpiutang add constraint " + "fk_kodeDK foreign key (kodeDK) " + "references jenisDK"); } catch (SQLException ex) {
Logger.getLogger(MyDBOpenHelper.class.getName()).log(Level.SEVERE, null, ex);

} } Relasi.java package piutang.entity; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import piutang.MyDBOpenHelper; public class Relasi { private String koderelasi; private String nama; private String alamat; private String hubungi; private String telepon; private PreparedStatement insert; String insertString = "insert into relasi (koderelasi," + "nama, alamat, hubungi, telepon) values (?,?,?,?,?)"; public Relasi() { try { insert = MyDBOpenHelper.getConnection().prepareStatement(insertString); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } } public String getAlamat() { return alamat; }

Hendra, MT. & Jimmy, S.Kom.

43

Database Lanjut dengan IBM DB2 public void setAlamat(String alamat) { this.alamat = alamat; } public String getHubungi() { return hubungi; } public void setHubungi(String hubungi) { this.hubungi = hubungi; } public String getKoderelasi() { return koderelasi; } public void setKoderelasi(String koderelasi) { this.koderelasi = koderelasi; } public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getTelepon() { return telepon; } public void setTelepon(String telepon) { this.telepon = telepon; } public void create() { try { insert.setString(1, koderelasi); insert.setString(2, nama); insert.setString(3, alamat); insert.setString(4, hubungi); Hendra, MT. & Jimmy, S.Kom. 44

Database Lanjut dengan IBM DB2 insert.setString(5, telepon); int result = insert.executeUpdate(); System.out.println("Berhasil insert " + result + " baris."); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } } } AddRelasi.java package piutang.relasi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import piutang.entity.Relasi; public class AddRelasi { public void start() { InputStreamReader converter = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(converter); Relasi relasi = new Relasi(); String koderelasi=""; do { try { System.out.println("Ketik quit untuk selesai"); System.out.println("Masukan kode relasi:"); koderelasi = in.readLine(); if (!"quit".equals(koderelasi.toLowerCase())) { System.out.println("Masukan nama:"); String nama = in.readLine(); System.out.println("Masukan alamat:"); String alamat = in.readLine(); System.out.println("Masukan hubungi:"); String hubungi = in.readLine(); System.out.println("Masukan telepon:"); String telepon = in.readLine(); relasi.setKoderelasi(koderelasi); relasi.setNama(nama); Hendra, MT. & Jimmy, S.Kom. 45

Database Lanjut dengan IBM DB2 relasi.setAlamat(alamat); relasi.setHubungi(hubungi); relasi.setTelepon(telepon); relasi.create(); } } catch (IOException ex) { Logger.getLogger(AddRelasi.class.getName()).log(Level.SEVERE, null, ex); } } while (!"quit".equals(koderelasi.toLowerCase())); } } Main.java package piutang; import piutang.relasi.AddRelasi; public class Main { public static void main(String[] args) { if (MyDBOpenHelper.bukaDatabase("hendra","920403024")) { System.out.println("Berhasil buka database"); //MyDBOpenHelper.createDatabaseObject(); AddRelasi addRelasi = new AddRelasi(); addRelasi.start(); } else { System.out.println("Gagal buka database"); } } }

Hendra, MT. & Jimmy, S.Kom.

46

Database Lanjut dengan IBM DB2

Bab 6, Normalisasi Lanjutan


BCNF (Coyce-Codd Normal Form)
Setelah diteliti lebih lanjut, ternyata bentuk 3NF masih dapat terjadi redundancy, sehingga diperlukan bentuk normal berikutnya yang BCNF. Trivial function dependency, didalam suatu tabel R, suatu ketergantungan fungsional dalam bentuk A B disebut sebagai trivial functional dependency, jika B adalah himpunan bagian dari A (tidak perlu berupa proper subset), dimana B . Sebagai contoh, A A adalah suatu trivial functional dependency. Subset dan Proper subset, misalkan A = {1, 2, 3, 4}, B = {1, 2, 3}, dan C = {1, 2, 3, 4}, anda dapat mengatakan bahwa C adalah subset dari A, tetapi C bukan merupakan suatu proper subset dari A karena C = A, sedangkan B adalah proper subset dari A karena B A (dimana terdapat menimal satu elemen didalam A tidak ada didalam B). Non-trivial functional dependency, didalam suatu tabel R, suatu ketergantungan fungsional dari bentuk A B dikatakan sebagai non-trivial, jika B bukan merupakan subset dari A, dimana B A. Untuk berada dalam BCNF, tabel harus berada dalam bentuk 3NF dan untuk setiap nontrivial function dependency A B, A adalah suatu super key. Dengan kata lain, suatu tabel dalam BCNF jika dan hanya jika setiap determinan adalah suatu Candidate key7. Misalkan kita memiliki tabel Pertemuan(Mahasiswa, MataKuliah, Dosen) sebagai berikut: Pertemuan Mahasiswa Tony Thomas Indra Wilson Matakuliah DBLanjut DBLanjut ClientServer ClientServer Dosen Hendra Hendra Jimmy Jimmy

Tabel tersebut diatas memenuhi 3NF, tetapi dapat terjadi anomali, dimana kita tidak dapat menambahkan dosen dan matakuliah tanpa memasukan mahasiswa. Sehingga tabel pertemuan tersebut dapat diubah menjadi BCNF dengan memecah tabel tersebut kedalam
7

Suatu Candidate key dari suatu tabel adalah suatu Superkey minimal untuk tabel tersebut.

Hendra, MT. & Jimmy, S.Kom.

47

Database Lanjut dengan IBM DB2 dua tabel . Pertemuan(Mahasiswa, Matakuliah, Dosen) {Mahasiswa, Matakuliah} Dosen Matakuliah Dosen Sehingga T1 (Mahasiswa, Dosen) T2 (Dosen, Matakuliah) Mahasiswa Tony Thomas Indra Wilson Matakuliah DBLanjut DBLanjut ClientServer ClientServer

Matakuliah DBLanjut ClientServer

Dosen Hendra Jimmy

Perlu diketahui bahwa semua BCNF adalah dalam bentuk 3NF, tetapi tidak semua 3NF adalah BCNF, secara ringkas proses normalisasi sampai kepada BCNF diillustrasikan sebagai berikut:

4NF dan 5NF


Bentuk normal sampai dengan BCNF telah cukup untuk tingkat normalisasi, tetapi pada kenyataannya ada dua bentuk normal yang diperlukan untuk mengeleminasi sisa dari Hendra, MT. & Jimmy, S.Kom. 48

Database Lanjut dengan IBM DB2 anomali yang diketahui yaitu terjadinya multivalued dependency8 dan join dependency pada suatu tabel, pada situasi umumnya semua tabel BCNF adalah secara otomatis memenenui 4NF dan 5NF, tetapi jika keterbatasan ini muncul, diperlukan perbaikan lanjutan untuk mengkoreksi anomali.

4NF
Tujuan dari bentuk normal keempat adalah mengeleminasi non-trivial multivalued dependency dari suatu tabel dengan memproyeksi mereka kedalam tabel yang lebih kecil. Definisi 4NF: suatu tabel dalam bentuk 4NF jika dan hanya jika berada dalam BCNF, dan hanya memiliki satu ketergantungan multivalued didalam R (sebagai contoh X Y), paling sedikit satu dari padanya mengandung ketergantungan multivalued adalah trivial atau X adalah SuperKey dari tabel R. Contoh: joborder(Departemen, Pekerjaan, Mesin) yang menunjukan departemen dan pekerjaan yang ditanggani serta mesin yang dimiliki. joborder departemen d1 d1 d1 d1 d2 d2 d2 d2 pekerjaan j1 j1 j2 j2 j3 j3 j4 j4 mesin p1 p2 p1 p2 p3 p4 p3 p4

Jika kita ingin menambah suatu mesin kepada departemen, maka kita perlu menyisipkan beberapa baris, dan jika kita ingin menghapus suatu mesin dari departemen, maka dapat menyebabkan kehilangan pekerjaan yang ditangani departemen tersebut.
8

Misalkan sebuah tabel R memiliki tiga buah atribut yaitu A, B, dan C, dimana untuk setiap nilai didalam A adalah himpunan untuk nilai B dan himpunan untuk nilai C, dan tetapi himpunan nilai B dan C tidak tergantung satu sama yang lain, dengan demikian terjadi ketergantungan multivalued antara atribut A, B, dan C didalam tabel R. A B menyatakan bahwa untuk setiap nilai dari A terdapat himpunan nilai untuk B, A C menyatakan untuk setiap nilai A terdapat himpunan nilai untuk C.

Hendra, MT. & Jimmy, S.Kom.

49

Database Lanjut dengan IBM DB2

Dalam hal ini terjadi ketergantungan multivalued yaitu: Departemen Pekerjaan, dimana menyatakan bahwa satu departemen dapat mengerjakan beberapa pekerjaan (multivalued dependency) Departemen Mesin, diaman menyatakan bahwa satu departemen dapat memiliki beberapa mesin(multivalued dependency) Pada tabel joborder, departemen bukan merupakan SuperKey, untuk mengubah tabel tersebut menjadi 4NF dengan dekomposisi menjadi dua tabel sebagai berikut: T1 (departemen, pekerjaan) T2 (departemen, mesin) Dekomposisi: proses memecah suatu tabel menjadi dua tabel atau lebih. departemen d1 d1 d2 d2 pekerjaan j1 j2 j3 j4

departemen d1 d1 d2 d2

mesin p1 p2 p3 p4

5NF
Join dependency , dapat dikatakan ada jika gabungan dari R1 dan R2 melalui C adalah sama dengan relasi R, dimana R1 dan R2 adalah dekomposisi dari R1(A, B, C) dan R2(C, D) dari relasi diberikan R(A, B, C, D) Suatu tabel berada dalam bentuk 5NF jika setiap join dependency adalah suatu konsekuensi dari Candidate key relasinya. dengan kata lain suatu tabel dalam bentuk 5NF jika dia tidak ada join dependency.

Hendra, MT. & Jimmy, S.Kom.

50

Database Lanjut dengan IBM DB2 Contoh: Karyawan Thomas Thomas Thomas Thomas John Abhishek Ketrampilan Analyst Analyst DBA Analyst DBA Analyst Pekerjaan P-1 P-2 P-2 P-3 P-1 P-1

Tabel tersebut dalam bentuk BCNF dan 4NF, dapat menimbulkan anomali karena terjadi saling ketergantungan diantara gabungan, sebagai contoh Thomas dimana memiliki ketrampilan Analyst dan DBA ditugaskan kepada P-2, dimana P-2 membutuhkan kedua ketrampilan tersebut. Karyawan yang sama Thomas ditugaskan hanya sebagai Analyst pada P-1 yang hanya membutuhkan ketrampilan Analyst dan bukan ketrampilan DBA. Maka timbul anomali ketika kita menghapus Thomas, P-2 (mengeluarkan Thomas dari Pekerjaan P-2), karena kita kehilangan data bahwa Thomas memiliki ketrampilan DBA, sehingga tabel diatas dapat didekomposisi menjadi: Ketrampilan Karyawan Thomas Thomas John Abhishek KebutuhanKetrampilan Pekerjaan P-1 P-2 P-2 P-3

Ketrampilan Analyst Analyst DBA Analyst

Ketrampilan Analyst Analyst DBA DBA

Hendra, MT. & Jimmy, S.Kom.

51

Database Lanjut dengan IBM DB2

Penugasan Karyawan Thomas Thomas Thomas John Abhishek

Pekerjaan P-1 P-2 P-3 P-1 P-1

Jika Thomas dikeluarkan dari P-2, maka kita menghapus Thomas, P-2, tetapi tidak mempengaruhi tabel lainnya. Secara ringkas proses Normalisasi didalam perancangan database adalah ditunjukan pada Gambar

Hendra, MT. & Jimmy, S.Kom.

52

Database Lanjut dengan IBM DB2

Mengenal Data Query Language


Perintah select digunakan untuk mengambil data dari satu atau beberapa tabel maupun view. Anda dapat melakukan filter dengan menggunakan kondisi untuk membatasi pengambilan data tertentu. Contoh: select * from relasi Perintah diatas akan mengambil semua data dari tabel relasi Contoh: select * from relasi fetch first 5 rows only Perintah ditas akan mengambil lima baris pertama dari tabel relasi. Contoh: select * from relasi where koderelasi like J% Perintah diatas akan mengambil semua baris yang memiliki kode relasi dimulai dengan huruf J. Contoh: select nama, alamat from relasi Perintah diatas akan mengambil kolom nama dan alamat dari semua baris ditabel relasi.

Aggregate
Fungsi aggregate yang tersedia pada DB2 terdiri dari COUNT, COUNT_BIG, AVG, MAX, MIN, STDDEV, SUM dan VARIANCE, untuk perintah COUNT dan COUNT_BIG hasilnya tidak dapat berupa nilai null, sedangkan untuk perintah lainnya dapat menghasilkan jika diaplikasi pada suatu himpunan kosong. Contoh: select count(*) as hitung_baris from relasi Perintah diatas akan mendapatkan jumlah baris yang ada pada tabel relasi Contoh: select count(*) as hitung_baris from relasi where nama like 'hendra%'

Hendra, MT. & Jimmy, S.Kom.

53

Database Lanjut dengan IBM DB2 Perintah diatas akan mendapatkan jumlah baris yang namanya diawali dengan kata Hendra.

ORDER BY
Untuk mendapatkan hasil pengembalian data sesuai dengan urutan berdasarkan kolom tertentu, maka pada perintah Select dapat dilengkapi dengan pernyataan ORDER BY Contoh: select * from relasi order by nama select * from relasi order by nama DESC select * from relasi order by nama, kota select * from relasi order by nama DESC, kota DESC

GROUP BY
Perintah GROUP BY dapat digunakan untuk meringkas data berdasarkan pengelompokan kolom tertentu. Biasanya pemakaian perintah GROUP di kombinasikan dengan pemakaian aggregate. Contoh :
(1) No. DK (pk) B001 B002 B011 B012 (2) Tanggal DK 15-jan-11 16-jan-11 19-jan-11 25-jan-11 Tabel Bayar (3) Kode DK (fk) 101 102 101 101 (4) Nilai DK 100.000 100 200 50.000 (5) No. Piutang (fk) A001 A001 A002 A002

select nopiutang, sum(nilaidk) as jumlah_bayar from bayar group by nopiutang Akan mengembalikan NoPiutang A001 A002

Jumlah_bayar 100100 250000

Perintah tersebut diatas akan meringkas data jumlah pembayaran untuk masing-masing nopiutang.

HAVING
Evaluasi kondisi terhadap nilai yang merupakan hasil dari fungsi Aggregate dapat Hendra, MT. & Jimmy, S.Kom. 54

Database Lanjut dengan IBM DB2 dilakukan dengan menggunakan pernyataan Having. select nopiutang, sum(nilaidk) as jumlah_bayar from bayar group by nopiutang having sum(nilaidk) > 200000 Perintah tersebut diatas akan menampilkan data pembayaran piutang dinama jumlah pembayaran per-nomor piutang memiliki nilai diatas 200000

Resultset
Sebagai hasil dari eksekusi DQL adalah sebuah Resultset, suatu resultset dapat berupa satu baris baris tunggal maupun lebih. Untuk pengambilan nilai dari masing-masing kolom menggunakan metoda dengan format sebagai berikut: type getType(int | String) Dalam hal ini berupa getInt, getString, getDate, getDouble, kemudian argumen adalah nomor kolom yang akan diambil nilainya, karena resultset bekerja pada satu baris suatu saat, untuk berpindah ke baris berikutnya dapat menggunakan metoda next(). Jika metoda next() berhasil, maka akan mengembalikan true, dan false jika tidak ada baris berikutnya. Contoh: Relasi.java package piutang.entity; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import koneksidb.MyDBOpenHelper; public class Relasi { private String koderelasi; private String nama; private String alamat; private String hubungi; private String telepon; private PreparedStatement insert; String insertString = "insert into relasi (koderelasi," + "nama, alamat, hubungi, telepon) values (?,?,?,?,?)"; Hendra, MT. & Jimmy, S.Kom. 55

Database Lanjut dengan IBM DB2

private PreparedStatement update; String updateString = "update relasi set nama=?," + "alamat=?, hubungi=?, telepon=? where koderelasi=?"; private PreparedStatement select; String selectString = "select nama, alamat, hubungi, telepon " + "from relasi where koderelasi=?"; public Relasi() { try { insert = MyDBOpenHelper.getConnection().prepareStatement(insertString); update = MyDBOpenHelper.getConnection().prepareStatement(updateString); select = MyDBOpenHelper.getConnection().prepareStatement(selectString); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } } public String getAlamat() { return alamat; } public void setAlamat(String alamat) { this.alamat = alamat; } public String getHubungi() { return hubungi; } public void setHubungi(String hubungi) { this.hubungi = hubungi; } public String getKoderelasi() { return koderelasi; } public void setKoderelasi(String koderelasi) { this.koderelasi = koderelasi; } Hendra, MT. & Jimmy, S.Kom. 56

Database Lanjut dengan IBM DB2

public String getNama() { return nama; } public void setNama(String nama) { this.nama = nama; } public String getTelepon() { return telepon; } public void setTelepon(String telepon) { this.telepon = telepon; } public void create() { try { insert.setString(1, koderelasi); insert.setString(2, nama); insert.setString(3, alamat); insert.setString(4, hubungi); insert.setString(5, telepon); int result = insert.executeUpdate(); System.out.println("Berhasil insert " + result + " baris."); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } } public void update() { try { update.setString(1, nama); update.setString(2, alamat); update.setString(3, hubungi); update.setString(4, telepon); update.setString(5, koderelasi); int result = update.executeUpdate(); System.out.println("Berhasil update " + result + " baris."); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); Hendra, MT. & Jimmy, S.Kom. 57

Database Lanjut dengan IBM DB2 } } public boolean getById(String koderelasi) { boolean result = false; try { ResultSet rs; select.setString(1, koderelasi); rs = select.executeQuery(); if (rs.next()) { this.koderelasi = koderelasi; nama = rs.getString(1); alamat = rs.getString(2); hubungi = rs.getString(3); telepon = rs.getString(4); result = true; } rs.close(); } catch (SQLException ex) { Logger.getLogger(Relasi.class.getName()).log(Level.SEVERE, null, ex); } return result; } } EditRelasi.java package piutang.relasi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import koneksidb.entity.Relasi; public class EditRelasi { public void start() throws IOException { InputStreamReader converter = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(converter); Relasi relasi = new Relasi(); String koderelasi=""; Hendra, MT. & Jimmy, S.Kom. 58

Database Lanjut dengan IBM DB2 do { try { System.out.println("Ketik quit untuk selesai"); System.out.println("Masukan kode relasi:"); koderelasi = in.readLine(); if (!"quit".equals(koderelasi.toLowerCase())) { if (relasi.getById(koderelasi)) { System.out.println("Ubah nama " + relasi.getNama()+":"); String nama = in.readLine(); System.out.println("Ubah alamat " + relasi.getAlamat()+":"); String alamat = in.readLine(); System.out.println("Ubah hubungi " + relasi.getHubungi()+":"); String hubungi = in.readLine(); System.out.println("Ubah telepon " + relasi.getTelepon()+":"); String telepon = in.readLine(); relasi.setNama(nama); relasi.setAlamat(alamat); relasi.setHubungi(hubungi); relasi.setTelepon(telepon); relasi.setKoderelasi(koderelasi); relasi.update(); } } } catch (IOException ex) { Logger.getLogger(AddRelasi.class.getName()).log(Level.SEVERE, null, ex); } } while (!"quit".equals(koderelasi.toLowerCase())); } }

Latihan
1. Misalkan anda diberi sebuah KRS sebagai berikut ini: Kartu Rencana Studi Nim : 920403024 Nama : Hendra Jurusan : Teknik Industri Fakultas : Teknik Semester : 2 Tahun Akademik: 1992/1993 Hendra, MT. & Jimmy, S.Kom. 59

Database Lanjut dengan IBM DB2

KodeMK MKU-01 MKI-01 MKU-02 MKI-02 dst

Matakuliah Bahasa Indonesia Pengantar Teknik Industri Agama Kalkulus 1 Jumlah

SKS 3 4 2 4 18

Medan, 10 Januari 1993 Disetujui,

Ir. Harmein Nasution, MSIE. Lakukan perancangan database melalui proses normalisasi sampai kepada 5NF jika diperlukan untuk menghilangkan anomali-anomali. 2. Buatlah program yang dapat melakukan proses perbaiki data relasi, dan diaktifkan melalui pilihan pada main. public static void main(String[] args) { if (MyDBOpenHelper.bukaDatabase("hendra","920403024")) { try { System.out.println("Berhasil buka database"); System.out.println("1. Tambah Relasi"); System.out.println("2. Perbaiki Relasi"); System.out.println("X. Pesiapan Data"); System.out.print("Ketik pilihan anda:"); InputStreamReader converter = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(converter); String pilih = in.readLine(); if ("1".equals(pilih)) { AddRelasi addRelasi = new AddRelasi(); addRelasi.start(); } else if ("2".equals(pilih)) { EditRelasi editRelasi = new EditRelasi(); editRelasi.start(); Hendra, MT. & Jimmy, S.Kom. 60

Database Lanjut dengan IBM DB2 } else if ("X".equals(pilih.toUpperCase())) { MyDBOpenHelper.createDatabaseObject(); } MyDBOpenHelper.closeConnection(); } catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);

} } else { System.out.println("Gagal buka database"); } } 3. Buatlah aplikasi hapus data relasi (DeleteRelasi.java) Petunjuk: Program meminta pemakai memasukan koderelasi, kemudian dilakukan pencarian ke tabel Relasi, jika ditemukan, maka ditampilkan detail data relasi (nama, alamat, hubungi, telepon), kemudian dikonfirmasi apakah pemakai yakin akan menghapus data tersebut, jika Ya, maka proses penghapusan dilakukan.

Hendra, MT. & Jimmy, S.Kom.

61

Database Lanjut dengan IBM DB2

Bab 7, Denormalisasi
Denormalisasi adalah proses yang berorientasi kepada optimisasi unjuk kerja pembacaan dari database dengan memperbolehkan redundancy data ataupun melalui proses pengelompokan data. Proses pengelompokan data pada denormalisasi umumnya digunakan untuk datawarehouse maupun database transaksi online yang membutuhkan respon yang cepat, dan sesuatu hal yang perlu diperhatikan adalah denormalisasi berbeda dengan database yang tidak dinormalisasi. Sebagaimana kita ketahui bahwa proses normalisasi dilakukan dengan memisahkan tabel untuk menghindari terjadinya redundancy dan timbulnya masalah anomali pada insert, update dan delete. Pemisahan data tersebut menyebakan data tersebar pada bebera tabel yang berbeda akan meningkatkan proses I/O ketika data perlu dibaca dan dirakit kembali menjadi informasi melalui perintah JOIN, jika proses JOIN cukup banyak, maka unjuk kerja database menjadi rendah. Proses denormalisasi dilakukan dengan memperbolehkan terjadinya redundancy pada kolom tertentu sehingga meningkatkan kinerja pembacaan (SELECT) tetapi beresiko terhadap kinerja penulisan (INSERT, UPDATE, DELETE). Setiap keputusan proses denormalisasi perlu didokumentasi, termasuk latar belakang alasan terkait dengan keputusan tersebut. Ingat hanya ada satu alasan yang valid untuk proses denormalisasi pada saat perancangan database relasional, yaitu untuk peningkatan kinerja. Berikut ini adalah kriteria yang dapat digunakan untuk pertimbangan denormalisasi: 1. Jumlah kritikal query atau laporan yang diperlukan lebih dari satu tabel, jika kebutuhan ini perlu diproses pada lingkungan transaksi online, suatu proses denormalisasi dapat meningkatkan kinerja. 2. Banyaknya kalkulasi perlu diterapkan pada satu atau banyak kolom sebelum query dapat berhasil menjawab, menyimpan nilai yang diturunkan atau prekalkulasi dapat menurunkan I/O dan CPU sehingga perolehan data menjadi cepat. 3. Tabel-tabel perlu diakses dengan cara yang berbeda dan oleh pemakai yang berbeda pada kerangka waktu yang bersamaan. 4. Banyak primary key berukuran besar sehingga menyebabkan proses query yang besar, dan memakan tempat penyimpanan ketika disimpan sebagai foreign key pada tabel yang berhubungan. Tetapi sesuatu hal yang perlu diperhatikan pada denormalisasi adalah menjaga semua data yang redundan tersebut dalam kondisi akurat.

DQL SQL bagian 2


Pada bagian ini kita akan melakukan eksplorasi yang lebih lanjut terhadap perintah SELECT, dimana dimungkinkan pemakaian fungsi aggregate, pengurutan, peringkasan, Hendra, MT. & Jimmy, S.Kom. 62

Database Lanjut dengan IBM DB2 dan pengabungan.

JOIN
Pernyataan join digunakan untuk memasangkan data suatu tabel dengan tabel lainnya yang berhubungan, sehingga dapat diambil kolom-kolom dari masing-masing tabel yang bersesuaian. Pemakaian join memungkinkan kita menampilkan data dari beberapa tabel hasil dekomposisi melalui dinormalisasi kembali ke bentuk 2NF, dimana sering dibutuhkan pada saat penampilan data maupun pembuatan laporan.

INNER JOIN
Jenis join ini akan mengembalikan hasil yang memiliki baris dari tabel pertama yang memiliki pasangan terhadap tabel kedua berdasarkan ekspresi join. Contoh:
(1) Kode Relasi (pk) J001 H001 (2) Nama Jimmy Cruz Hendra Tabel Relasi (3) Alamat Jl. Mangkubumi No. 11 Medan Jl. Rencong No. 52-A (4) Hubungi Jimmy Hendra (5) Telepon 081234578 81533113

(1) No. Piutang (pk) A001 A002

(2) Tanggal 1-jan-11 5-jan-11

Tabel Piutang (3) Tgl. JTempo 15-jan-11 19-jan-11

(4) Nilai 100.100 250000

(5) Kode Relasi (fk) J001 J001

Select a.koderelasi, a.nama, a.hubungi, a.telepon, b.nopiutang, b.tgljtempo, b.nilai from relasi a inner join piutang b on a.koderelasi = b.koderelasi Menampilkan data dalam bentuk 2NF Koderelasi Nama hubungi Telepon J001 J001
Jimmy Cruz Jimmy Cruz Jimmy Jimmy 81234578 81234578

Nopiutang Tgljtempo Nilai


A001 A002 01/15/11 01/19/11 100100 250000

Berdasarkan contoh tersebut diatas, dari dua tabel yang telah dinormaliasi, kemudian dilakukan proses join, menghasilkan tampilan tabel dalam bentuk normal kedua.

Hendra, MT. & Jimmy, S.Kom.

63

Database Lanjut dengan IBM DB2

LEFT OUTER JOIN dan RIGHT OUTER JOIN


Jika perintah inner join hanya mengembalikan baris-baris yang memiliki pasangan saja pada kedua tabel sesuai dengan ekspresi join, maka pernyataan LEFT JOIN akan mengembalikan semua baris yang memiliki pasangan pada kedua sisi, dan bagi tabel pertama yang tidak memiliki pasangan pada tabel kedua, maka untuk kolom-kolom yang berasal dari tabel kedua akan berisi nilai null. Contoh: Select a.koderelasi, a.nama, a.hubungi, a.telepon, b.nopiutang, b.tgljtempo, b.nilai from relasi a left join piutang b on a.koderelasi = b.koderelasi Koderelasi Nama J001 J001 H001
Jimmy Cruz Jimmy Cruz Hendra

hubungi
Jimmy Jimmy Hendra

Telepon
81234578 81234578 81533113

Nopiutang Tgljtempo Nilai


A001 A002 Null 01/15/11 01/19/11 Null 100100 250000 null

Sedangkan pernyataan RIGHT JOIN mengembalikan semua baris yang memiliki padangan pada kedua tabel, dan bagi tabel kedua yang tidak memiliki pasangan pada tabel pertama, maka untuk kolom-kolom yang berasal dari tabel pertama akan berisi null.

FULL JOIN
Jika LEFT OUTER JOIN maupun RIGHT OUTER JOIN hanya mengambil baris penuh dari salah satu sisi saja, maka pernyataan FULL JOIN akan mengambil baris baik dari tabel pertama maupun tabel yang kedua, bagi masing-masing sisi yang tidak ada pasangannya akan diisi sebagai null. Contoh: T1 Kode A B Nilai1 10 20

T2 Kode B Hendra, MT. & Jimmy, S.Kom. Nilai2 20 64

Database Lanjut dengan IBM DB2 C 30

Select a.kode, a.nilai1, b.kode as kodeb, b.nilai2 from T1 a Full Join T2 b on a.Kode = b.Kode Akan menghasilkan Kode A B null Nilai1 10 20 null Kodeb null B C Nilai2 null 20 30

CASE WHEN THEN ELSE END


Pernyataan CASE WHEN dapat digunakan untuk mengevaluasi nilai hasil select, dan menentukan nilai baru bardasarkan hasil evaluasi. Contoh:
(1) No. Piutang (pk) A001 A002 (2) Tanggal 1-jan-11 5-jan-11 Tabel Piutang (3) (4) Tgl. Nilai JTempo 15-jan-11 19-jan-11 100.100 250.000 (5) Kode Relasi (fk) J001 J001

(1) No. DK (pk) B001 B002 B011

(2) Tanggal DK 15-jan-11 16-jan-11 19-jan-11

Tabel DKPiutang (3) (4) Kode DK Nilai DK (fk) 101 100.000 102 100 101 200000

(5) No. Piutang (fk) A001 A001 A002

Select a.nopiutang, a.tgljtempo, a.nilai, case when sum(b.nilaidk) is null then 0 else sum(b.nilaidk) end as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.tgljtempo, a.nilai atau dapat juga dengan menggunakan fungsi COALESCE Hendra, MT. & Jimmy, S.Kom. 65

Database Lanjut dengan IBM DB2

Select a.nopiutang, a.tgljtempo, a.nilai, coalesce(sum(b.nilaidk),0) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.tgljtempo, a.nilai Sesuai dari sifat dari LEFT JOIN, dimana dimungkinkan nilai null jika pasangan tabel pertama tidak ditemukan pada tabel kedua, sehingga nilai bayar perlu dikonversi menjadi nol. Kedua query tersebut menghasilkan tampilan sebagai berikut:
(1) No. Piutang (pk) A001 A002 (2) Tanggal 1-jan-11 5-jan-11 Hasil Query (3) Tgl. JTempo 15-jan-11 19-jan-11 (4) Nilai 100.100 250.000 (5) Bayar 100100 200000

Kemudian jika kita menjalankan query sebagai berikut ini: Select a.nopiutang, a.tgljtempo, a.nilai, sum(b.nilaidk) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.tgljtempo, a.nilai having a.nilai <> sum(b.nilaidk) Akan menghasilkan tampilan data piutang yang belum lunas.
(1) No. Piutang (pk) A002 (2) Tanggal 5-jan-11 Hasil Query (3) Tgl. JTempo 19-jan-11 (4) Nilai 250.000 (5) Bayar 200000

Kemudian jika kita menjalankan query sebagai berikut ini: Select a.nopiutang, a.tgljtempo, a.nilai - sum(b.nilaidk) as sisaAR from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.tgljtempo, a.nilai having a.nilai <> sum(b.nilaidk) Hendra, MT. & Jimmy, S.Kom. 66

Database Lanjut dengan IBM DB2

(1) No. Piutang (pk) A002

Hasil Query (2) (3) Tanggal Tgl. JTempo 5-jan-11 19-jan-11

(4) SisaAR 50000

Subquery
Didalam suatu query dimungkinkan terdapat perintah query didalamnya, berikut ini contoh menampilkan sisa AR dengan subquery select nopiutang, sum(nilai-bayar) from (select a.nopiutang, a.nilai, coalesce(sum(b.nilaidk),0) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.tgljtempo, a.nilai) group by nopiutang
Hasil Query (1) No. Piutang (pk) A002 (4) SisaAR 50000

Contoh lain: Select nim from calon_mahasiswa where umur = (select min(umur) from calon_mahasiswa)

Union
Union digunakan untuk mengabung hasil dua queri menjadi satu tampilan dengan menghilangkan data yang sama, dengan contoh sebagai berikut: select a.tanggal, a.nopiutang as 'NoRef' , '4010' as 'Noperk' , 'Piutang Dagang' as 'Keterangan', a.nilai as 'NilaiDK' from piutang A union select a.tanggal, a.nodk, a.kodeDK, b.keterangan, -a.nilaidk from dkpiutang A inner join jenisDK B on a.kodeDK = b.kodeDK Sehingga dihasilkan:

Hendra, MT. & Jimmy, S.Kom.

67

Database Lanjut dengan IBM DB2


Hasil Query (1) Tanggal 01/01/11 01/15/11 01/16/11 A001 B001 B002 (2) NoRef 4010 101 102 (3) NoPerk Pembayaran Potongan tambahan (4) Keterangan Piutang Dagang (5) NilaiDK 101000 100000 1000

Jika penghilangan data yang sama tidak dibutuhkan, maka dapat menggunakan UNION ALL.

Intersect dan Difference


Selain operator Union, juga tersedia operator Intersect yang digunakan untuk menampilkan baris yang sama untuk dua hasil queri, sedangkan perintah difference akan menghasilkan baris hanya terdapat pada hasil queri yang pertama terhadap hasil queri yang kedua.

Latihan
1. Buatlah program input piutang 2. Buatlah program input kodeDK 3. Buatlah program input pembayaran piutang. Petunjuk: Pada awalnya akan ditanyakan no.piutang, kemudian program akan menampilkan informasi terkait dengan piutang tersebut dan sisaAR, kemudian pemakai akan menginput nomor pembayaran, tanggal, jenisDK dan nilai bayar. Select a.nopiutang, a.tgljtempo, a.nilai, sum(b.nilaidk) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang where a.nopiutang = ? group by a.nopiutang, a.tgljtempo, a.nilai

Hendra, MT. & Jimmy, S.Kom.

68

Database Lanjut dengan IBM DB2

Bab 8, Perancangan Database


Pada bagian-bagian sebelumnya kita telah membahas mengenai pemodelan database, dan proses normalisasi untuk menghilangkan berbagai anomali, maka bagian ini kita akan membahas lebih lanjut mengenai perancangan database. Sebagaimana siklus hidup Database, perancangan database dimulai melalui tahapan sebagai berikut: 1. Analisa kebutuhan 2. Perancangan logika 1. Pemodelan konseptual 2. Integrasi View 3. Transformasi model konseptual ke tabel 4. Proses normalisasi 5. Perancangan fisik

Analisa kebutuhan
Analisa kebutuhan erat kaitannya dengan analisa sistim. Pada tahapan ini dilakukan analisa karakteristik dan kebutuhan penghasil dan pemakai data yang mana akan disimpan didalam database, pada tahapan ini hal-hal yang dilakukan adalah sebagai berikut: 1. Memahami organisasi perusahaan, mengindentifikasi tujuan dan strategi perusahaan, area fungsional, posisi staf dan tanggung jawabnya. 2. Menentukan kebutuhan informasi dari organisasi untuk mendukung tujuan dan fungsinya. 3. Memspesifikasikan sistem yang akan dikembangkan terkait dengan kebutuhan data, informasi, jenis, frekuensi, bentuk dari operasi input dan output sistim Sumber utama dari informasi yang dibutukan pada tahapan ini adalah wawancara dengan orang yang terlibat didalamnya, dokumen dan laporan yang diperloleh selama proses tersebut.

Perancangan logika
Berdasarkan hasil pengumpulan data dan analisa yang telah dilakukan pada tahapan analisa kebutuhan, maka selanjutnya dilakukan pengambaran ER-Diagram yang merepresentasikan entitas-entitas yang terlibat didalamnya, dan hubungan antar entitas tersebut, dan atribut-atribut untuk masing-masing entitas. Untuk proses perancangan yang melibatkan beberapa team perlu dilakukan proses integrasi view untuk mengabungkan bagian yang dirancang oleh team lain menjadi suatu kesatuan rancangan untuk menghindari redundancy.

Hendra, MT. & Jimmy, S.Kom.

69

Database Lanjut dengan IBM DB2

transformasi model ke tabel


Setelah mendapatkan suatu model yang disepakati, maka langkah selanjutnya adalah melakukan transformasi masing-masing entitas beserta dengan atributnya kedalam bentuk tabel untuk melakukan proses normalisasi.

Proses normalisasi
Masing-masing tabel perlu dilakukan proses normalisasi untuk menghilangkan berbagai anomali yang mungkin timbul. Misalkan untuk suatu invoice perlu didekomposisi menjadi tabel header dan detail.

Perancangan Fisik
Perancangan fisik dilakukan dengan native terhadap target sistim database yang digunakan, termasuk tipe data dengan memperhatikan integritas entitas, integritas domain, integritas referensial dan integritas semantik, dan pembuatan index untuk kinerja pencarian data dan peringkasan data, termasuk partisi dan clustering.

View atau Tabel Virtual


Didalam teori database, suatu view terdiri dari perintah SQL yang tersimpan sebagai suatu tabel virtual yang merupakan hasil dari Query. Berbeda dengan tabel biasanya didalam database relational, suatu view bukan bagian dari schema fisik, melakinkan bersifat dinamis, hasil komputasi atau pengabungan dari data didalam database. Pemakaian view memiliki beberapa keuntungan dibandingkan dengan tabel: View dapat merepresentasikan suatu bagian dari tabel yang terdapat didalam tabel. View dapat mengabungkan dan menyederhanakan beberapa tabel kedalam suatu tabel virtual tunggal. View dapat bertindak sebagai aggregate dari tabel-tabel sebagai hasil fungsi aggregate (sum, average, dll). View dapat menyembunyikan kerumitan dari data, dimana data yang besar dapat dipartisi menjadi sub-sub data sesuai dengan kronologisnya, misalnya Penjualan2010, Penjualan2011. Pada DB2 view dapat digunakan untuk tujuan keamanan, dimana untuk user tertentu hanya diperbolehkan untuk melihat bagian dari tabel maupun partisi dari data. Contoh: create view piutangHendra as select * from piutang where koderelasi = 'H001'

Hendra, MT. & Jimmy, S.Kom.

70

Database Lanjut dengan IBM DB2

Kemudian kita dapat menggunakan perintah select untuk menampikan hasil dari view sama seperti tabel biasanya. Select * from piutangHendra

UPDATE data pada View


Sesuatu hal yang perlu anda ketahui adalah pada view tertentu memungkinkan update data (lihat 12 aturan COFF tentang RDBMS) dilakukan, dan akan mempengaruhi data pada tabel yang menjadi dasar dari view tersebut. Contoh: insert into piutangHendra (nopiutang, tanggal, tgljtempo, nilai, koderelasi) values ('A003','01-20-2011','01-30-2011',150000,'H001'); update piutangHendra set nilai=175000 where nopiutang='A003'; Perintah insert dan update tersebut diatas mempengaruhi tabel piutang yang merupakan tabel dasar bagi view piutangHendra. Create view arAging as select a.nopiutang, a.koderelasi, a.tanggal, a.tgljtempo, case when (days(current_date) - days(a.tgljtempo) <=0) then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as belum_jto, case when (days(current_date) - days(a.tgljtempo) > 0 and days(current_date) - days(a.tgljtempo) <=30) then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as tunggak_dibawah_30, case when (days(current_date) - days(a.tgljtempo) > 30) then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as tunggak_diatas_60 from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.koderelasi, a.tanggal, a.tgljtempo, a.nilai having a.nilai - coalesce(sum(b.nilaidk),0) <> 0

Hendra, MT. & Jimmy, S.Kom.

71

Database Lanjut dengan IBM DB2

Select * from ArAging Query tersebut diatas dijalankan akan menghasilkan tampilan sebagai berikut:

Nopiutang Koderelasi Tanggal

Tgljtempo Belum jto

Tunggakan Tunggakan < 30 hari 30 keatas

TampilARAging.java package piutang.relasi; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import koneksidb.MyDBOpenHelper; public class TampilARAging { public void start() { try { PreparedStatement select; String selectString = "select * from ARAging"; select = MyDBOpenHelper.getConnection().prepareStatement(selectString); ResultSet rs; rs = select.executeQuery(); String myFormat = "%1$-10s" + "%2$-20s "+ "%3$te-%3$tm-%3$tY "+ "%4$te-%4$tm-%4$tY "+ "%5$15.2f "+ "%6$15.2f "+ "%7$15.2f"; while (rs.next()) { System.out.println(String.format(myFormat, Hendra, MT. & Jimmy, S.Kom. 72

Database Lanjut dengan IBM DB2 rs.getString(1), rs.getString(2), rs.getDate(3), rs.getDate(4), rs.getDouble(5), rs.getDouble(6), rs.getDouble(7))); } rs.close(); } catch (SQLException ex) {
Logger.getLogger(TampilARAging.class.getName()).log(Level.SEVERE, null, ex);

} } }

Latihan
1. Tambahkan pada createDatabaseObject untuk membuat view ARAging, kemudian buatlah program yang dapat menampilkan daftar ARAging. 2. Buatlah program yang dapat menampilkan kartu piutang dari nomor AR yang diberikan dengan bentuk sebagai berikut:

(1) Tanggal 01/01/11 01/15/11 01/16/11 A001 B001 B002

(2) NoRef 4010 101 102

(3) NoPerk Pembayaran

(4) Keterangan Piutang Dagang Potongan tambahan

(5) NilaiDK 101000 100000 1000

Hendra, MT. & Jimmy, S.Kom.

73

Database Lanjut dengan IBM DB2

Quiz:
Q1) Suatu view dibuat dengan perintah berikut ini: CREATE VIEW v1 AS SELECT col1, col2, col3, col4 FROM t1 WHERE col4 > 1000 WITH CHECK OPTION Apa yang menjadi efek dari pernyataan CHECK OPTION? A. Setiap baris yang diinsert atau diupdate melalui view v1 harus memenuhi kondisi dimana col4 > 1000. B. Mulai saat ini, setiap baris yang diinsert pada tabel T1 harus memenuhi kondisi dimana col4 > 1000, tetapi baris yang ada pada tabel saat ini tidak diperiksa. C. Pada pembuatan view, DB2 memeriksa data pada tabel T1, dan jika ada baris yang tidak memenuhi kondisi col4 > 1000, pembuatan view tersebut akan ditolak. D. Setiap baris yang diinsert atau diupdate melalui view V1 harus memenuhi kondisi col4 > 1000 dan tidak ada baris pada tabel T1 yang dapat diupdate dengan col4 <= 1000, tetapi baris baru yang diinsert pada tabel T1 dapat dengan col4 <= 1000. Q2) Berikut ini bukanlah alasan untuk membuat view pada suatu tabel? A. Membatasi akses pemakai terhadap bagian data tertentu pada tabel B. Memastikan baris yang disisipkan berada pada batasan dari definisi C. Membuat aksi sebagai hasil dari perubahan terhadap tabel D. Memberikan alternatif bagi pemakai untuk menampilkan data pada tabel Q3) Suatu aplikasi perlu untuk menyimpan gambar JPEG berukuran 5 MB pada tabel DB2, mana tipe data berikut ini yang harus digunakan pada kolom yang akan menyimpan gambar tersebut? A. GRAPHIC B. BINARY C. IMAGE D. BLOB Q4) Suatu view dibuat dengan perintah berikut ini: CREATE VIEW v1 AS SELECT col1, col2, col3 FROM t1 WHERE col4 > 1000 ; Kapan DB2 mengakses data dari tabel T1 ke View V1? A. Ketika V1 dibuat B. Setiap waktu perintah REFRESH VIEW v1 dieksekusi C. Setiap waktu suatu perintah SQL dieksekusi terhadap view V1 D. Hanya pertama kali waktu perintah SQL dieksekusi terhadap view V1 Q5) Jika perintah SQL berikut dijalankan: CREATE TABLE make (makeid SMALLINT NOT NULL PRIMARY CREATE TABLE model (modelid SMALLINT, KEY, make VARCHAR(25));

Hendra, MT. & Jimmy, S.Kom.

74

Database Lanjut dengan IBM DB2


model VARCHAR(25), makeid SMALLINT, CONSTRAINT const1 FOREIGN KEY (makeid) REFERENCES make(makeid) ON DELETE RESTRICT); Dan pada masing-masing tabel diisikan nilai berikut ini: MAKE MAKEID -----1 2 3 MAKE -------Ford Chevrolet Toyota

MODEL MODELID MODEL MAKEID ------- ------- -------1 Mustang 1 2 Escort 1 3 Malibu 2 4 Camry 3 Jika perintah SQL berikut ini dijalankan: DELETE FROM make WHERE makeid = 1 Berapa jumlah baris yang akan terhapus? A. 0 B. 1 C. 2 D. 3 Q6) Perhatikan perintah berikut: CREATE TABLE tablea (col1 INTEGER NOT NULL, CONSTRAINT const1 CHECK (col1 in (100, 200, 300)) Berikut ini mana yang dapat disisipkan pada TABLEA ? A. 0 B. NULL C. 100 D. '100' Q7) Berikut ini yang mana aturan penghapusan pada CREATE TABLE akan memperbolehkan baris pada table parent akan dihapus jika suatu baris yang tergantung ada? A. ON DELETE RESTRICT B. ON DELETE NO ACTION C. ON DELETE SET NO VALUE D. ON DELETE CASCADE Q8) Berikut ini yang bukan merupakan karakteristik dari suatu unique index? A. Setiap kolom pada tabel dasar hanya dapat berpartisipasi disatu unique index, tanpa memperhatikan bagaimana kolom tersebut dikelompokan (kolom yang sama tidak dapat digunakan pada banyak unique index) B. Agar suatu index dapat digunakan untuk mendukung suatu constraint unique, dia harus didefinsikan dengan atribut UNIQUE. C. Suatu index unique tidak dapat dibuat untuk sebuah tabel yang telah terisi dengan nilai NULL lebih dari

Hendra, MT. & Jimmy, S.Kom.

75

Database Lanjut dengan IBM DB2


satu untuk kolom tersebut D. Suatu unique index hanya dapat dibuat untuk suatu kolom non-nullable Q9) Jika perintah berikut ini dijalankan: CREATE TABLE employee (empid INT NOT NULL GENERATED BY DEFAULT AS IDENTITY (START WITH 1, INCREMENT BY 5), name VARCHAR(20), dept INT CHECK (dept BETWEEN 1 AND 20), hiredate DATE WITH DEFAULT CURRENT DATE, salary DECIMAL(7,2), PRIMARY KEY(empid), CONSTRAINT cst1 CHECK (YEAR(hiredate) > 2006 OR Salary > 60500)); Mana yang berikut ini yang perintah INSERT akan gagal? A. INSERT INTO employee VALUES (15, 'Smith', 5, '01/22/2004', 92500.00) B. INSERT INTO employee VALUES (DEFAULT, 'Smith', 2, '10/07/2002', 80250.00) C. INSERT INTO employee VALUES (20, 'Smith', 5, NULL, 65000.00) D. INSERT INTO employee VALUES (DEFAULT, 'Smith', 10, '11/18/2004', 60250.00) Q10) Dimana tipe data berikut ini pada DB2 yang memiliki ukuran tetap? A. XML B. BLOB C. DOUBLE D. DBCLOB Q11) Berikut ini yang digunakan untuk menyatakan suatu kolom tidak akan menerima nilai null dan dapat direferensi oleh foreign key pada tabel lain? A. Check constraint B. Unique constraint C. Default constraint D. Informational constraint Q12) Diberikan skenario berikut: Tabel TABLE1 perlu untuk menyimpan nilai tertentu sampai kepada 9999999.999 didalam kolom COL1. Sesaat setelah TABLE1 dipopulasikan, operasi aritmatika akan dilakukan pada data yang tersimpan pada kolom COL1. Berikut ini mana yang menjadi tipe data yang paling sesuai di DB2 untuk COL1? A. INTEGER B. REAL C. NUMERIC(7, 3) D. DECIMAL(10, 3) Q13) Perhatikan perintah berikut ini: CREATE TABLE tab1 (col1 SMALLINT NOT NULL PRIMARY KEY, col2 VARCHAR(200) NOT NULL WITH DEFAULT NONE, col3 DECIMAL(5,2) CHECK (col3 >= 100.00), col4 DATE NOT NULL WITH DEFAULT)

Hendra, MT. & Jimmy, S.Kom.

76

Database Lanjut dengan IBM DB2


Definisi yang manakah yang menyebabkan perintah CREATE TABLE gagal? A. COL1 B. COL2 C. COL3 D. COL4 Q14) Jenis key yang mana didefinisikan pada tabel anak untuk mengimplementasikan suatu referential constraint? A. Unique key B. Primary key C. Foreign key D. Composite key Q15) Berikut ini mana yang tidak benar tentang schema? A. Jika suatu nama schema tidak ditentukan, baik pada penyebutan objek database maupun pemakaian perintah SET CURRENT SCHEMA, id otorisasi sesi pemakai yang aktif digunakan sebagai default B. Nilai yang diberikan pada register khusus CURRENT SCHEMA akan dipertahankan walaupun database diaktifkan ulang C. Suatu schema memungkinkan pembuatan banyak objek database tanpa mengalami bentrokan pada namespace D. Ketika objek database dibuat mereka secara implicit maupun eksplicit dimasukan kedalam schema Q16) Buatlah aplikasi pengelolaan data piutang, mulai dari pembuatan database, tambah, edit, hapus untuk masing-masing tabel relasi, kodeDK, piutang dan pembayaran piutang, sampai kepada pencetakan ARAging.

Hendra, MT. & Jimmy, S.Kom.

77

Database Lanjut dengan IBM DB2

Bab 9, Perfomance tuning


Salah satu dari tujuan utama database adalah menyediakan waktu yang tepat untuk menjawab pemakai. Pemakai berinteraksi dengan DBMS menggunakan query untuk menghasilkan informasi dengan urutan kerja sebagai berikut: 1. Aplikasi klien membuat suatu query 2. Query tersebut dikirim ke server DBMS 3. DBMS menjalankan query tersebut 4. DBMS mengirim himpunan data yang dihasilkan kepada aplikasi klien. Pemakai mengharapkan query mereka mengembalikan hasil secepat mungkin, bagaimana anda bisa tahu bahwa kinerja dari suatu database adalah baik? Waktu yang diperlukan oleh query untuk untuk mengembalikan suatu hasil tergantung kepada banyak faktor, salah satunya adalah hardware dari sistim yang digunakan seperti kekuatan CPU, ketersediaan memori utama, kecepatan I/O dan jaringan, kemudian komponen berikutnya adalah sistim operasi dan aplikasi klien, dan terakhir adalah rancangan dari database. Untuk mendapatkan kecepatan yang terbaik dari suatu sistim membutuhkan pendekatan holistik dari hal tersebut diatas, sehingga semua hal tersebut diatas perlu diperiksa untuk memastikan masing-masing bekerja pada tingkatan optimal berdasarkan sumber daya yang tersedia untuk meminimalkan terjadinya bottlenecks. Pada bagian ini kita akan lebih memfokuskan pada perancangan database yang baik dan efisien. Apa yang dimaksud dengan suatu rancangan database yang baik dan efisien? Dari sudut pandang perfomance tuning, rancangan database harus memastikan integritas dan kinerja yang baik dari database. Pada level rancangan, kinerja database dipengaruhi oleh dua hal, yaitu pada sisi klien dan sisi server, pada sisi klien bertujuan menghasilkan perintah SQL yang mengembalikan jawaban yang benar dengan jangka waktu yang pendek, dalam hal ini kita berurusan dengan SQL perfomance tuning. Pada sisi server, lingkungan DBMS harus dikonfigurasikan dengan baik untuk menjawab permintaan klien secepat mungkin dengan batasan resouces yang tersedia dan dalam hal ini kita berurusan dengan DBMS perfomance tuning. Untuk memahami perfomance tuning, alangkah baiknya kita memahami dasar bagaimana penangangan request dari klien ditangani oleh DBMS adalah sebagai berikut: Semua data didalam suatu database tersimpan didalam data file. Suatu database enterprise biasanya terdiri dari beberapa data file. Suatu datafile dapat mengandung baris dari satu tabel tunggal, ataupun baris dari tabel-tabel yang berbeda. Seorang DBA menentukan ukuran awal dari data file yang membentuk database, walaupun sebenarnya datafile dapat secara otomatis berkembang menurut suatu increment yang telah ditentukan sebelumnya yang dikenal sebagai extends, sebagai contoh jika lebih banyak ruang yang dibutuhkan, maka datafile Hendra, MT. & Jimmy, S.Kom. 78

Database Lanjut dengan IBM DB2 diperbesar dalam ukuran 10KB ataupun 10MB.

Data files biasanya dikelompokan didalam file group atau table spaces. Suatu table spaces atau file group adalah pengelompokan secara logika dari beberapa data files yang mana menyimpan data dengan karakteristik yang sama. Misalkan anda memiliki suatu system table space yang menyimpan data disctionary dari tabel, suatu table space data user yang menyimpan tabel yang dibuat oleh user; suatu table space index yang menyimpan semua indeks; dan suatu table space temporary yang melakukan proses pengurutan, pengelompokan sementera. Setiap kali anda membuat suatu database baru, DBMS secara otomatis membuat suatu himpunan table space yang minimal. Data cache atau buffer cache adalah sesuatu yang berbagi, cadangan area memori yang menyimpan data blok yang paling terakhir diakses ke RAM. Data cache adalah data yang dibaca dari data files disimpan setelah data tersebut dibaca ataupun sebelum file tersebut ditulis ke data files database. Data cache juga mencache catalog sistim dan isi dari indeks. SQL cache atau procedure cache adalah sesuatu yang berbagi, cadangan area memori yang menyimpan perintah SQL yang paling terakhir dieksekusi atau PL/SQL procedure, termasuk trigger, dan fungsi. Untuk bekerja dengan data, DBMS harus mengambil data dari penyimpanan data permanen dan menempatkannya ke RAM. Untuk memindahkan data dari penyimpanan data permanen (data files) ke RAM (data cache), DBMS mengeluarkan I/O request dan menunggu jawaban, dan permintaan tersebut dalam ukuran blok fisik media yang dapat terdiri dari banyak baris dari media permanen ke memori, ukuran blok tergantung pada sistim 79

Hendra, MT. & Jimmy, S.Kom.

Database Lanjut dengan IBM DB2 operasi, dapat berupa 4K, 8K, 16K, 32K, 64K bahkan lebih besar. Bekerja dengan data yang berada pada data cache adalah berkali-kali lebih cepat dari pada bekerja dengan data didalam data files, karena DBMS tidak berlu menunggu hardisk untuk mendapatkan data tersebut, sehingga tidak ada operasi I/O hardisk. Pada umumnya aktifitas performance-tuning terfokus pada meminimalkan operasi I/O, karena I/O merupakan memiliki perfomance yang paling rendah didalam sistim database. Listener, adalah process yang mendengar kepada permintaan klien dan menangani proses SQL request, sesaat suatu permintaan diterima, listener melewatkan permintaan tersebut kepada user process yang sesuai. User, DBMS membuat proses user untuk menangani masing-masing sesi klien. Ketika anda melakukan login ke DBMS, anda akan diberikan satu user process. Scheduler, proses scheduler mengatur konkurensi eksekusi dari SQL request. Lock manager, process yang mengatur semua lock yang ditempatkan pada objek database, termasuk disk page.

Komponen lainnya yang memiliki peran penting didalam optimalisasi query adalah database statistics. Database statistics digunakan DBMS untuk membuat keputusan kritikal bagaimana meningkatkan efisiensi didalam memproses query. Database statistics dapat dikumpulkan oleh DBA atau secara otomatis oleh DBMS, misalkan vendor database mendukung perintah ANALYZE pada SQL untuk mengumpulkan statistics seperti prosedur RUNSTATS pada DB2. Suatu perintah query yang diberikan akan di parse menjadi bagian-bagian yang lebih kecil, dan kemudian dianalisa oleh query optimizer untuk mencari cara yang paling efisien untuk mendapatkan data, adapun langkah pada query parser adalah sebagai berikut: Validasi kebenaran sintak Validasi kebenaran nama tabel dan kolom terhadap data dictionary Validasi kebenaran hak pemakai Analisa dan dekomposisi menjadi komponen atomic. Optimisasi melalui transformasi menjadi sql query yang lebih efisien Mempersiapkan eksekusi dengan menentukan rencana akses yang paling efisien. Rencana akses dapat melakukan berbagai operasi sebagai berikut: 1. Table Scan (full), membaca keseluruhan tabel secara berurutan, dari baris satu sampai terakhir (paling lambat) 2. Table Access (row id), membaca satu baris pada tabel secara langsung menggunakan nomor row id (paling cepat), tidak perlu mencari 3. Index Scan (Range), membaca file indeks untuk mendapatkan row id dan Hendra, MT. & Jimmy, S.Kom. 80

Database Lanjut dengan IBM DB2 kemudian mnelakukan Table Access. (lebih cepat dari pada Table Scan) Index Access (unique), digunakan ketika tabel memiliki unique index pada kolom. Nested Loop (untuk operasi join), membaca dan membandingkan sekelompok dari nilai dengan kelompok nilai lainnya (lambat) Merge (untuk operasi join), memngabungkan dua kelompok data (lambat) Sort, Mengurut kelompok data (lambat)

4. 5. 6. 7.

Setelah ditentukan akses plan, maka dilakukan eksekusi, pada tahapan ini dilakukan penguncian jika perlu untuk mendapatkan data yang akan diakses dari data file dan ditempatkan pada data cache. Selanjutnya data diurut, dikelompokan, diaggregasi (jika perlu) untuk kemudian dikembalikan ke klien.DBMS dapat saja menggunakan table space sementara untuk menyimpand ata sementara, dalam hal ini database server berkoordinasi dengan klien untuk memindahkan baris-baris yang dihasilkan secara bertahap.

Index dan Optimisasi Query


Jika kita memperhatikan rangkaian eksekusi terhadap suatu query, maka dapat dilihat bahwa suatu index memiliki peran penting untuk mempercepat akses data, karena mereka memfasilitasi pencarian, pengurutan, dan aggregasi dan bahkan operasi pengabungan (join). Peningkatan kecepatan dapat terjadi karena index adalah suatu himpuan nilai-nilai yang mengandung index key dan pointer yang berupa row id terhadap tabel sebenarnya. Scara konseptual suatu index menyerupai indeks pada buku. Suatu index scan adalah lebih efisien dibandingkan dengan table scan. Kebanyakan DBMS mengimplementasikan index dari salah satu struktur data sebagai berikut: Hash index, suatu algoritma hash digunakan untuk membuat nilai hash dari kolom kunci, nilai ini menunjuk kepada suatu daftar di hash table yang mana merupakan titik balik ke row id. Jenis index ini bagus untuk operasi pencarian yang sederhana dan cepat. B-tree index, ini merupakan default untuk kebanyakan index yang digunakan didalam database. Index B-tree digunakan pada tabel yang memiliki perulangan nilai yang relatif sedikit. B-tree index adalah suatu struktur data berurut yang diatur dari atas kebawah. Pohon index disimpan terpisah dari data. Daun pada level lebih rendah dari index B-tree mengandung pointer kepada row id yang sebenarnya. Index B-tree adalah self-balanced yang mana berarti mengambil jumlah akses yang sama untuk mencari suatu barid didalam index. Bitmap index, digunakan untuk aplikasi data warehouse dalam tabel yang memiliki banyak baris dengan nilai kolom yang berulang banyak kali. Bitmap indeks menggunakan tempat yang lebih kecil dibandingkan dengan index B-tree.

Hendra, MT. & Jimmy, S.Kom.

81

Database Lanjut dengan IBM DB2 Berdasarkan karakteristik tersebut diatas, seorang perancang database dapat menentukan jenis indeks yang digunakan.

Pemakaian Index
Index merupakan teknik yang paling penting didalam optimaliasi kinerja SQL, key diketahui ketika suatu index digunakan dengan aturan sebagai berikut: Ketika kolom yang diindex muncul pada kriteria WHERE atau HAVING clause. Ketika kolom yang diindex muncul pada kolom GROUP BY atau ORDER BY clause. Ketika fungsi MAX atau MIN digunakan pada kolom yang diindex. Disamping keunggulan pemakaian index, juga memiliki beberapa konsekuensi seperti: Index membutuhkan tempat penyimpanan tambahan ketika anda melakukan insert, update ataupun delete yang terkait dengan kolom yang diindex, DBMS perlu melakukan update terhadap index, hal ini tentu saja mempengaruhi operasi modifikasi data, terutama untuk tabel yang memiliki banyak data. Tetapi aturan jempol yang dapat digunajan adalah senantiasa melakukan index terhadap kolom yang sering digunakan sebagai kriteria pada query untuk mendapatkan data. Hendra, MT. & Jimmy, S.Kom. 82

Database Lanjut dengan IBM DB2

Clustering Index
Suatu clustering index menentukan bagaimana baris secara fisik diurut pada table space. Clustering index menghasilkan kinerja yang signifikan didalam operasi-operasi tertentu yang melibatkan banyak record, operasi yang dapat mengambil manfaat dari clustering index adalah operasi pengelompokan, pengurutan, dan perbandingan diluar dari sama. Ketika suatu tabel memiliki clustering index, suatu perintah INSERT menyebabkan DB2 menyisip record sedekat mungkin dengan urutan nilai index mereka. Walaupun suatu tabel dapat memiliki beberapa index, tetapi hanya satu index yang dapat clustering. Pembuatan index clustering dengan menambahkan CLUSTER clause, contoh: create index piutang_ix on piutang(koderelasi) cluster Walaupun clustering index memiliki keuntungan, tetapi juga memiliki kekurangan yaitu: Operasi yang membutuhkan table scan, karena baris pada suatu table tersebar pada banyak disk page. Menyebabkan operasi insert data menjadi lambat. Menyebabkan operasi perubahan data terkait dengan kolom yang diindex menjadi lambat.

Partitioning
Partitioning adalah kebalikan dari clustering, yang melakukan pemisahan tabel besar ke tabel yang lebih kecil, sehingga DBMS tidak perlu membaca banyak data pada satu saat, misalnya memisahkan data berdasarkan tahun transaksi, sehingga untuk membaca data tahun tertentu, dapat dilakukan pada tabel untuk tahun. Ada dua cara melakukan partitioning yaitu secara horizontal dan vertikal, secara horizontal dilakukan dengan memisah baris antar tabel (contoh pemisahan data transaksi untuk tahun yang berbeda), sedangkan secara vertikal dilakukan dengan memisahkan kolom pada tabel menjadi Hendra, MT. & Jimmy, S.Kom. 83

Database Lanjut dengan IBM DB2 beberapa tabel, dan menghubungkan tabel-tabel tersebut dengan primary key. Misalkan tabel profile karyawan yang dapat terdiri dari banyak kolom, dan tentu saja tidak semua kolom yang ada secara rutin digunakan, untuk keperluan tersebut kolom-kolom yang tidak rutin digunakan dapat dipisahkan ke suatu tabel baru dengan menggunakan primary key yang sama dan membentuk hubungan one-to-one.

Pada DB2 versi Enterprise, data partisi secara horizontal dapat dilakukan secara otomatis oleh sistim, dan ditentukan pada saat pembuatan suatu tabel
CREATE TABLE piutang (nopiutang varchar(10), ) PARTITION BY RANGE(tanggal) ( STARTING '1/1/2006' ENDING '12/31/2006' EVERY 3 MONTHS )

Pembuatan tabel tersebut diatas, secara otomatis sistim akan melakukan partisi database setiap 3 bulan dengan skema sebagai berikut:

Access plan pada DB2


Access plan menspesifikasikan suatu urutan dari operasi pengaksesan data. Suatu rencana akses memperbolehkan anda untuk melihat statistik untuk tabel, index atau kolom yang terpilih. Dengan menggunakan Visual Explain anda dapat melihat rencana akses untuk suatu SQL didalam bentuk grafik. Contoh: db2sampl -dbpath d: Hendra, MT. & Jimmy, S.Kom. 84

Database Lanjut dengan IBM DB2 connect to sample select * from sales where region = 'Quebec'

Gambar 9.1. Access plan tanpa index create index sales_region on sales(region) select * from sales where region = 'Quebec'

Gambar 9.2. Access plan dengan index Access plan dapat dilihat dengan menggunakan DB2 command editor, dengan mengetikan Select statement, dan menjalankannya dengan : Execute and Access Plan Access Plan

Pada Gambar 9.1 dan Gambar 9.2 terlihat ada perbedaan access plan dari perintah SQL yang sama yaitu 'select * from sales where region = 'Quebec'', yaitu untuk kondisi pertama sebelum pembuatan index, maka filter data dilakukan secara TBScan (Table Hendra, MT. & Jimmy, S.Kom. 85

Database Lanjut dengan IBM DB2 Scan), dengan setelah adanya index, maka proses filter dilakuakn secara IXScan (Index Scan), baru data di ambil (FETCH) dari tabel sales. Analisa terhadap access plan adalah penting untuk melakukan optimalisasi terhadap perintah SQL yang mengalami isu perfomance.

TRIGGER
Sebuah trigger merupakan suatu himpunan dari aksi yang otomatis dijalankan sebagai respon terhadap kejadian pada operasi INSERT, UPDATE atau DELETE pada suatu tabel tertentu. Ketika suatu operasi SQL dijalankan, trigger tersebut akan diaktifkan. Trigger tersebut dapat diaktikan sebelum atau sesudah operasi SQL dan berjalan didalam transaksi perintah yang membangkitkannya. Anda dapat menggunakan trigger sebelum operasi SQL (update atau insert) untuk keperluan sebagai berikut: Untuk mengecek atau mengubah nilai sebelum mereka benar-benar diupdate atau disisipkan pada database. Menjalankan operasi non-database yang dikodekan didalam user-defined function. Sedangkan trigger yang dijalankan setelah operasi SQL (update, insert atau delete) untuk keperluan sebagai berikut: Untuk meng-update data pada tabel-tabel lain. Kemampuan ini berguna untuk menangani relationship antar data atau mencatat informasi jejak rekam audit. Untuk mengecek data didalam tabel atau didalam tabel lainnya. Kemampuan ini adalah berguna untuk memastikan integritas data ketika referential integrity constraint sulit diterapkan, atau ketika check constraint pada tabel sulit diterapkan. Menjalankan operasi non-database yang dikodekan didalam user-defined function. Kemampuan ini berguna ketika membuat suatu peringatan atau informasi update diluar database. Anda dapat juga mendapatkan beberapa keuntungan dari trigger: 1. Pengembangan aplikasi yang lebih cepat, dimana trigger tersimpan didalam database, dan tersedia bagi semua aplikasi, sehingga anda tidak perlu melakukan pengkodean pada fungsi pada masing-masing aplikasi. 2. Pemberlakukan business rule secara menyeluruh, sekali trigger terdefinisi, akan berlaku terhadap semua aplikasi yang menggunakan tabel/view yang mengandung trigger tersebut. 3. Pemeliharaan yang lebih mudah, setiap perubahan cukup dilakukan sekali pada Hendra, MT. & Jimmy, S.Kom. 86

Database Lanjut dengan IBM DB2 trigger dari masing mengubah pada masing-masing aplikasi

Pembuatan trigger
Ketika anda membuat sebuah trigger, anda harus mendeklarasikan atribut dan prilaku sebagai berikut: Nama dari trigger Nama dari tabel yang menjadi subject trigger Waktu aktivasi dari trigger (BEFORE atau AFTER operasi). Kejadian pemicu trigger (INSERT, DELETE, atau UPDATE). Nama variabel untuk transisi nilai lama, jika ada (untuk insert tidak ada nilai lama) Nama variabel untuk transisi nilai baru, jika ada (untuk delete tidak ada nilai baru) Nama variabel untuk transisi tabel nilai lama, jika ada (hanya untuk AFTER atau INSTEAD OF) Nama variabel untuk transisi tabel nilai baru, jika ada (hanya untuk AFTER atau INSTEAD OF) Tingkat kedetailan perlakukan trigger (FOR EACH STATEMENT atau FOR EACH ROW). Aksi dari trigger (terdiri dari aksi kondisi dan perintah SQL yang dipicu) Jika kejadian pemicu adalah UPDATE, maka didaftarkan kolom yang memicu trigger. (WHEN condition tidak tersedia untuk INSTEAD OF) Keterangan: INSTEAD OF Digunakan untuk trigger pada view, dan hanya diperbolehkan satu trigger untuk satu view. FOR EACH ROW Aksi trigger untuk setiap baris pada tabel yang dipengaruhi oleh perintah operasi yang membangkitkan trigger. FOR EACH STATEMENT Aksi hanya dilakukan sekali untuk satu operasi perintah yang membangkitkan trigger triggered-action Aksi-aksi yang akan dilakukan oleh trigger, suatu aksi terdiri dari perintah SQL dan kondisi yang bersifat opsional. WHEN (search-condition) Pemeriksaan kondisi yang bernilai true atau false untuk menentukan apakah suatu aksi trigger dijalankan atau tidak. Contoh:

Hendra, MT. & Jimmy, S.Kom.

87

Database Lanjut dengan IBM DB2 Pada contoh ini akan dibuat dua trigger before insert, dan before update yang akan melakukan perubahan pada nilai kolom creaby, creatime, modiby dan moditime, untuk jelasnya perhatian perintah SQL pada trigger. connect to piutang alter table relasi add column creaby varchar(50) alter table relasi add column creatime timestamp alter table relasi add column modiby varchar(50) alter table relasi add column moditime timestamp create trigger relasi_insert before insert on relasi referencing new as baru for each row mode db2sql when (1=1) begin set baru.creaby = current_user, baru.creatime = current_timestamp; end^ create trigger relasi_update before update on relasi referencing new as baru old as lama for each row mode db2sql when (1=1) begin set baru.modiby = current_user, baru.moditime = current_timestamp; end^ Pada contoh ini akan direkam setiap aktifitas penambahan pemakai baru, maupun perubahan data pada tabel pemakai pada suatu tabel pemakai_log create table activity_log (modiby varchar(50), moditime timestamp, keterangan varchar(100)) create trigger relasi_insert_audit after insert on relasi referencing new as baru for each row mode db2sql Hendra, MT. & Jimmy, S.Kom. 88

Database Lanjut dengan IBM DB2 when ( 1=1) begin atomic insert into activity_log(modiby, moditime, keterangan) values (current_user, current_timestamp, concat('tambah relasi', baru.koderelasi)); end create trigger relasi_update_audit after update on relasi referencing new as baru old as lama for each row mode db2sql when ( 1=1) begin atomic insert into activity_log(modiby, moditime, keterangan) values (current_user, current_timestamp, concat(concat(concat('perbaiki relasi', lama.koderelasi),'menjadi '),baru.koderelasi)); end create trigger relasi_delete_audit after update on relasi referencing old as lama for each row mode db2sql when ( 1=1) begin atomic insert into activity_log(modiby, moditime, keterangan) values (current_user, current_timestamp, concat('hapus relasi',lama.koderelasi)); end Pada contoh berikut akan dilakukan pengecekan integritas konstraint dimana piutang baru tidak dapat diberikan untuk relasi yang telah diblacklist. alter table relasi add column blacklist integer default 0 create trigger relasi_check_blacklist before insert on piutang referencing new as baru for each row mode db2sql when ((select blacklist from relasi where koderelasi=baru.koderelasi)=1) begin SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT='Relasi blacklist!'; end

Hendra, MT. & Jimmy, S.Kom.

89

Database Lanjut dengan IBM DB2 Berikut ini adalah contoh pengecekan overdue pada setiap pembuatan piutang baru. create trigger piutang_check_overdue before insert on piutang referencing new as baru for each row mode db2sql when (1=1) begin if (select coalesce (sum(nilai-bayar),0) from (select a.nopiutang, a.nilai, coalesce(sum(b.nilaidk),0) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang where a.koderelasi = baru.koderelasi and tgljtempo < current_date group by a.nopiutang, a.tgljtempo, a.nilai) ) > 0 then SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT='Relasi overdue!'; end if; end^

Prioritas Trigger
Jika sebuah tabel memiliki beberapa trigger, maka urutan eksekusi dari trigger adalah berdasarkan timestamp dari trigger tersebut. Informasi timestamp akan secara otomatis diberikan berdasarkan waktu pembuatan trigger.

Latihan
1. Tambahkan kolom berikut ini creatby varchar(50), creatime, modiby varchar(50), moditime pada tabel relasi, piutang, kodeDK, dan Dkpiutang. 2. Buatlah trigger yang secara otomatis yang dapat mengupdate masing-masing kolom berdasarkan aktifitas dari pemakai (insert, atau update). 3. Buatlah sebuah tabel Activity_log yang berisi kolom modiby varchar(50), moditime timestamp, keterangan varchar(100). 4. Buatlah trigger pada masing-masing tabel relasi, piutang, kodeDK, dan DkPiutang agar dapat dicatat aktifitas yang dilakukan masing-masing user terkait dengan tabel tersebut. 5. Buatlah trigger yang membatasi pemberiaan piutang baru untuk seorang relasi yang telah di blacklist. 6. Ujilah masing-masing trigger tersebut diatas dengan melakukan proses penambahan ataupun perubahan data pada masing-masing tabel. Petunjuk: Pengetikan trigger dapat menggunakan db2 command editor (db2ce), Hendra, MT. & Jimmy, S.Kom. 90

Database Lanjut dengan IBM DB2 klik pada add, dan pilih database piutang, dan termination diganti menjadi ^. kemudian statement

Hendra, MT. & Jimmy, S.Kom.

91

Database Lanjut dengan IBM DB2

Bab 10. UDF


User Defined Function (UDF) memungkinkan user untuk menuliskan fungsi mereka sendiri dan dapat digunakan didalam perintah SQL. Pada prinsipnya DB2 telah menyediakan berbagai built-in function. Secara umum, fungsi pada DB2 dapat diklasifikasikan sebagai fungsi build-in, dan user defined function (UDF), kemudian fungsi dapat juga diklasifikasikan sebagai : Column-function yang merupakan koleksi dari nilai-nilai kolom seperti fungsi SUM, MIN, dan MAX yang digunakan pada perintah SELECT, dan tidak dapat digunakan pada bagian WHERE. Fungsi jenis ini tidak dapat dibuat sendiri oleh pemakai Scalar-function yang memiliki input satu atau lebih nilai sebagai parameter. Fungsi ini mengembalikan suatu nilai scalar, fungsi ini dapat digunakan pada perintah SELECT maupun pada bagian WHERE. Pemakai dapat membuat sendiri scalar-function sebagai UDF. Suatu scalar-function dapat dibuat dengan SQL Procedural Language atau dengan bahasa pemrograman lainnya, dalam hal ini disebut sebagai external function Table function memiliki satu atau lebih nilai sebagai parameter, fungsi ini mengembalikan suatu tabel dan digunakan pada bagian FROM. DB2 tidak menyediakan built-in table-function. Semua table-function adalah external function atau dengan kata lain dibuat dengan menggunakan bahasa tingkat tinggi.

Pemanfaatan UDF
Kadang-kadang fungsi bantu built-in yang tersedia tidak dapat memenuhi kebutuhan, sehingga diperlukan UDF untuk keperluan sebagai berikut: Membuat transformasi khusus, misalnya anda membutuhkan proses untuk konversi format pengkodean internal menjadi format eksternal untuk pertukaran data dengan pihak luar. Kalkulasi tertentu, misalnya perusahaan anda memiliki formula khusus untuk perhitungan. Migrasi dari DBMS lainnya, misalnya anda melakukan migrasi dari DBMS lainnya dan terdapat fungsi yang tidak tersedia di DB2 Menyembunyikan logika SQL yang rumit, sehingga pemakaiannya dalam SQL menjadi sederhana.

Pembuatan UDF
Untuk pembuatan sourced UDF dengan menggunakan SQL P/L dapat menggunakan perintah CREATE FUNCTION. Sedangkan untuk pembuatan UDF external dapat menggunakan bahasa C, C++, Cobol, dan Java. Hendra, MT. & Jimmy, S.Kom. 92

Database Lanjut dengan IBM DB2

Pembuatan UDF dengan SQL PL


Berikut ini akan diberikan suatu UDF yang memiliki fungsi untuk mengecek tanggal yang dilewatkan pada fungsi dan membandingkan dengan tanggal hari ini, jika lebih kecil maka akan dikembalikan pesan jatuh tempo dan sebaliknya dikembalikan pesan belum jatuh tempo. Contoh: create function blmjto(tgl date) returns integer language sql null call begin return case when tgl is null then null else case when tgl >= current_date then 1 else 0 end end; end create function jto15(tgl date) returns integer language sql null call begin return case when tgl is null then null else case when days(current_date) - days(tgl) <= 15 then 1 else 0 end end; Hendra, MT. & Jimmy, S.Kom. 93

Database Lanjut dengan IBM DB2 end create function jto15sd30(tgl date) returns integer language sql null call begin return case when tgl is null then null else case when days(current_date) - days(tgl) > 15 and days(current_date) - days(tgl) <= 30 then 1 else 0 end end; end create function jtodiatas30(tgl date) returns integer language sql null call begin return case when tgl is null then null else case when days(current_date) - days(tgl) > 30 then 1 else 0 end end; end Sehingga perintah pada view ARAging menjadi sebagai berikut: Create view arAgingUDF1 as select a.nopiutang, a.koderelasi, a.tanggal, a.tgljtempo, case when blmjto(a.tgljtempo)=1 then Hendra, MT. & Jimmy, S.Kom. 94

Database Lanjut dengan IBM DB2 a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as belum_jto, case when jto15(a.tgljtempo) = 1 then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as tunggak_dibawah_30, case when jto15sd30(a.tgljtempo) = 1 then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as tunggak15sd30, case when jtodiatas30(a.tgljtempo) = 1 then a.nilai - coalesce(sum(b.nilaidk),0) else 0 end as tunggakdiatas30 from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang group by a.nopiutang, a.koderelasi, a.tanggal, a.tgljtempo, a.nilai Berikut ini adalah UDF yang digunakan untuk mengembalikan nilai sisa AR berdasarkan koderelasi yang diberikan. create function sisa_piutang(pkoderelasi varchar(30)) returns decimal(15,2) language sql null call begin return case when pkoderelasi is null then 0 else (select sum(nilai-bayar) from (select a.nopiutang, a.nilai, coalesce(sum(b.nilaidk),0) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang where koderelasi = pkoderelasi group by a.nopiutang, a.tgljtempo, a.nilai) ) Hendra, MT. & Jimmy, S.Kom. 95

Database Lanjut dengan IBM DB2 end; end Berikut ini adalah UDF yang digunakan untuk mengembalikan nilai overdue AR berdasarkan koderelasi yang diberikan. create function overdue_piutang(pkoderelasi varchar(30)) returns decimal(15,2) language sql null call begin return case when (pkoderelasi is null) then 0 else (select coalesce (sum(nilai-bayar)) from (select a.nopiutang, a.nilai, coalesce(sum(b.nilaidk),0) as bayar from piutang a left join dkpiutang b on a.nopiutang = b.nopiutang where a.koderelasi = pkoderelasi and tgljtempo < current_date group by a.nopiutang, a.tgljtempo, a.nilai) ) end; end

Pembuatan external UDF dengan java


Pembuatan UDF dengan PL/SQL memiliki keterbatasan pada fungsi-fungsi yang dapat diturunkan dari fungsi internal DB2. DB2 memberikan kesempatan kepada pengembang untuk membuat fungsi external dengan menggunakan java. Pembuatan UDF dengan java pada lingkungan NetBeans dilakukan dengan membuat suatu project baru (misalkan MyUDF) dengan type Java Class Library, kemudian membuat suatu class dengan nama MyUDF.java, dan didalamnya dideklarasikan static function dari masing-masing UDF yang akan dibuat.

Hendra, MT. & Jimmy, S.Kom.

96

Database Lanjut dengan IBM DB2

Dan pada class MyUDF, dibuat UDF yang dideklarasikan sebagab pulbic static <type> dengan contoh sebagai berikut: public class MyUDF { public static String MD5(String text) { try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");

byte[] array = md.digest(text.getBytes()); StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3)); } return sb.toString(); } catch (java.security.NoSuchAlgorithmException e) { } return null; } } Selanjutnya project di build menjadi MyUDF.jar. Duplikasi file MyUDF.jar ke folder %DB2PATH%sqllib\function (dalam hal ini adalah C:\Program files\IBM\sqllib\function)

Hendra, MT. & Jimmy, S.Kom.

97

Database Lanjut dengan IBM DB2

Selanjutnya Eksternal UDF tersebut perlu didaftarkan pada database DB2 yang akan memanfaatkan fungsi tersebut dengan perintah: CREATE FUNCTION MD5 ( text VARCHAR(4000) ) RETURNS varchar(4000) FENCED VARIANT NO SQL LANGUAGE JAVA PARAMETER STYLE JAVA EXTERNAL NAME 'MyUDF!MD5' Kemudian kita dapat menguji eksternal UDF tersebut dengan: values md5('Hendra Soewarno')

Latihan
1. Buatlah user define function memeriksa suatu tanggal berdasarkan current_date dengan mengkategorikan sebagai belumjto, jto15, jto15sd30, dan jtodiatas30. 2. Ujilah masing-masing fungsi diatas dengan : values blmjto(current_Date) values blmjto(current_Date - 1 day) 3. Buatlah view yang menampilkan data menurut masing-masing kolom jatuh tempo. Hendra, MT. & Jimmy, S.Kom. 98

Database Lanjut dengan IBM DB2 4. Buatlah UDF yang dapat mengembalikan seluruh nilai sisa AR dari koderelasi yang diberikan. 5. Buatlah UDF yang dapat mengembalikan nilai sisa AR dari nopiutang yang diberikan. 6. Buatlah sebuah ekternal fungsi MD5 menggunakan java, dan registrasi fungsi tersebut ke database piutang, serta ujilah fungsi tersebut. 7. Buatlah program java yang menanyakan koderelasi, kemudian mencetak nilai sisa AR untuk kode relasi tersebut (buatlah UDF untuk menghasilkan sisa piutang).

Hendra, MT. & Jimmy, S.Kom.

99

Database Lanjut dengan IBM DB2

Bab 11, STORE PROCEDURE


Pada awal perkembangannya, produk DBMS dirancang untuk hanya menangani penyimpanan data secara optimal, dan dalam perkembangannya sejalan dengan model komputasi client/server, maka aturan bisnis juga perlu disimpan pada sisi database dalam bentuk store procedure. Store procedure menyerupai program komputer yang disimpan pada suatu database. Sebagaimana pada UDF, store procedure pada DB2 juga dapat ditulis baik dengan menggunakan SQL PL maupun bahasa tingkat tinggi lainnya seperti C, C++, Cobol maupun Java.

Manfaat stored procedure


Stored procedure memiliki banyak manfaat yang dapat dilihat dari berbagai sisi seperti reusability, consistency, maintenance, perfomance, dan security yang dapat dijelaskan sebagai berikut: 1. Pemakaian store procedure memungkinkan kode disimpan terpusat pada server database, dari pada dilakukan koding pada setiap aplikasi. 2. Pemakaian store procedure meningkatkan konsistensi karena semua aplikasi menggunakan store procedure yang sama, sehingga terhindar dari kemungkinan perbedaan versi pada masing-masing aplikasi. 3. Pemakaian store procedure meningkatkan maintanance, karena setiap perubahan cukup diubah pada server database dan berpengaruh terhadap semua aplikasi yang melakukan call terhadap store procedure, sehingga aplikasi pada klien tidak perlu di deploy ulang. 4. Pemakaian store procedure akan menghemat bandwidth jaringan, karena pemanggil langsung dilakukan terhadap nama procedure beserta dengan parameternya. 5. Pemakaian store procedure akan meningkatkan keamanan, karena call terhadap store procedure dapat dibatasi dengan pembatasan authority dan priviledge.

Pembuatan store procedure


Pembuatan store procedure dilakukan dengan perintah CREATE PROCEDURE. Contoh: Berikut ini adalah sebuah store procedure yang berfungsi untuk melakukan proses tambah data pemakai, yang diawali dengan proses validasi terhadap sandi. create table pemakai (username varchar(50) not null primary key, password varchar(50)) create procedure tambah_pemakai(pidpemakai varchar(30), psandi varchar(20)) Hendra, MT. & Jimmy, S.Kom. 100

Database Lanjut dengan IBM DB2 language sql begin atomic declare rcount integer default 0; insert into pemakai(username, password) values (pidpemakai, md5(psandi)); GET DIAGNOSTICS rcount = ROW_COUNT; return rcount; end Catatan: Pemakaian BEGIN ATOMIC akan menyebabkan semua proses didalam store procedure akan di ROLLBACK jika terjadi kegagalan dalam store procedure sebelum proses dikembalikan ke pemanggil, sedangkan BEGIN NOT ATOMIC memiliki prilaku yaitu semua proses yang telah dieksekusi akan berlaku sebelum titik kegagalan.

Pemanggilan procedure
Pemanggilan store procedure dilakukan dengan perintah call dan diikuti dengan nama procedure dan parameter yang disyaratkan. Contoh: call tambah_pemakai(susan,dewichan1907)

Eksternal Storeprocedure
Sebagaimana dengan UDF, DB2 juga memberi kesempatan kepada pemakai untuk membuat eksternal Storeprocedure yang ditulis dengan menggunakan bahasa tingkat tinggi seperti java. Pada lingkungan Netbeans, pembuatan eksternal procedure dilakukan dengan membuat project java class library.

Hendra, MT. & Jimmy, S.Kom.

101

Database Lanjut dengan IBM DB2 Kemudian membuat Class yang akan berisi rutin yang membentuk external storeprocedure kita. Suatu eksternal storeprocedure pada java dideklarasikan sebagai public static void. import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class MySP { public static int jtambah_pemakai(String pidpemakai, String psandi) throws SQLException { int result = 0; int errorCode = 0; String sql; PreparedStatement stmt = null; try { Connection con = DriverManager.getConnection("jdbc:default:connection"); sql = "Insert into pemakai (username, password) " + "values (?,?)"; stmt = con.prepareStatement(sql); stmt.setString(1, pidpemakai); stmt.setString(2, MyUDF.MD5(psandi)); result = stmt.executeUpdate(); } catch (SQLException sqle) { errorCode = sqle.getErrorCode(); throw new SQLException(errorCode + " : " + sqle.getMessage() + " FAILED"); } return result; } } Setelah itu dilakukan build project, dan menduplikasikan file jar ke folder %DB2PATH %sqllib\function (dalam hal ini adalah C:\Program files\IBM\sqllib\function)

Hendra, MT. & Jimmy, S.Kom.

102

Database Lanjut dengan IBM DB2

Selanjutnya Eksternal Storeprocedure tersebut perlu didaftarkan pada database DB2 yang akan memanfaatkan fungsi tersebut dengan perintah:
CREATE PROCEDURE jtambah_pemakai (in a varchar(30), in b varchar(30)) SPECIFIC jtambahpemakai LANGUAGE JAVA PARAMETER STYLE JAVA NO DBINFO FENCED THREADSAFE EXTERNAL NAME 'MySP!jtambah_pemakai'

CallableStatement object Suatu CallableStatement objek menyediakan suatu cara untuk pemanggilan stored procedure didalam suatu cara standard untuk semua DBMS. Pembuatan objek CallableStatement dilakukan dengan menggunakan metode prepareCall pada objek Connection. Berikut ini adalah untuk pembuatan suatu objek CallableStatement. CallableStatement cstmt; cstmt = MyDBOpenHelper.getConnection(). prepareCall("call tambah_pemakai(?,?)"); cstmt.setString(1, "Hendra"); cstmt.setString(2, "Soewarno"); cstmt.executeUpdate(); Berikut ini salah contoh pemanggilan stored procedure yang mengembalikan nilai melalui parameternya.

Latihan
1. Tambahkan tabel pemakai yang terdiri dari username dan password. Hendra, MT. & Jimmy, S.Kom. 103

Database Lanjut dengan IBM DB2 2. Buatlah suatu internal stored procedure yang dapat menambahkan pemakai baru, dimana password disimpan dalam format MD5. 3. Buatlah program java yang memberikan fasiltas pembuatan pemakai baru, ubah password pemakai (konfirmasikan password lama, dan password baru diketik dua kali), dan hapus pemakai, untuk masing-masing fasilitas dibuat terlebih dahulu strored procedurenya masing-masing.

Hendra, MT. & Jimmy, S.Kom.

104

Database Lanjut dengan IBM DB2

Bab 12, Konsistensi Transaksi


Salah satu hal yang penting didalam pengelolaan transaksi pada database adalah konsistensi data. Apa itu konsistensi data? Secara gampang anda dapat membayangkan bahwa anda membuka sebuah toko swalayan, dan anda memiliki sebuah gudang besar untuk penyimpanan barang. Secara berkala barang dari gudang akan dipindahkan ke toko swalayan anda. Untuk setiap perpindahan barang dari gudang akan mengurangi catatan persediaan di gudang, dan menambah catatan persediaan di toko. Kemudian anda bayangkan bahwa suatu kali terjadi perpindahan barang dari gudang dicatat sebagai pengurangan persediaan di gudang tetapi lupa dicatat sebagai penambahan persediaan di toko, pada kasus ini ketidakkonsistensian data telah terjadi. Pada database, ketidakkonsistenan dapat terjadi oleh beberapa hal sebagai berikut: 1. Terjadi gangguan sistim ditengah-tengah serangkaian perintah update data, yang menyebabkan sebagian perintah berhasil dijalankan, dan sebagian lagi tidak berhasil dijalankan. 2. Akses data oleh beberapa pemakai pada saat yang bersamaan yang dikenal dengan istilah concurrency pada lingkungan multiuser dapat juga menyebabkan ketidakkonsistensian. Untuk penanganan konsistensi data dan konkurensi data, DB2 menyediakan fasilitas Transaction, Isolation level, dan Lock.

Transaction
Suatu transaction dikenal juga dengan unit of work (UOW) merupakan sekelompok dari urutan perintah SQL yang dikelompokan sebagai satu kesatuan unit untuk melakukan proses tertentu (misalnya pada trigger maupun stored procedure) sebagai atomic action yang bersifat berhasil semua atau gagal sama sekali. Suatu transaction akan diakhiri dengan perintah COMMIT ataupun ROLLBACK, jika pada situasi tertentu dimana terjadi gangguan pada sistim yang menyebabkan perintah COMMIT tidak berhasil tercapai, maka secara otomatis semua efek dari perintah dalam transaction tersebut yang telah dijalankan akan secara otomatis di ROLLBACK (yang dalam hal ini berarti membatalkan semua perubahan yang terjadi mulai dari titik awal transaksi atau dengan kata lain kembali kepada kondisi sebelum transaksi dimulai). Suatu transaksi harus memiliki properti sebagai berikut: Atomicity menbutuhkan bahwa semua operasi (perintah SQL) dari suatu transaksi harus lengkap, jika tidak maka transaksi tersebut harus dibatalkan, misalkan T1 memiliki empat perintah SQL, semua perintah tersebut harus berhasil dan lengkap, jika tidak maka seluruh transaksi harus dibatalkan, dengan kata lain Hendra, MT. & Jimmy, S.Kom. 105

Database Lanjut dengan IBM DB2 suatu transaksi diperlakukan sebagai suatu logika unit of work. Consistency menyatakan sifat permanen dari tahapan konsisten database. Suatu transaksi membawa database dari suatu tahapan konsisten ke tahapan konsisten lainnya. Ketika suatu transaksi lengkap, database harus berada dalam suatu tahapan konsisten, jika ada bagian dari transaksi melanggar integrity constraint, maka keseluruhan transaksi harus dibatalkan. Isolation yang berarti bahwa data yang digunakan didalam suatu transaksi tidak dapat digunakan oleh transaksi yang kedua sampai transaksi yang pertama selesai. Hal ini bermanfaat pada lingkungan multiuser. Durability menjamin bahwa suatu perubahan transaksi dilakukan (commit), maka tidak dapat dibatalkan ataupun mengalami kehilangan walaupun sistim mengalami gangguan. Serializability menjamin bahwa jadwal dari eksekusi konkuren dari transaksi mendapatkan hasil yang konsisten. Sifat ini adalah penting didalam database multiuser dan terdistribusi, dimana bisa saja banyak transaksi berjalan secara konkuren.

Log file
Untuk dapat mengatur proses transasi, RDBMS membutuhkan Log files yang menyimpan informasi seperti: Kapan suatu transaksi dimulai Kapan suatu operasi selesai Kapan transaksi tersebut selesai (di COMMIT) Semua database pada DB2 memiliki log yang berasosiasi dengan masing-masing database untuk mencatat perubahan pada masing-masing database. Pada DB2 ada dua jenis log yaitu Circular logging (default) yang digunakan untuk mempertahankan integritas dari transaksi. Archive logging memiliki keunggulan yaitu memungkinkan rollforward recovery untuk proses restore data (untuk jelasnya dapat dibaca pada bagian backup dan restore).

Transaction pada DB2


Secara default DB2 menerapkan automatic transaction mode, artinya efek dari setiap perintah yang dilakukan secara otomatis di COMMIT. Pengaturan transaksi pada trigger maupun stored procedure dilakukan dengan menggunakan BEGIN ATOMIC dan END jika perintah yang digunakan lebih dari satu, sehingga kegagalan sebelum pencapaian END, maka semua efek dari perubahan sebelumnya akan secara otomatis di ROLLBACK. Contoh:

Hendra, MT. & Jimmy, S.Kom.

106

Database Lanjut dengan IBM DB2 create table ledger (noperk varchar(10) not null, noref varchar(20) not null, tanggal date, keterangan varchar(50), nilai decimal(15,2), id integer not null generated always as identity, primary key(noperk, noref)) create trigger piutang_igl after insert on piutang referencing new as baru for each row mode db2sql when (1=1) begin atomic insert into ledger (noperk, noref, tanggal, keterangan, nilai) values ('20010',baru.nopiutang, baru.tanggal, 'Piutang dagang', baru.nilai); insert into ledger (noperk, noref, tanggal, keterangan, nilai) values ('40010',baru.nopiutang, baru.tanggal, 'Penjualan', -baru.nilai); end create trigger dkpiutang_igl after insert on dkpiutang referencing new as baru for each row mode db2sql when (1=1) begin atomic declare temp_ket varchar(50); set temp_ket = (select keterangan from jenisdk where kodedk = baru.kodedk); IF baru.nilaidk >= 0 THEN insert into ledger (noperk, noref, tanggal, keterangan, nilai) values (baru.kodeDK, baru.nodk, baru.tanggaldk, temp_ket, baru.nilaidk); insert into ledger (noperk, noref, tanggal, keterangan, nilai) values ('20010', baru.nodk, baru.tanggaldk, 'Piutang dagang', -baru.nilaidk); ELSE insert into ledger (noperk, noref, tanggal, keterangan, nilai) values ('20010', baru.nodk, baru.tanggaldk, Hendra, MT. & Jimmy, S.Kom. 107

Database Lanjut dengan IBM DB2 'Piutang dagang', -baru.nilaidk); insert into ledger (noperk, noref, tanggal, keterangan, nilai) values (baru.kodeDK, baru.nodk, baru.tanggaldk, temp_ket, baru.nilaidk); END IF; end Pada contoh tersebut diatas kita menginginkan setiap pencatatan piutang baru otomatis diposting ke Ledger sebagai double entry yang merupakan satu kesatuan transaksi, sehingga ditulis dalam struktur begin atomic end. Pengaturan autocommit mode pada DB2 command line dapat dilakukan dengan menggunakan option +c pada saat pengaktifkan DB2 command line, atau pemberian perintah UPDATE COMMAND OPTIONS USING c OFF setelah pengaktifan DB2 command line. Contoh: DB2 +c atau DB2 UPDATE COMMAND OPTIONS USING c OFF Pengaturan autocommit mode pada DB2 command window dapat dilakukan dengan pemilihan menu Tools, pilih Tools Settings, kemudian pilih tab Command Edtior, dan buang tanda check pada Automatically commit SQL statements.

DB2 mendukung perintah seperti COMMIT, ROLLBACK dan SAVEPOINT Contoh: connect to piutang; UPDATE COMMAND OPTIONS USING c OFF; insert into pemakai(idpemakai, sandi) values ('awan', md5('awncdn2008')); ROLLBACK; insert into pemakai(idpemakai, sandi) values ('johan', md5('jhnmsm2010')); COMMIT; Hendra, MT. & Jimmy, S.Kom. 108

Database Lanjut dengan IBM DB2 Perintah tersebut diatas menyebabkan data johan akan tersimpan pada tabel pemakai, sedangkan data awan akan di ROLLBACK. Contoh: connect to piutang; UPDATE COMMAND OPTIONS USING c OFF; insert into pemakai(idpemakai, sandi) values ('awan',md5('awncdn2008')); SAVEPOINT sebelumpemakai2 ON ROLLBACK RETAIN CURSORS; insert into pemakai(idpemakai, sandi) values ('johan',md5('jhnmsm2010')); ROLLBACK TO SAVEPOINT sebelumpemakai2 COMMIT; Perintah tersebut diatas menyebabkan data awan akan tersimpan pada tabel pemakai, sedangkan data johan akan di ROLLBACK.

Transaksi pada JDBC


Commit dan Rollback
Pada koneksi ke sumber data DB2, secara default autocommit adalah true. Pada JDBC, untuk melakukan commit ataupun rollback pada transaction secara explicit, dapat menggunakan metoda commit ataupun rollback. Contoh: Connection con; con.setAutoCommit(false); con.commit(); Sedangkan pengaturan autocommit mode dapat menggunakan perintah Connection.setAutoCommit(true) untuk mengaktifkan modus autocommit, dan Connection.setAutoCommit(false) untuk mematikan modus autocommit. Jika modus autocommit adalah aktif, maka DB2 database manager melakukan operasi commit pada setiap selesaikan perintah SQL.

Save Point
Suatu SQL savepoint mewakili dari status dapat dan schema pada suatu titik waktu tertentu didalam suatu unit kerja. Pada IBM DB2 Driver for JDBC and SQLJ mendukung Hendra, MT. & Jimmy, S.Kom. 109

Database Lanjut dengan IBM DB2 pemakaian metode savepoint sebagai berikut: Connection.setSavepoint() atau Connection.setSavepoint(String name) Ketika salah satu perintah ini dijalankan, maka DB2 database manager akan menjalankan perintah seperti SAVEPOINT yang meliputi ON ROLLBACK RETAIN CURSORS. Metoda tersebut diatas akan membuat suatu savepoint, dan mengembalikan sebuat objek SavePoint yang nantinya akan digunakan pada operasi releaseSavepoint atau rollback. Connection.releaseSavepoint(Savepoint savepoint) atau Connection.rollback(Savepoint savepoint) Untuk memeriksa apakah suatu sumber data mendukung savepoint dapat mengunakan metoda. DatabaseMetaData.supportsSavepoints() Contoh: Catatan: untuk username dan password diganti sesuai petunjuk dosen anda.
public static void main(String[] args) { Connection con; Statement stmt; try { con = MyDbOpenHelper.getConnection(); stmt = con.createStatement(); stmt.executeUpdate("Insert into nobody.pemakai (idpemakai, sandi) " + "values ('tony', md5('tony12345678'))"); con.setAutoCommit(false); stmt.executeUpdate("Insert into nobody.pemakai (idpemakai, sandi) " + "values ('limada',md5('limada12345678'))"); Savepoint sebelumTiga = con.setSavepoint(); stmt.executeUpdate("Insert into nobody.pemakai (idpemakai, sandi) " + "values ('razali',md5('razali12345678'))"); con.rollback(sebelumTiga); con.commit();

Hendra, MT. & Jimmy, S.Kom.

110

Database Lanjut dengan IBM DB2


stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } }

Latihan
1. Tambahkan tabel ledger kedalam database piutang. create table ledger (noperk varchar(10) not null, noref varchar(20) not null, tanggal date, keterangan varchar(50), nilai decimal(15,2), id integer not null generated always as identity, primary key(noperk, noref)) 2. Buatlah trigger auto posting setiap penambahan piutang otomatis dijurnal sebagai piutang dagang (20010) vs penjualan (40010), buatlah juga trigger untuk update dan delete terhadap piutang. 3. Buatlah trigger auto posting setiap dkpiutang secara otomatis dijurnal sebagai KodeDK vs piutang dagang, buatlah juga trigger untuk update dan delete terhadap piutang. Catatan: Pembuatan proses diatas perlu memperhatikan kesatuan dari proses transaksi.

Hendra, MT. & Jimmy, S.Kom.

111

Database Lanjut dengan IBM DB2

Quiz
Anda diberikan data Kartu Persediaan sebagai berikut: KARTU PERSEDIAAN Kode Barang : P001 Keterangan : Printer HP 1010 Satuan : PCS Tgl 01/01/12 01/01/12 01/02/12 Keterangan Saldo Awal Penerimaan Pengeluaran Referensi SA01 P001 J001

Lokasi : Rak0302 Masuk 3 3 0 Keluar 0 0 1 Saldo Akhir 3 6 5

1. Lakukan proses normalisasi untuk merancang database Persediaan. 2. Buatlah DDL untuk pembuatan database, object table dengan memperhatikan integritas domain, integritas entitas, integritas referensial, dan integritas semantik. 3. Definisikan index yang perlu ditambahkan untuk meningkatkan kinerja database. 4. Tambahkan field (creaby, creatime, modiby, moditime) pada masing-masing tabel dan buatlah trigger yang secara otomatis mencatat data user untuk aktifitas insert dan update. 5. Tambahkan field (saldoAkhir) pada tabel Barang, dan buatlah trigger yang dapat secara otomatis mengupdate posisi saldo akhir berdasarkan transaksi penerimaan dan pengeluaran yang dilakukan (dengan memperhatikan proses insert, update, delete). 6. Buatlah trigger yang secara otomatis membatalkan proses insert, jika pengeluaran > posisi saldo akhir persediaan 7. Buatlah suatu UDF yang dapat mengembalikan posisi saldoAkhir berdasarkan kode barang yang diberikan sebagai parameter. 8. Buatlah program java console untuk (add, edit, delete) tabel Barang, tabel transaksi, dan mencetak bentuk kartu persediaan.

Hendra, MT. & Jimmy, S.Kom.

112

Database Lanjut dengan IBM DB2

Bab 13, Konsistensi Konkurensi


Pada lingkungan satu pemakai, setiap transaksi berjalan secara berurutan (serial) dan tidak mengalami inteferensi dari transaksi lainnya, tetapi pada lingkungan banyak pemakai, beberapa transaksi dapat berjalan secara bersamaan. Sebagai akibatnya setiap transaksi berpotensi untuk saling mempengaruhi transaksi lainnya. Transaksi yang memiliki potensi untuk mempengaruhi transaksi lainnya disebut sebagai transaksi interleaved atau parallel, sedangkan transaksi yang terisolasi satu sama lainnya disebut sebagai serializable, dalam arti menjalankan mereka bersamaan tidak berbeda dengan hasil menjalankannya masing-masing secara serial. Ketika transaksi parallel dijalankan pada lingkungan multiuser, dapat berpotensi menimbulkan empat jenis fenomena, yaitu: 1) Lost update (LU): fenomena ini terjadi ketika dua transaksi membaca data yang sama, melakukan kalkulasi dan meng-update kembali data, maka salah satu update tersebut akan hilang (ditimpa oleh update yang terakhir). Kondisi awal 1 2 3 Saldo = 100 T1 Baca Saldo = 100 Tulis Saldo = Saldo + 50 Tulis Saldo = Saldo + 25 T2 Kondisi akhir Saldo = 150 Saldo = 125

Baca Saldo = 100 Saldo = 100

2) Dirty read (DR) atau Uncommitted Read (UR): fenomena ini terjadi ketika suatu transaksi membaca data yang belum di commit oleh transaksi lain, dan setelah itu transaksi tersebut di rollback, sehingga akibatnya data yang terbaca sebelumnya seharus tidak ada. Kondisi awal 1 2 3 4 5 Rollback Saldo = 100 Baca Saldo = 100 Tulis Saldo = Saldo + 50 T1 T2 Kondisi akhir Saldo = 100 Saldo = 100 Saldo = 150 Baca Saldo = 150 Saldo = 150 Saldo = 100

Hendra, MT. & Jimmy, S.Kom.

113

Database Lanjut dengan IBM DB2 3) Non-repeatable read (NR): fenomena ini terjadi ketika suatu transaksi membaca data yang sama dua kali, dan mendapatkan nilai yang berbeda pada masing-masing pembacaan, hal ini dapat terjadi karena pada pembacaan yang kedua ada transaksi lain mengupdate, maupun menghapus data. Kondisi awal 1 2 Saldo = 100 Baca Saldo = 100 T1 T2 Kondisi akhir Saldo = 100 Baca data dengan Saldo = 100 saldo 100 (found 1 record) Saldo = 150 Baca data dengan Saldo = 150 saldo 100 (not found)

3 4

Tulis Saldo = Saldo + 50

4) Phantom Read (PR): fenomena ini terjadi ketika suatu data yang memenuhi kriteria tertentu tidak nampak awalnya, tetapi ketika operasi pembacaan berikutnya muncul akibat adanya penambahan data oleh transaksi lain. Kondisi awal 1 2 Dua record Baca semua record (found 2 record) Tambah record baru Baca semua record (found 3 record) T1 T2 Kondisi akhir Dua record Dua record

3 4

Tiga record Tiga record

Catatan : Konkurensi bukan merupakan isu pada global temporary tables, karena mereka hanya tersedia pada aplikasi yang mendeklarasikan dan membuatnya.

Scheduler
Scheduler adalah proses khusus didalam DBMS yang mengatur operasi berjalannya transaksi-transaksi konkuren. Scheduler memisahkan eksekusi dari operasi database Hendra, MT. & Jimmy, S.Kom. 114

Database Lanjut dengan IBM DB2 untuk memastikan serializable dan isolasi dari transaksi. Untuk mendapatkan pengaturan yang sesuai, scheduler mendasarkan aksinya pada algoritma pengendalian konkurensi, seperti metode locking dan time stamping. Scheduler mengatur eksekusi transaksi yang terjadi bersamaan (T1, T2, T3, dll) untuk mendapatkan hasil sebagaimana jika transaksi tersebut dijalakan secara berurutan (satu setelah lainnya). Scheduler juga memfasilitasi isolasi untuk memastikan bahwa dua transaksi tidak mengupdate elemen data yang sama pada saat yang bersamaan, sebagaimana kemungkinan konflik yang ditunjukan pada matrik berikut ini: T1 Baca Baca Tulis Tulis T2 Baca Tulis Baca Tulis Hasil Tidak konflik Konflik Konflik Konflik

Beberapa metode telah diusulkan untuk menjadwalkan eksekusi dari operasi yang konflik didalam transaksi konkuren. Metode ini diklasifikasikan sebagai locking, time stamping dan optimistic, dan metode locking merupakan yang paling sering digunakan.

Locking
Suatu lock menjamin data digunakan secara eksklusif oleh transaksi yang berjalan, dengan kata lain transaksi T2 tidak dapat mengakses data yang sedang digunakan oleh T1. Suatu transaksi harus mengunci data sebelum mengaksesnya, dan penguncian dilepas ketika transaksi telah selesai, sehingga dapat digunakan oleh transaksi lainnya. Secara umum, kebanyakan DBMS secara otomatis melakukan prosedur penguncian yang diatur oleh lock manager yang bertanggung jawab untuk tugas dan kebijakan lock dari suatu transaksi. Berikut ini adalah beberapa istilah yang terkait dengan locking. Database level lock Suatu database level lock mengunci keseluruhan database, sehingga tidak dimungkinkan untuk menggunakan tabel manapun oleh T2 ketika T1 sedang berjalan. Tingkat lock ini cocok untuk proses batch, tetapi tidak cocok untuk kondisi multiuser. Table level lock Pada table-level-lock, keseluruhan tabel dikunci, pencegahan akses kepada baris didalam tabel oleh T2 tidak dimungkinkan ketika T1 sedang menggunakan tabel tersebut, jika transaksi membutuhkan akses ke beberapa tabel, maka masing-masing tabel akan dikunci, tetapi dua transaksi dapat mengakses database yang sama sepanjang mereka mengakses tabel yang berbeda. Hendra, MT. & Jimmy, S.Kom. 115

Database Lanjut dengan IBM DB2

Page level lock Pada page level lock, DBMS akan mengunci keseluruhan disk page, suatu disk page atau page adalah setara dengan satu disk block alokasi oleh sistim operasi yang dapat berukuran 4K, 8K, 16K. Misalnya anda ingin menulis hanya menulis data 100 byte, maka keseluruhan satu blok 4K akan dibaca ke memori, dilakukan proses update 100 byte pada memori dan ditulis kembali sebanyak 4K ke disk. Satu tabel dapat terdiri dari banyak page, dan satu page dapat terdiri dari banyak baris dari satu tabel ataupun beberapa tabel. Page level lock adalah metode yang paling banyak digunakan oleh DBMS multiuser. Row level lock Row level lock merupakan metode yang paling tidak membatasi, karena menggunakan satuan yang terkecil pada level baris, sehingga baris lain tetap dapat diakses oleh transaksi lainnya. Walaupun lebih fleksibel tetapi metode ini membutuhkan usaha yang besar. Shared/Exclusive lock Suatu exclusive lock adalah akses hanya diperbolehkan bagi transaksi yang mengunci objek tersebut. Jenis lock ini dilakukan jika ada potensi terjadinya konflik pada proses read dan write. Suatu shared lock adalah ketika transaksi konkuren diperbolehkan untuk akses baca, suatu shared lock tidak menghasilkan konflik pada transaksi konkuren hanya read only. Suatu shared lock dilakukan ketika suatu transaksi membaca data dari database, dan suatu exclusive lock dilakukan ketika transaksi melakukan proses update data dan tidak ada lock yang dilakukan oleh transaksi lainnya, jika tidak maka transaksi tersebut harus menunggu sampai transaksi lainnya mengakhiri proses lock (COMMIT), dan hal dikenal sebagai mutual transaction rule: hanya ada satu transaksi yang dapat melakukan exclusive lock. Pemakaian lock dapat menjaga konsistensi transaksi, tetapi dapat menyebabkan dua persoalan utama yaitu: 1. Menyebabkan jadwal transaksi menjadi tidak serializable 2. Menyebabkan jadwal menjadi deadlock. Deadlock Suatu deadlock terjadi ketika dua transaksi mengakses sumber daya secara bersilangan, misalnya T1 mengunci disk page satu, dan T2 mengunci disk page dua, kemudian transaksi T1 mencoba mengunci disk page dua (menunggu sampai T2 commit), pada saat yang sama T2 mencoba mengunci disk page satu (menunggu sampai T1 commit), pada kondisi ini kedua transaksi berada dalam kondisi saling menunggu, dan inilah yang disebut sebagai deadlock.

Hendra, MT. & Jimmy, S.Kom.

116

Database Lanjut dengan IBM DB2

Optimistic lock
Suatu mekanisme yang bekerja dengan asumsi bahwa operasi database tidak mengalami konflik. Pendekatan optimistik tidak membutuhkan locking maupun time stamping, dimana transaksi dijalankan tanpa pembatasan sampai di commit. Dengan metode optimistic, setiap transaksi melalui dua atau tiga fase sebagai as read, validation dan write. Pada fase read, transaksi membaca databse, menjalankan proses komputasi, mengupdate ke suatu duplikat nilai privasi, semua operasi update dicatat pada suatu file update sementara, dimana tidak dapat diakses oleh transaksi lain. Pada fase validation, transaksi memastikan perubahan tidak mengganggu integritas dan konsistensi database, jika berhasil, maka dilakukan proses write, jika tidak maka transaksi diulangi dan perubahan dibatalkan. Pada fase write, data dibuat permanen ke database.

Penanganan konkurensi pada DB2


Penanganan terhadap konsistensi database dan integritas data dimana lebih dari satu aplikasi mengakses data yang sama pada saat yang sama, dikenal dengan istilah konkurensi. Salah satu usaha DB2 untuk menjaga concurrency adalah melalui isolation level, dimana menentukan bagaimana data dikunci dan diisolasi terhadap transaksi lainnya. DB2 menyediakan beberapa tingkat isolasi sebagai berikut: 1) Repeatable read 2) Read stability 3) Cursor stability dan semantik currently committed 4) Uncommitted read

Repeatable read (RR)


Merupakan tingkat isolasi yang paling ketat dan boros resources karena melakukan Record level lock terhadap semua record yang menjadi acuan hasil query, misalkan hasil query 10 record berasal dari hasil pembacaan 10000 record, maka 10000 record akan dikunci, dan memungkinkan terjadinya Table level lock pada UOW, dimana masing-masing transaksi secara menyeluruh terisolasi dari pengaruh transaksi lainnya, fenomena seperti dirty read, non-repeatable read, dan phantom read tidak akan terjadi. RR tidak dapat melihat data yang belum di commit oleh transaksi lain.

Read stability (RS)


Tingkat isolasi RS read stability tidak begitu ketat dibandingkan dengan RR, karena hanya melakukan Record level lock terhadap record yang memenuhi kriteria hasil query pada UOW, misalnya sebuah tabel memiliki 10000 record dan record memenuhi kriteria query adalah 10 record, maka lock hanya dilakukan terhadap 10 record tersebut. Hendra, MT. & Jimmy, S.Kom. 117

Database Lanjut dengan IBM DB2 RS tidak secara lengkap mengisolasi efek dari suatu transaksi terhadap lainnya. Tingkat isolasi RS akan mencegah terjadinya dirty read dan non-repeatable read, ( RS tidak dapat melihat data yang belum di commit oleh transaksi lain) tetapi phantom read dapat terjadi (T2 dimungkinkan menambah record yang memenuhi kriteria query T1), .

Cursor stability (CS)


Tingkat isolasi CS sangat longgar didalam mengisolasi efek dari suatu transaksi terhadap transaksi lainnya, dimana melakukan record level lock terhadap baris yang sedang ditunjuk oleh cursor, ataupun baris yang belum di commit pada UOW. Fenomena dirty read dapat dicegah, tetapi non-repeatable read dan phantoms dapat saja terjadi. Sebagaimana pada RR dan RS, CS tidak dapat melihat data yang belum di commit oleh transaksi lain. Catatan: CS merupakan default isolation level, adalah cocok ketika anda ingin concurrency yang tinggi and hanya ingin melihat data yang telah di commit. Semantik currently committed diperkenalkan pada Versi 9.7 dan menjadi default untuk database baru, hanya data yang telah di commit yang akan dikembalikan, sebagaimana pada kasus sebelumnya, tetapi sekarang pembacaan oleh T2 tidak perlu menunggu sampai T1 membebaskan lock pada baris. Pembacaan mengembalikan data berdasarkan versi data yang di commit saat ini (dalam hal ini data sebelum operasi penulisan).

Uncommitted Read (UR)


Tingkat isolasi UR merupakan tingkat isolasi yang paling longar, dimana record yang diterima oleh suatu transaksi hanya akan dikunci dari transaksi lainnya berusaha untuk melakukan drop maupun alter table dimana record tersebut diambil. Fenomena dirty read, non-repeatable, dan phantom dapat terjadi. Sesuai dengan namanya, data yang belum di commit oleh transaksi lainnya akan nampak oleh UR. Tetapi tidak dapat melihat tabel, view, ataupun index yang dibuat dan belum di commit oleh transaksi lainnya, cocok digunakan untuk suatu tabel read-only. Penting untuk dicatat bahwa ketika suatu transaksi dijalankan dibawah isolasi UR dan menggunakan suatu updatable cursor, maka transaksi akan berprilaku sebagaimana pada tingkat isolasi CS, dan batasan dari CS berlaku).

Pemilihan tingkat isolasi


Pemilihan tingkat isolasi mempengaruhi sebagaimana baiknya tingkat isolasi tetapi tidak mengorbankan kinerja, dimana semakin tinggi tingkat isolasi, maka semakin rendah kemungkinan concurrency, dan unjuk kerja aplikasi akan turun karena harus menunggu lock pada resources harus dilepaskan (commit atau rollback). Sehingga bagaimana anda Hendra, MT. & Jimmy, S.Kom. 118

Database Lanjut dengan IBM DB2 melakukan pemilihan tingkat isolasi? 1) Gunakan tingkat isolasi RR jika anda menjalankan sejumlah besar query dan tidak ingin transaksi lainnya melakukan perubahan yang menyebabkan query anda mengembalikan hasil yang berbeda jika dijalankan lebih dari satu kali. 2) Gunakan tingkat isolasi RS ketika anda menginginkan konkurensi yang baik terhadap aplikasi lain, disamping anda juga menginginkan stabilitas record pada siklus hidup transaksi anda sendiri, tetapi perintah query tidak diulang. 3) Gunakan tingkat isolasi CS ketika anda ingin tingkat concurrency penuh terhadap aplikasi lain, dan anda tidak menginginkan query mendapatkan data yang belum di commit transaksi lain. 4) Gunakan tingkat isolasi UR jika anda melakukan eksekusi query terhadap tabel/view/database read-only, atau tidak menjadi masalah kalau query mengembalikan data yang belum di commit transaksi lain.

Pengelolaan tingkat isolasi


Walaupun prilaku tingkat isolasi bekerja pada tingkat transaction, tetapi sebenarnya mereka ditentukan pada tingkat aplikasi. Ringkasan dari prilaku masing-masing isolation level ditunjukan pada tabel 12.1. Tabel 13.1, Prilaku dari masing-masing isolation level
Aplikasi dapat melihat perubahan yang belum di commit oleh aplikasi lain Aplikasi dapat mengupdate perubahan yang belum di commit oleh aplikasi lain Eksekusi ulang dari perintah dapat dipengaruhi oleh aplikasi lain Baris yang telah diupdate dapat diupdate oleh aplikasi lain Baris yang telah diupdate dapat dibaca oleh aplikasi lain yang mejalankan level isolasi selain UR Baris yang telah diupdate dapat dibaca oleh aplikasi lain yang menjalankan level isolasi UR Baris yang telah diakses dapat diupdate oleh aplikasi lain Baris yang telah diakses dapat dibaca oleh aplikasi lain UR Ya Tdk Ya Tdk Tdk Ya Ya Ya CS Tdk Tdk Ya Tdk Tdk Ya Ya Ya RS Tdk Tdk Ya Tdk Tdk Ya Tdk Ya RR Tdk Tdk Ydk Tdk Tdk Ya Tdk Ya

Pengaturan isolation level


Pada DB2, pengaturan tingkat isolasi dapat menggunakan perintah CHANGE ISOLATION dengan syntax berikut ini:
>>-CHANGE--+-SQLISL----+--TO--+-CS-+--------------------------->< '-ISOLATION-' +-RR-+ +-RS-+ '-UR-' atau pada tingkat perintah

Hendra, MT. & Jimmy, S.Kom.

119

Database Lanjut dengan IBM DB2

SELECT (INTO), DELETE, UPDATE ... WITH {RR, RS, CS, UR} Perubahan level isolasi tidak diperbolehkan ketika koneksi ke database dengan koneksi tipe 1. Proses di back end harus dihentikan sebelum level isolasi dapat diubah:
db2 terminate db2 change isolation to ur db2 connect to sample

Jika tidak ada level isolasi yang ditentukan, maka pada DB2 9.5 akan menggunakan Cursor Stability, dan untuk DB2 9.7 akan menggunakan Currently Commited. Berikut ini adalah contoh pemakaian isolasi pada fungsi untuk generate running number untuk memastikan hanya ada satu user yang mengupdate dan mengembalikan nilai keyval suatu saat. create table runnum (keyval bigint)^ insert runnum (keyval) values (0)^ create function gen_runnum() returns bigint MODIFIES SQL DATA language sql deterministic begin SET ISOLATION = SERIALIZABLE; update runnum set keyval = keyval + 1; return (select keyval from runnum); COMMIT; end^ Pemakaian fungsi tersebut diatas dapat berkonsekuensi terhadap kinerja, karena semua pemakai antri untuk mendapatkan runnum.

Isolation level pada JDBC


Pada IBM Data Server Driver for JDBC and SQLJ mendukung sejumlah tingkat isolasi, yang mana berkorespondensi dengan tingakt isolasi pada server database.

Hendra, MT. & Jimmy, S.Kom.

120

Database Lanjut dengan IBM DB2 Tingkat isolasi JDBC dapat ditentukan untuk suatu UOW didalam suatu program JDBC, dengan menggunakan metode Connection.setTransactionIsolation. Tingkat isolasi default dapat ditentukan dengan properti defaultIsolationLevel. Tabel berikut ini menunjukan nilai yang mana dapat anda tentukan di metode Connection.setTransactionIsolation dan ekuivalennya pada server database DB2.
nilai pada JDBC java.sql.Connection.TRANSACTION_SERIALIZABLE java.sql.Connection.TRANSACTION_REPEATABLE_READ java.sql.Connection.TRANSACTION_READ_COMMITTED java.sql.Connection.TRANSACTION_READ_UNCOMMITTED tingkat isolasi DB2 Repeatable read Read stability Cursor stability Uncommitted read

Efek dari Lock


Lock pada lingkungan multiuser dapat menyebabkan hal berikut ini: 1) Suspension, suatu proses aplikasi terhenti ketika ia melakukan permintaan lock terhadap sesuatu yang telah dilakukan oleh aplikasi lain yang dan tidak dapat di share. Proses yang ter-suspended secara sementara berhenti berjalan dan berada dalam antrian yang bersifat FIFO sampai proses aplikasi lain melepaskan lock. Proses yang tersuspended akan berjalan kembali jika lock dilepas oleh proses yang konflik dengannya, atau mencapai suatu time out maka proses berlanjut dengan suatu kondisi error. 2) Deadlock, suatu deadlock terjadi ketika dua atau lebih proses aplikasi masing-masing mengunci sumber daya yang mana dibutuhkan oleh proses lainnya, dan tanpa resources tersebut mereka tidak dapat berlanjut. Pada DB2 berdasarkan suatu interval waktu yang telah ditentukan (nilai dari DEADLOCK TIME), DB2 dapat melakukan rollback untuk satu dari proses atau meminta satu proses untuk berhenti, sehingga melepaskan lock dan proses yang tersisa dapat berlanjut. Pada scenario berikut dapat menyebabkan Deadlock pada Cursor Stability, tetapi tidak menjadi masalah pada Currently Committed. Step 1 2 3 T1 select * from coba2 commit T2 select * from coba1 commit

update coba1 set kolom = 1 update coba2 set kolom = 2

Hendra, MT. & Jimmy, S.Kom.

121

Database Lanjut dengan IBM DB2

Latihan
Simulasi Suspension pada Cursor stability, dengan semantik currently commited off 1. Aktifkan ke db2cmd (jendela 1) db2 create database ujicoba on d: db2 connect to ujicoba db2 create table coba (kolom integer) db2 create table coba (kolom integer) db2 insert into coba1 (kolom) values (1) db2 insert into coba2 (kolom) values (1) db2 terminate db2 get db cfg for ujicoba carilah parameter CUR_COMMIT, dan perhatikan nilainya ON/OFF (secara default adalah ON) db2 update db cfg for ujicoba using cur_commit disabled dalam hal ini kita menon-aktifkan cur_commit. 2. Aktifkan db2 secara Auto-Commit OFF db2 terminate db2 +c list command options perhatikan current setting untuk Auto-Commit apakah ON/OFF (seharusnya adalah off, karena pemakaian paramter +c), dalam hal ini berarti semua perintah yang diketikan berada dalam suatu transaksi aktif sampai kepada perintah COMMIT. connect to ujicoba select * from coba1 update coba1 set kolom = 2 select * from coba1 pada saat ini perintah update belum di commit (masih aktif pada transaksi)

Hendra, MT. & Jimmy, S.Kom.

122

Database Lanjut dengan IBM DB2 3. Aktifkan db2cmd (jendela ) db2 +c connect to ujicoba select * from coba1 pada tahapan ini jendela 2 mengalami suspension, karena record masih di-lock oleh transaksi pada jendela 1. 3. Aktifkan kembali ke jendela 1 commit secara otomatis jendela dua akan terlepas dari suspension, dan menampilkan hasil commit oleh transaksi pada jendela 1. Simulasi Deadlock pada Cursor stability, dengan semantik currently commited off 1. Pada jendela 1 update coba1 set kolom=3 2. Pada jendela 2 update coba2 set kolom=3 select * from coba1 secara otomatis berada pada kondisi suspension 3. Pada jendela 1 select * from coba2 kedua transaksi tersebut diatas berada pada kondisi deadlock, dan DB2 akan menyelesaikan deadlock dengan rollback terhadap salah satu transaksi agar deadlock dapat terpecahkan, dan ditampilkan pesan error pada salah satu transaksi. Perhatikan pesan SQL0911N The current transaction has been rolled back because of a deadlock or timeout. Simulasi Suspension pada Cursor stability, dengan semantik currently commited on Hendra, MT. & Jimmy, S.Kom. 123

Database Lanjut dengan IBM DB2

1. Pada jendela 1 terminate db2 db2 update db cfg for sample using cur_commit on db2 connect reset 2. Ulangi semulasi diatas mulai dari nomor 2 (Aktifkan db2 secara Auto-Commit OFF) Apakah terjadi suspension dan deadlock? Mengapa?

Simulasi Bank
drop sequence seq_uid^ drop table account^ drop table trans^ drop function ambil_saldo^ drop procedure add_account^ drop procedure add_trans^ drop trigger trans_check_saldo^ create sequence seq_uid as bigint start with 1 increment by 1 no maxvalue no cache no cycle^ create table account (noaccount varchar(20) not null primary key, nama varchar(100), cabang varchar(20), kota varchar(20), saldo decimal(15,2) default 0, last_access timestamp)^ create table trans(notrans varchar(20) not null primary key, tanggal date, kodetransaksi varchar(2) not null, mediatransaksi varchar(3) not null, noaccount varchar(20) not null, nilai decimal(15,2), FOREIGN KEY (noaccount) REFERENCES account(noaccount))^

Hendra, MT. & Jimmy, S.Kom.

124

Database Lanjut dengan IBM DB2 create procedure lock_account(pnoaccount varchar(20)) language sql begin atomic declare rcount integer default 0; update account set last_access = current_timestamp where noaccount=pnoaccount; GET DIAGNOSTICS rcount = ROW_COUNT; return rcount; end^ create function ambil_saldo(pnoaccount varchar(20)) returns decimal(15,2) language sql begin return (select coalesce(saldo,-1) from account where noaccount = pnoaccount); end^ create procedure add_account(pnoaccount varchar(20), pnama varchar(100), pcabang varchar(20), pkota varchar(20)) language sql begin atomic declare rcount integer default 0; insert into account(noaccount, nama, cabang, kota) values (pnoaccount, pnama, pcabang, pkota); GET DIAGNOSTICS rcount = ROW_COUNT; return rcount; end^ create procedure add_trans(pnotrans bigint, pkodetransaksi varchar(2), pmediatransaksi varchar(3), pnoaccount varchar(20), pnilai decimal(15,2), out hasil integer) language sql begin atomic declare rcount integer default 0; Hendra, MT. & Jimmy, S.Kom. 125

Database Lanjut dengan IBM DB2

insert into trans(notrans, tanggal, kodetransaksi, mediatransaksi, noaccount, nilai) values ( pnotrans, current_date, pkodetransaksi, pmediatransaksi, pnoaccount, pnilai); GET DIAGNOSTICS rcount = ROW_COUNT; set hasil = rcount; return rcount; end^ create trigger trans_check_saldo before insert on trans referencing new as baru for each row mode db2sql when (((select saldo from account where noaccount=baru.noaccount) +baru.nilai) < 0) begin SIGNAL SQLSTATE '75000' SET MESSAGE_TEXT='Saldo tidak cukup!'; end^ create trigger trans_update_saldo after insert on trans referencing new as baru for each row mode db2sql when (1=1) begin update account set saldo = saldo + baru.nilai where noaccount = baru.noaccount; end^ call add_account('920403024','hendra soewarno','MDN BB','medan')^ call add_account('920403041','limada', 'MDN PTS', 'medan')^

Hendra, MT. & Jimmy, S.Kom.

126

Database Lanjut dengan IBM DB2

MyDBOpenHelper.java package simulasi; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; public class MyDBOpenHelper { private static Connection con; public static boolean bukaDatabase(String username, String password) { boolean berhasil = false; try { Class.forName("com.ibm.db2.jcc.DB2Driver"); con = DriverManager.getConnection("jdbc:db2://localhost:50000/bank", username, password); //Repeatable Read pada java setara dengan Read stability pada DB2 con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); con.setAutoCommit(false); berhasil = true; } catch (SQLException ex) { Logger.getLogger(MyDBOpenHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (ClassNotFoundException e) { e.printStackTrace(); } return berhasil; } public static void closeConnection() { try {

Hendra, MT. & Jimmy, S.Kom.

127

Database Lanjut dengan IBM DB2


con.close(); } catch (SQLException ex) { Logger.getLogger(MyDBOpenHelper.class.getName()).log(Level.SEVERE, null, ex); } } public static Connection getConnection() { return con; } } Main.java package simulasi; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.logging.Level; import java.util.logging.Logger; public class Main { public static void main(String[] args) { if (MyDBOpenHelper.bukaDatabase("hendra", "920403024")) { try { System.out.print("No Account (quit=keluar):"); InputStreamReader converter = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(converter); String noac = in.readLine(); if ("quit".equals(noac)) { System.out.println("Sampai jumpa!"); } else { Connection con = MyDBOpenHelper.getConnection(); try { CallableStatement lockAccount = con.prepareCall("call lock_account(?)"); PreparedStatement ambilSaldo = con.prepareStatement("values ambil_saldo(?)"); PreparedStatement ambilNoTrans =

Hendra, MT. & Jimmy, S.Kom.

128

Database Lanjut dengan IBM DB2


con.prepareStatement("(VALUES next value for seq_uid)"); CallableStatement addTrans = con.prepareCall("call add_trans(?,?,?,?,?,?)"); lockAccount.setString(1, noac); //kunci record account (noac) lockAccount.executeUpdate(); ambilSaldo.setString(1, noac); ResultSet rs; rs = ambilSaldo.executeQuery(); if (rs.next()) { Double saldo = rs.getDouble(1); System.out.println("Saldo anda:" + saldo); System.out.print("Nilai deposit:"); in = new BufferedReader(converter); String baca = in.readLine(); Double nilai = Double.parseDouble(baca); if (saldo + nilai >= 0) { ResultSet rsTransNo; rsTransNo = ambilNoTrans.executeQuery(); rsTransNo.next(); addTrans.setInt(1, rsTransNo.getInt(1)); addTrans.setString(2, "TT"); addTrans.setString(3, "TLR"); addTrans.setString(4, "920403024"); addTrans.setDouble(5, nilai); addTrans.registerOutParameter(6, Types.INTEGER); addTrans.executeUpdate(); int hasil = addTrans.getInt(6); if (hasil > 0) { System.out.println("Transaksi berhasil"); } else { System.out.println("Hubungi admin"); } } } con.commit(); } catch (SQLException ex) { try { con.rollback(); } catch (SQLException ex1) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex1); } Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } } catch (IOException ex) {

Hendra, MT. & Jimmy, S.Kom.

129

Database Lanjut dengan IBM DB2


Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } MyDBOpenHelper.closeConnection(); } else { System.out.println("Gagal buka database"); } } }

Hendra, MT. & Jimmy, S.Kom.

130

Database Lanjut dengan IBM DB2

Bab 14, Data control Language


Merupakan bagian dari perintah SQL yang digunakan untuk pengaturan hak akses pemakaian terhadap object database dan data, secara umum DCL memiliki dua perintah utama yaitu GRANT yang berfungsi memberikan otoritas, dan REVOKE yang berfungsi mencabut otoritas yang telah diberikan melalui GRANT. Untuk lebih memahami DCL pada DB2, kita perlu memahami mekanisme keamanan pada database DB2 yaitu: authentication, authorization, dan privileges. Model keamanan pada DB2 ditunjukan pada Gambar 8.1.

Gambar 8.1. Model keamanan pada DB2 (sumber: IBM Developer Works, 2005)

Authentication
Merupakan fitur keamanan yang pertama kita jumpai ketika ingin mengakses ke DB2 instance atau database. Authentikasi pada DB2 bekerja erat kaitannya dengan fitur keamanan pada sistim operasi untuk melakukan proses verifikasi terhadap userid dan password (secara default parameter AUTHENTICATION pada DB2 di set ke SERVER). DB2 dapat juga bekerja dengan protokol keamanan lainnya seperti Kerberos untuk proses authentikasi user. Contoh: Hendra, MT. & Jimmy, S.Kom. 131

Database Lanjut dengan IBM DB2 db2 create database bank on d: Buatlah satu user baru (limited) dengan nama 'susan', dan set password sebagai 'db2' db2 connect to sample user susan password: db2 Pada contoh tersebut diatas membuat database bank, dan kemudian dilakukan koneksi ke database SAMPLE dengan menggunakan user 'susan' dan password 'db2' sebagaimana yang buat pada sistim operasi. (pada contoh diatas, secara otomatis user dengan nama susan akan menjadi member dari group PUBLIC pada DB2 yang memiliki authoritas untuk CONNECT)

Authorization
Authorisasi meliputi penentuan operasi yang dapat dilakukan oleh user atau group, dan objek data yang dapat mereka akses. Pada DB2 ada lima tingkat authorisasi yang berbeda yaitu SYSADM, SYSCTL, SYSMAINT9, DBADM, dan LOAD10. Masing-masing authorisasi akan dijelaskan pada tabel 7.1. Tabel 7.1. Authorisasi pada DB2
SYSADM User yang memiliki authoritas SYSADM untuk suatu instance adalah dapat melakukan perintah DB2 apa saja terhadap instance, semua database yang berada dibawah instance, dan semua object didalam database. Mereka juga memiliki kemampuan untuk mengakses data didalam database dan melakukan GRANT atau REVOKE privileges dan authorities kepada user atau group lain. Hak ini secara otomatis diberikan kepada user Administrator pada sistim operasi Windows. SYSCTRL User dengan authoritas SYSCTRL dapat melakukan semua perintah administratif dan maintenance didalam instance, tetapi mereka tidak dapat mengakses data didalam database, contoh perintah yang dapat dilakukan oleh SYSCTRL didalam instance adalah: db2start/db2stop db2 create/drop database db2 create/drop tablespace db2 backup/restore/rollforward database db2 runtstat (any table) db2 update db cfg for database nama database

User dengan authoritas SYSADM dapat memberikan authoritas SYSCTRL kepada suatu group dengan menggunakan perintah : db2 update dbm cfg using SYSCTRL_GROUP nama group

10

SYSADM, SYSCTL, dan SYSMAINT adalah authorisasi level Instance, sehingga hak diberikan atau dicabut dengan update terhadap konfigurasi database manager (dbm cfg), dan hanya dapat diberikan kepada satu group saja. DBADM dan LOAD adalah authorisasi level database, sehingga hak diberikan atau dicabut secara ekplisit dengan perintah grant/revoke.

Hendra, MT. & Jimmy, S.Kom.

132

Database Lanjut dengan IBM DB2


Contoh: db2 get authorizations Buatlah sebuah group baru pada sistim operasi windows dengan nama db2group, dan tambahkan susan sebagai member dari group db2group. Kemudian jalankan perintah berikut:

SYSMAINT

db2 update dbm cfg using SYSCTRL_GROUP db2group11

User dengan authoritas SYSMAINT hanya dapat melakukan sebagian dari authoritas yang dimiliki SYSCTRL seperti: db2start/db2stop db2backup/restore/rollforward database db2 runstats (any table) db2 update db cfg for database nama database

User dengan authoritas SYSADM dapat memberikan authoritas SYSCTRL kepada suatu group dengan menggunakan perintah : db2 update dbm cfg using SYSMAINT_GROUP nama group DBADM* DBADM merupakan authoritas tingkat database, user DBADM memiliki kendali yang lengkap atas suatu database. User DBADM tidak dapat melakukan pekerjaan administratif maupun maintenance seperti: drop database drop/create tablespace backup/restore database update db cfg for database nama database

Sedangkan perintah maintenance yang dapat dilakukan adalah: create/drop table grant/revoke (any privilege) runstats on table (any table)

User DBADM secara otomatis mendapatkan semua privilege dari objek database dan semua isinya. LOAD Authoritas LOAD juga merupakan authoritas pada tingkat database, dan dapat diberikan kepada user maupun group. Sesuai dengan namanya, authoritas LOAD memperbolehkan user untuk melakukan perintah LOAD terhadap tabel. Perintah LOAD secara khususnya menggunakan alternatif yang lebih cepat dibandingkan dengan dengan perintah insert atau import ketika memasukan suatu tabel dengan data yang besar. Perintah yang dapat dilakukan oleh user dengan authoritas LOAD: quiesce tablespaces for table list tablespaces runstat (any table) load insert (harus memiliki privilege insert pada tabel) load restart/terminate after load insert (harus memiliki privilege insert pada tabel) load replace (harus memiliki insert dan delete privilege pada tabel) load restart/terminate after load replace (harus memiliki insert dan delete privilege pada tabel)

11

Setiap perubahan terhadap konfigurasi dari database manager (dbm cfg), maka instance dari DB2 perlu distop dan distart kembali agar perubahan menjadi efektif.

Hendra, MT. & Jimmy, S.Kom.

133

Database Lanjut dengan IBM DB2


Hanya user dengan authoritas SYSADM dan DBADM yang dapat melakukan grant/revoke authoritas LOAD kepada seorang user atau group. Contoh: grant load on database to user nama user grant insert on table nama tabel to user nama user grant load on database to group nama group grant delete on table nama tabel to group nama group grant insert on table nama tabel to group nama group

*Authoritas

DBADM diperoleh seorang user secara implicit pada saat 'create database nama database'. Secara explicit perintah DBADM diperoleh melalui perintah: grant dbadm on database to user/group nama Perintah tersebut diatas hanya dapat dijalankan oleh seorang pemakai dengan authoritas SYSADM untuk memberikan authoritas DBADM kepada pemakai lain.

Privilege
Privilege bersifat lebih mendetail dari pada otoritas, dan dapat diberikan kepada pemakai atau group. Privilege membantu mendefinisikan object apa saja yang dapat dibuat dan di drop. Mereka juga mendefinisikan perintah yang mana seorang user dapat akses seperti tabel, view, index dan package. Privilege secara umum dapat ditempatkan pada dua kategori utama, yaitu privilege tingkat database, dimana meliputi semua objek didalam database, dan privilege tingkat objek, dimana berasosiasi dengan objek tertentu. Privilege tingkat database yang dapat diberikan kepada user adalah sebagai berikut: CREATETAB: User dapat membuat tabel didalam database BINDADD: User dapat membuat package didalam database dengan perintah BIND CONNECT: User dapat koneksi ke database CREATE_NOT_FENCED: user dapat membuat unfenced user-defined functions (UDFs) IMPLICIT_SCHEMA: user dapat secara implisit membuat schema didalam database tanpa menggunakan perintah CREATE SCHEMA. LOAD: user dapat load data kedalam tabel QUIESCE_CONNECT: user dapat mengakses suatu database ketika dalam tahapan quiesced. CREATE_EXTERNAL_ROUTINE: user dapat membuat procedure untuk digunakan oleh aplikasi dan user lain dari database.

Hendra, MT. & Jimmy, S.Kom.

134

Database Lanjut dengan IBM DB2 Contoh: grant connect on database to user1 grant createtab on database to user1 Sedangkan privilege tingkat objek dapat ringkas pada Tabel 7.2. Tabel 7.2. Privilege tingkat objek pada DB2
Nama privilege CONTROL Objek terkait Table, View, Index, Package, Alias, Disctinct Type, UDF, Sequence Table, View Table, View Table, View Table, View Table Table Table Package Package, Procedure, Function, Method Schema Schema Schema Keterangan Memberikan authoritas penuh pada objek, user dapat melakukan grant atau revoke privilege pada objek. Memperbolehkan user untuk menghapus record dari objek Memperbolehkan user untuk menyisip record kedalam objek dengan perintah INSERT ataupun IMPORT. Menyediakan kemampuan untuk menampilkan isi dengan perintah SELECT Memperbolehkan user untuk memperbaharui record dalam objek dengan perintah UPDATE Memperbolehkan user untuk melakukan alter terhadap definisi objek Memperbolehkan user untuk membuat index pada object Menyediakan kemampuan untuk create atau drop foreign key pada object Memperbolehkan user untuk rebind package yang ada Memperbolehkan user untuk mengeksekusi package. Memperbolehkan user untuk melakukan modifikasi terhadap definisi object Memperbolehkan user untuk create objek didalam skema Memperbolehkan user untukdrop objek didalam skema

DELETE INSERT SELECT UPDATE ALTER INDEX REFERENCES BIND EXECUTE ALTERIN CREATEIN DROPIN

Informasi terkait dengan privilege tingkat objek disimpan pada system catalog view. Nama view tersebut adalah syscat.tabauth, syscat.coauth, syscat.indexauth, syscat.schemaauth, syscat.routineauth, dan syscat.packageauth Explicit Privilege, merupakan privilege yang grant atau revoke dari user atau group dengan menggunakan perintah GRANT, dan REVOKE. Contoh: db2 grant select on table sales to susan db2 revoke select on table sales from susan db2 grant select, update,insert,delete on table sales to susan db2 revoke select, update,i nsert,delete on table sales from susan Hendra, MT. & Jimmy, S.Kom. 135

Database Lanjut dengan IBM DB2 db2 grant control on table sales to susan db2 revoke control on table sales from susan db2 grant update (region, sales) on table sales to susan db2 create view salesQUEBEC as select * from sales where region='QUEBEC' db2 grant select on salesQUEBEC to susan db2 grant createin on schema hendra to susan Untuk mengetahui jenis authoritas yang dimiliki oleh user dapat dilihat pada tabel SYSCAT.DBAUTH, SYSCAT.TABAUTH, SYSCAT.PACKAGEAUTH, SYSCAT.INDEXAUTH, SYSCAT.COLAUTH, and SYSCAT.SCHEMAAUTH Contoh: select * from syscat.dbauth select * from syscat.tbauth where grantee='SUSAN' Implict privilege, merupakan privilege yang secara otomatis digrant oleh DB2 ketika suatu perintah tertentu dilakukan, tanpa perlu pemakaian perintah GRANT secara explicit, contoh:
Perintah yang dilakukan CREATE TABLE tabelku CREATE SCHEMA skemaku Privilege yang di grant CONTROL pada tabelku CREATEIN, ALTERIN, DROPIN pada skemaku ditambah dengan kemampuan untuk melakukan grant kepada orang lain CONTROL pada viewku hanya jika CONTROL dimiliki pada seluruh tabel dan view yang terhubung didalam definisi dalam viewku SELECT pada tabel system catalog databaseku, PUBLIC** IMPLICIT_SCHEMA pada databaseku* Penerima grant User yang melakukan perintah tersebut User yang melakukan perintah tersebut

CREATE VIEW viewku

CREATE DATABASE databaseku

*Ketika user membuat database, secara implicit user tersebut mendapatkan authoritas DBADM pada database tersebut. Bersamaan dengan authority DBADM juga secara implicit diberikan privilege CONNECT, CREATETAB, BINDADD, IMPLICIT_SCHEMA, dan CREATE_NOT_FENCED. Privilege ini tetap dimiliki oleh user walaupun authoritas DBADM direvoke dari user. ** PUBLIC adalah group spesial DB2 yang memasukan semua user dari suatu database tertentu. Group PUBLIC tidak perlu didefinisikan pada tingkat sistm operasi. Ada beberapa privilege secara default di grant ke group PUBLIC, yaitu CONNECT, CREATETAB, BINDADD, IMPLICIT_SCHEMA, SELECT pada tabel system. Hendra, MT. & Jimmy, S.Kom. 136

Database Lanjut dengan IBM DB2

Indirect privilege, privilege secara indirect ketika package dieksekusi oleh database manager. Suatu package yang mengandung satu atau lebih perintah SQL dimana telah dikonversi kedalam format dimana DB2 menggunakannya secara internal untuk mengeksekusi mereka. Atau dengan kata lain suatu package yang mengandung perintah SQL dalam format executable, jika semua statement tersebut adalah static, seorang user hanya membutuhkan privilege EXECUTE terhadap package tersebut untuk berhasil menjalankan perintah didalam package. Sebagai contoh diasumsikan bawa db2package1 menjalankan perintah SQL static berikut: select * from org insert into test values (1, 2, 3) maka dalam hal ini, seorang user dengan privilege EXECUTE pada db2package1 akan secara tidak langsung mendapatkan privilege SELECT pada tabel org dan privilege INSERT pada tabel test.

Latihan
1. Buatlah sebuah limited user baru pada sistim operasi anda dengan nama susan dan password db2. 2. Aktifkan db2cmd, dan lakukan koneksi ke database bank dengan user susan. db2 connect to bank user susan db2 get authorizations select * from hendra.account SQL0551N "SUSAN" does not have the required authorization or privilege t perform operation "SELECT" on object "HENDRA.ACCOUNT". SQLSTATE=42501 Secara default user susan tidak memiliki otoritas ataupun privilege untuk melakukan operasi select terhadap tabel hendra.account (dalam hal ini kita perlu menyebutkan nama schema, karena tabel account berada dibawah schema hendra sebagai pembuat tabel tersebut) call hendra.add_account('920403065','tony','MDN BB', 'medan'); SQL0440N No authorized routine named "HENDRA.ADD_ACCOUNT" of type "PROCEDURE"having compatible arguments was found. SQLSTATE=42884. Hendra, MT. & Jimmy, S.Kom. 137

Database Lanjut dengan IBM DB2

Jadi jelas bahwa user susan dapat melakukan koneksi ke database BANK tetapi tidak memiliki otoritas untuk mengakses objek database didalamnya. 3. Aktifkan db2ce, dan lakukan koneksi ke database bank connect to bank create view nasabah_medan as select nama, cabang, kota from account where kota='medan' grant select on nasabah_medan to susan 4. Aktifkan kembali ke db2cmd user susan select * from hendra.nasabah_medan perintah diatas akan berhasil, karena user susan sudah diberi privileges select terhadap view nasabah_medan. select * from hendra.account SQL0551N "SUSAN" does not have the required authorization or privilege to perform operation "SELECT" on object "HENDRA.ACCOUNT". SQLSTATE=42501 walaupun susan dapat melakukan select view hendra.nasabah_medan, tetapi tidak memiliki hak untuk select hendra.account yang menjadi sumber data dari view tersebut. update hendra.nasabah_medan set nama = 'limada 123' where nama='limada' SQL0551N "SUSAN" does not have the required authorization or privilege to perform operation "UPDATE" on object "HENDRA.NASABAH_MEDAN". SQLSTATE=42501 5. Pada jendela db2ce grant execute on procedure add_account to susan grant execute on function ambil_saldo to susan 6. Buatlah program Add account dengan menggunakan koneksi user susan, Hendra, MT. & Jimmy, S.Kom. 138

Database Lanjut dengan IBM DB2 password db2. 7. Buatlah program Cek Saldo, Tarik Tunai , Transfer antar rekening ATM dengan menggunakan koneksi user felicia password fortuna (grand fungsi atau procedure yang diperlukan). Selamat Siang No. Account : Menu: 1. 2. 3. 4. Cek Saldo Tarik Tunai Transfer antar rekening Cetak 10 Transaksi terakhir

Cek Saldo: Saldo anda adalah : xxxxxx Tarik Tunai: Jumlah penarikan : xxxxxx (transaksi dicatat dan potong saldo) kalau berhasil : Silahkan ambil uang anda. Transfer antar rekening No Rekening tujuan: Nilai transfer: Next Muncul nama yang dimasking : HEXXXA Catat transaksi dan pindah saldo. create function last_10_trans (pnoaccount varchar(20)) returns table (tanggal date, kodetransaksi varchar(2), mediatransaksi varchar(3), nilai decimal(15,2)) language sql reads sql data no external action Hendra, MT. & Jimmy, S.Kom. 139

Database Lanjut dengan IBM DB2 return select tanggal, kodetransaksi, mediatransaksi, nilai from (select row_number() over() as m, tanggal, kodetransaksi, mediatransaksi, nilai from trans where noaccount= last_10_trans.pnoaccount order by tanggal desc) as a where m < 10^ Contoh pemakaian: select * from table(last_10_trans('920403024'))

Hendra, MT. & Jimmy, S.Kom.

140

Database Lanjut dengan IBM DB2

Bab 15, BACKUP, RESTORE, dan RECOVERY


Backup data sering kali diabaikan dan sampai kepada kejadian kerusakan data baru disadari bahwa tindakan Backup data merupakan suatu syarat bagi kesinambungan dari pemanfaatan sistim informasi.

Konsep backup dan recovery


Suatu backup dari database adalah suatu duplikasi dari database beserta dengan informasi kontrol, yang dalam kondisi siap di restore apabila terjadi kerusakan data. Backup data meminimalkan potensi kehilangan data akibat kerusakan, karena anda dapat memulihkan data melalui pengembalian dari hasil backup.

Pilihan pada backup data


Untuk melakukan backup data, terdapat dua pilihan yaitu secara offline dan secara online. Pilihan secara offline membutuhkan kondisi dimana semua aplikasi di-disconnect dari database, sedangkan online backup memungkinkan transaksi untuk terus berlangsung ketika proses backup berjalan. Ada implikasi pemilihan modus backup terhadap pemulihan data. Ada dua jenis logging pada DB2, dan masing-masing metode logging memiliki implikasi terhadap backup dan recovery. Kedua jenis logging tersebut adalah circular dan archive logging (lihat pembahasan ditopik transaction). Ketika anda memilih circular logging, maka jenis backup yang dapat dilakukan adalah offline backup dan version recovery. Pada archive logging, anda dapat melakukan suatu online backup dan roll forward recovery, dimana anda dapat memulihkan data sampai kepada suatu titik waktu atau sampai pada akhir dari log untuk meminimalkan kehilangan data. Perlu diperhatikan bahwa jika anda memutuskan untuk menggunakan circular logging dan offline recovery sebagai strategi backup anda, maka semua transaksi setelah posisi terakhir offline backup akan hilang.

Offline backup dan recovery


Secara default jenis logging yang digunakan pada DB2 adalah circular logging (bersifat round robin), dan offline backup adalah mudah dilakukan pada DB2 dan sifatnya full database backup. Untuk memeriksa jenis logging yang digunakan pada database anda dapat menggunakan perintah: db2 get db cfg for bank

Hendra, MT. & Jimmy, S.Kom.

141

Database Lanjut dengan IBM DB2 Setelah pemberian perintah tersebut diatas, perhatikan parameter konfigurasi untuk LOGRETAIN dan USEREXIT, jika jenis logging database anda adalah circular, maka kedua parameter tersebut diatas bernilai OFF. Secara sederhana offline backup dapat dilakukan dengan menggunakan perintah: backup database bank to e:\087025007 atau backup database bank to e:\087025007 with 4 buffers buffer 4096 parallelism 1 Untuk melakukan proses offline backup membutuhkan authority SYSADM, SYSCTRL atau SYSMAINT. Sebelum melakukan restore, anda dapat menggunakan perintah berikut ini untuk menampilkan semua history dari backup data yang pernah dilakukan terhadap database: list history backup all for bank Selanjutnya untuk melakukan restore database anda dapat menggunakan perintah: restore database bank from e:\087025007 taken at 20110503113244 atau restore database bank from e:\087025007 taken at 20110503113244 replace existing

Online backup dan recovery


Untuk dapat melakukan DB2 online backup dan recovery anda perlu memahami beberapa istilah berikut ini: 1. Active log, adalah log yang berisi transaksi yang mana belum di commit atau rollback atau transaksi yang telah di commit tetapi belum di tulis ke disk. 2. Online archive log, adalah log yang mengandung informasi transaksi yang telah di commit dan ditulis ke disk. 3. Offline archive log, adalah log yang mana telah dipindahkan dari directory active log ke lokasi lain dimedia atau tape. Catatan: Untuk online backup, adalah sangat penting juga melakukan proses backup terhadap log file. Untuk dapat melakukan online backup, maka archive logging harus diaktifkan, dengan mengubah parameter LOGRETAIN menjadi ON, setelah mengubah mekanisme logging, Hendra, MT. & Jimmy, S.Kom. 142

Database Lanjut dengan IBM DB2 maka archive logging akan mencatat transaksi yang di commit. Setelah perubahan ini maka pencatatan log tidak bersifat round robin lain. Langkah awal untuk mengaktifkan online backup, adalah mengubah parameter LOGRETAIN menjadi ON dengan perintah: db2 update db cfg for bank using logretain on db2stop db2start Kemudian periksa kembali status dari LOGRETAIN dengan menggunakan perintah: db2 get db cfg for bank dan jika anda perhatikan maka nilai konfigurasi untuk parameter LOGRETAIN adalah RECOVERY, dan USEREXIT adalah OFF. db2 backup database bank to d:\087025007 dan selanjutnya telah dapat dilakukan online backup dengan perintah: db2 backup database bank online to d:\087025007 Selanjutnya untuk melakukan restore dapat dilakukan seperti biasanya dengan perintah dan diikuti perintah ROLLFORWARD ke kondisi active db2 restore database bank from d:\087025007 taken at 20110503150754 Setelah proses restore selesai, maka database berada pada kondisi ROLLFORWARD PENDING, sehingga diperlukan proses rollforward sampai ketitik waktu tertentu, pada proses rollforward ini membutuhkan log file, dan jika log file tidak tersedia, maka rollforward tidak dapat dilakukan, dan hasil restore tidak dapat digunakan sama sekali. ROLLFORWARD DATABASE BANK TO 2004-06-29-15.23.09.000000 USING LOCAL TIME AND COMPLETE; atau ROLLFORWARD DATABASE BANK TO 2004-06-29-15.23.09.000000 USING LOCAL TIME AND STOP; atau ROLLFORWARD DATABASE BANK TO END OF LOGS AND COMPLETE;

Incremental backup dan recovery


Ketika database anda berkembang dalam ukuran terabyte dan petabyte, maka waktu dan sumber daya perangkat keras yang dibutuhkan bertumbuh menjadi hal yang menentukan, dan sering kali waktu yang tersedia tidak layak untuk melakukan backup terhadap keseluruhan data maupun table spaces sekaligus waktu. Adalah lebih baik jika anda Hendra, MT. & Jimmy, S.Kom. 143

Database Lanjut dengan IBM DB2 hanya melakukan backup terhadap page yang berubah saja dari bada seluruh database atau tablespace. Pada DB2 mengenal dua strategi incremental backup, yaitu: 1. Incremental 2. Delta Suatu incremental backup adalah backup dari semua perubahan sejak full backup terakhir yang berhasil. Bentuk backup ini juga dikenal dengan istilah kulmulatif backup, sedangkan suatu delta backup adalah backup dari perubahan sejak backup terakhir yang berhasil (baik full, incremental maupun delta backup).

Pada incremental backup, jika ada kerusakan pada haris Sabtu, anda hanya perlu melakukan restore full backup terakhir, dan incremental backup pada hari Sabtu, sedangkan pada delta backup, anda perlu melakukankan restore full backup terakhir kemudian diikuti setiap delta backup sampai kepada delta backup hari Sabtu.

Hendra, MT. & Jimmy, S.Kom.

144

Database Lanjut dengan IBM DB2

Agar dapat diketahui page database yang diupdate, maka perlu diupdate parameter konfigurasi TRACKMOD, dimana jika diset ke NO (default), maka tidak ada tracking perubahan pada page yang diupdate, dan jika diset ke YES, maka utility backup dapat mendeteksi bagian mana dari page database yang harus dipelajari oleh incremental backup dan secara potensial kedalam image backup. Setelah setting parameter ini ke YES, maka anda perlu melakukan suatu full database backup dalam rangka memiliki garis dasar dimana incremental b ckup dapat dilakukan. Langkah-langkah melakukan incremental backup: 1. db2 update db cfg using trackmod on 2. db2 backup database bank online to d:\087025007 3. db2 backup database bank online incremental to d:\087025007 4. dst Misalnya jika terjadi kegagalan pada data, sehingga diperlukan proses restore data mulai dari fullbackup terakhir yang berhasil, kemudian dilanjutkan dengan restore incremental backup terakhir dan roll forward, atau dapat menggunakan opsi automatic untuk otomatis merestore mulai dari full backup dan mengaplikasikan incremental backup terakhir, setelah ini anda akan berada pada modus roll forward pending (SQL1117N) sehingga perlu dilakukan roll forward terhadap transaksi. db2 restore database bank incremental automatic from e:\tmp taken at 20040701112735 without prompting db2 rollforward database bank to end of logs and complete Untuk delta backup dan restore, pada skenario yang sama, anda perlu melakukan restore Hendra, MT. & Jimmy, S.Kom. 145

Database Lanjut dengan IBM DB2 image delta setiap bari, dan roll forward untuk melengkapi recovery. DB2 menyediakan utility db2ckrst untuk query history database dan menghasilkan daftar timestamp untuk image backup yang diperlukan untuk suatu incremental restore.

Latihan
Simulasi offline Backup 1. Aktifkan dua jendeal db2cmd 2. Koneksi masing-masing ke database bank (db2 connect to bank) 3. Pada jendela 1 jalankan perintah db2 get db cfg for bank, dan perhatikan parameter konfigurasi untuk LOG RETAIN (seharusnya adalah OFF yang berarti database menggunakan circular logging) 4. Pada jendela 1 jalankan perintah: db2 backup database bank to d:\ SQL1035N The database is currently in use. SQLSTATE=57019 Hal ini terjadi karena circular logging tidak dimungkinkan online backup dapat dilakukan (database sedang digunakan oleh user lain). Simulasi online backup Pada jendela 1 jalankan perintah: db2 update db cfg for bank using logretain on db2 stop db2 start db2 backup database bank to d:\ Backup successful. The timestamp for this backup image is : 20120307174754 db2 connect to bank SQL1116N A connection to or activation of database "BANK" cannot be made because of BACKUP PENDING. SQLSTATE=57019 Lakukan online backup untuk menyelesaikan masalah BACKUP PENDING db2 backup database bank online to d:\ Hendra, MT. & Jimmy, S.Kom. 146

Database Lanjut dengan IBM DB2

Backup successful. The timestamp for this backup image is : 20120307174951 db2 create table coba (kolom integer) db2 insert into table coba (kolom) values (1) db2 disconnect sample db2 terminate db2stop Hapus file d:\db2\node0000\sample\t0000000 dan hapus file c0000000.CAT untuk mensimulasikan kerusakan data pada database. db2start db2 connect to bank SQL0293N Error accessing a table space container. SQLSTATE=57048 artinya ada kerusakan pada database db2 list history backup all for bank catat timestamp backup dengan Comment : DB2 BACKUP BANK ONLINE db2 restore database sample from d:\087025007 taken at 20120307174951 SQL2539W Warning! Restoring to an existing database that is the same as the backup image database. The database files will be deleted. Do you want to continue ? (y/n) y DB20000I The RESTORE DATABASE command completed successfully. db2 connect to bank SQL1117N A connection to or activation of database "BANK" cannot be made because of ROLL-FORWARD PENDING. SQLSTATE=57019 Dalam hal ini kita belum melakukan roll-forward sampai ketitik terakhir setelah backup. (ingat perintah pada saat kita buat tabel coba dijalankan setelah online backup). db2 rollforward database bank to end of logs and complete

Hendra, MT. & Jimmy, S.Kom.

147

Database Lanjut dengan IBM DB2


Rollforward Status Input database alias Number of nodes have returned status Node number Rollforward status Next log file to be read Log files processed Last committed transaction DB20000I = bank = 1 = = = = = 0 not pending S0000000.LOG - S0000000.LOG 2012-03-07-10.49.56.000000 UTC

The ROLLFORWARD command completed successfully.

db2 connect to bank db2 select * from coba Simulasi kesalahan hapus data time The current time is: 18:10:42.37 db2 drop table coba SQL0204N "HENDRA.COBA" is an undefined name. SQLSTATE=42704 db2 restore database bank from d:\ taken at 20120307174951 db2 rollforward database bank to 2012-03-07-18.10.42.00037 using local time and complete db2 connect to bank db2 select * from coba Simulasi online backup beserta logs Pada contoh ini kita mensimulasikan pengiriman database ke site lain db2 backup database bank online to d:\ include logs catat <timestamp> db2 drop database bank db2 restore database bank from d:\ taken at <timestamp> logtarget d:\ db2 rollforward db bank to end of logs and stop overflow log path (d:\)

Hendra, MT. & Jimmy, S.Kom.

148

Database Lanjut dengan IBM DB2 Simulasi backup restore secara incremental backup Pada contoh ini kita akan backup beserta logs, karena kita akan mensimulasikan terhapusnya database. db2 update db cfg for bank using logretain on db2 update db cfg for bank using trackmod on db2 terminate db2stop db2start db2 backup database bank to d:\ db2 backup database bank online to d:\ include logs db2 connect to bank insert into coba (kolom) values (10) backup database bank online incremental to d:\ include logs Bandingkan perbedaan ukuran file hasil backup db2 connect to bank db2 insert into coba (kolom) values (3) db2 backup database bank online incremental to d:\ include logs catat <timestamp> db2 drop database bank db2 restore database bank incremental automatic from d:\ taken at <timestamp> logtarget d:\ DB20000I The RESTORE DATABASE command completed successfully. Perintah tersebut secara otomatis melakukan restore incremental backup mulai dari fullbackup terakhir dari incremental backup tersebut berdasarkan <timestamp> db2 rollforward database bank to end of logs and stop overflow log path (d:\) Simulasi backup restore secara differensial (delta) Hendra, MT. & Jimmy, S.Kom. 149

Database Lanjut dengan IBM DB2

db2 backup database bank online to d:\ db2 backup database bank online incremental delta to d:\ catat: <timestamp> db2 restore database bank incremental automatic from d:\ taken at <timestamp> db2 rollforward database bank to end of logs and stop

Hendra, MT. & Jimmy, S.Kom.

150

Database Lanjut dengan IBM DB2 Daftar Pustaka IBM DB2 Database for Linux, Unix, and Windows Information Center, http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/index.jsp, Copyright IBM Corporation 1993, 2011 . Torey and Toby J, Database Design: know it all, Elsevier Inc, 2011 Peter Rob and Carlos Coronel, Database Systems: design, implementation and management, Course Technology, 2009.

Hendra, MT. & Jimmy, S.Kom.

151

You might also like