AdityaDees: Mysql

Hot

https://publishers.chitika.com/

Contact us for advertising.
Showing posts with label Mysql. Show all posts
Showing posts with label Mysql. Show all posts

29 December 2021

Ask Trigger Database, Fungsi dan Manfaatnya AdityaDees

22:54 0
Trigger Database, Fungsi dan Manfaatnya
Bismillah...

Pada kasus tertentu, terkadang kita menginginkan sebuah script sql tertentu di eksekusi ketika terjadi proses insert, update ataupun delete di database. Pada aplikasi kasir misalnya, saat kasir menginput barang yang dibeli oleh customer di mesin kasir dan proses transaksi tersebut berhasil dilakukan, maka stok barang yang dibeli tentu akan berkurang. Atau contoh lain seperti anda berbelanja disebuah online shop misalnya, barang atau item yang anda checkout akan otomatis berkurang stoknya di penjual. Nah, sekarang bagaimanakah menerapkan sistem tersebut? Jika terjadi proses seperti ini kita akan melakukan update stok di tabel barang atau item. Mungkin selama ini anda banyak melakukannya di dalam source code aplikasi secara langsung. Memang tidak mengapa melakukan hal seperti itu didalam source code langsung, akan tetapi ada cara yang lebih baik dan efisien yang bisa anda terapkan yakni dengan menggunakan trigger database.

Apa itu trigger, apa fungsi dan manfaatnya ? Trigger adalah kumpulan script sql yang dieksekusi secara otomatis ketika terjadi proses DML (Data Manipulation Language) seperti insert, update dan delete di pada sebuah tabel. Umumnya trigger memiliki opsi apakah script sql akan di eksekusi sebelum atau sesudah, atau kedua-duanya.

Fungsi Trigger :
  • Mengeksekusi script sql secara otomatis ketika terjadi perubahan pada sebuah tabel.
  • Menjaga integritas data.
  • Mencegah proses perubahan yang tidak dibenarkan atau tidak sah.

Manfaat Trigger :
  • Aplikasi yang dibuat menjadi lebih cepat jika dibandingkan menulis langsung script sql di kode program.
  • Reusable, artinya ketika terjadi migrasi atau perpindahan bahasa pemrograman maka kita tidak perlu menulis ulang script sql di source code aplikasi.
  • Mudah untuk di maintenance.

Selanjutnya kita akan membahas tentang cara bagaimana membuat trigger serta menghapusnya. Dan dilanjutkan dengan contoh studi kasus sederhana untuk penerapan pembuatan trigger tersebut.

  1. Membuat Trigger
  2. Untuk membuat trigger caranya adalah dengan mengeksekusi script sql seperti dibawah ini :
    DELIMITER $$
    CREATE TRIGGER `nama_trigger` {BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON `nama_tabel` FOR EACH ROW
    BEGIN
    # … Bagian script sql yang akan dieksekusi
    END
    $$
    Penjelasan :
    • Insert
    • Trigger ketika insert merupakan sebuah kondisi dimana kita menjalankan script sql ketika perintah insert pada sebuah tabel dieksekusi. Trigger di proses insert terdapat dua buah kejadian, yakni BEFORE dan AFTER. BEFORE akan di eksekusi sebelum perintah insert dijalankan, sedangkan AFTER sendiri akan di eksekusi ketika perintah insert selesai dijalankan. Pada saat membuat trigger, bagian script yang kita eksekusi biasanya perlu mengambil nilai field dari tabel yang berubah tersebut. Cara mengambil nilai field tersebut adalah dengan keyword NEW dan diikuti dengan nama field ditabel.
    • Update
    • Trigger update akan dieksekusi ketika perintah update di jalankan pada sebuah tabel. Sama seperti trigger insert, trigger update juga terdapat dua buah kejadian yakni BEFORE dan AFTER. Perbedaannya adalah trigger update terdapat keyword NEW dan OLD sedangkan trigger insert hanya keyword NEW saja. Dimana keyword NEW digunakan untuk mengambil field tabel yang baru saja diubah nilainya, sedangkan keyword OLD digunakan untuk mengambil nilai field sebelum diubah.
    • Delete
    • Terakhir adalah trigger delete. Trigger ini akan di eksekusi ketika data pada sebuah tabel dihapus. Sama seperti kedua trigger diatas, trigger ini juga memiliki dua buah kejadian. Perbedaannya adalah trigger delete hanya memiliki keyword OLD untuk mengambil nilai field.

  3. Menghapus Trigger
  4. Untuk menghapus trigger, caranya adalah dengan mengeksekusi script sql seperti dibawah ini :
    DROP TRIGGER `nama_trigger`;
    Untuk melihat trigger yang pernah dibuat sebelumnya, caranya adalah dengan mengeksekusi script sql :
    SHOW TRIGGERS;
Diakhir postingan ini kita akan mencoba membuat trigger sederhana. Pada kasus ini kita akan mengupdate stok barang secara otomatis ketika barang tersebut dijual, diubah atau dihapus. Sekarang buatlah 2 buah tabel seperti dibawah ini :
Erd inventory sederhana
Untuk mempermudah langsung saja copas script berikut ini untuk membuat tabel diatas, ditutorial ini saya menggunakan MySQL atau Maria DB sebagai database:
CREATE TABLE items (
id_item INT(10) NOT NULL AUTO_INCREMENT,
nama_item VARCHAR(100) NULL DEFAULT NULL,
harga FLOAT(15,2) NULL DEFAULT NULL,
stok INT(10) NULL DEFAULT NULL,
PRIMARY KEY (id_item) USING BTREE
);

CREATE TABLE transaction (
id_transaction INT(10) NOT NULL AUTO_INCREMENT,
id_item INT(10) NOT NULL,
qty INT(10) NULL DEFAULT '1',
total FLOAT(15,2) NULL DEFAULT NULL,
PRIMARY KEY (id_transaction) USING BTREE,
INDEX FK__items (id_item) USING BTREE,
CONSTRAINT FK__items FOREIGN KEY (id_item) REFERENCES items (id_item) ON UPDATE NO ACTION ON DELETE NO ACTION
);

INSERT INTO `items` (`id_item`, `nama_item`, `harga`, `stok`) VALUES
(1, 'Gula', 11000.00, 10), (2, 'Kopi', 5000.00, 20), (3, 'Susu', 8000.00, 25), (4, 'Indomie', 2500.00, 15);
Dari tabel diatas kita akan membuat trigger dengan rule sebagai berikut :
  • Stok di tabel items akan otomatis ter-update pada saat dilakukan insert, update ataupun delete di tabel transaction.
  • Sebelum melakukan insert, cek terlebih dahulu stok di tabel items. Dimana stok di tabel items tidak boleh kurang dari 0 pada saat terjadi transaksi di tabel transaction.
  • Pada saat melakukan update data di tabel transaction, jika jumlah qty yang baru di masukkan lebih kecil dari qty yang sebelumnya (qty lama), maka stok yang ada di tabel items akan otomatis bertambah, begitu juga sebaliknya stok akan berkurang jika qty baru lebih besar dari qty sebelumnya.
  • Pada saat setelah terjadi proses delete, stok di tabel items akan otomatis bertambah.
Dari rule diatas maka kita akan membuat trigger INSERT BEFORE, UPDATE BEFORE dan DELETE AFTER pada tabel transaction.
  1. INSERT BEFORE
  2. Trigger yang pertama yang akan kita buat adalah trigger insert before. Trigger ini sendiri akan melakukan pengecekan pada saat ada penambahan baris data baru di tabel transaction, dimana jika qty yang akan dijual dikurangi stok yang ada di item tidak boleh kurang dari nol. Script sql-nya adalah seperti dibawah ini :
    DELIMITER $$
    CREATE TRIGGER `transaction_insert_before` BEFORE INSERT ON `transaction` FOR EACH ROW BEGIN
    SET @stok = (SELECT stok FROM items WHERE id_item = NEW.id_item);
    SET @sisa = @stok - NEW.qty;
    IF @sisa < 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Warning: stok tidak cukup';
    END IF;
    UPDATE items SET stok = @sisa WHERE id_item = NEW.id_item;
    END
    $$
    Pada script diatas kita membuat trigger dengan nama `transaction_insert_before` ditabel transaction. Pada baris berikutnya kita membuat variabel `@stok` dan mengisinya dengan stok yang ada di tabel items, sesuai dengan id_item yang dimasukkan ditabel transaction. Selanjutnya kita membuat variabel sisa yang isinya adalah hasil pengurangan antara stok dengan qty yang dimasukkan dari tabel transaction. Kemudian dicek apakah hasil pengurangan tadi kurang dari nol? Jika iya, maka kita akan menghentikan operasi insert ditabel transaction dengan melemparkan pesan kesalalahan SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Warning: stok tidak cukup'; . Namun jika sisa tidak kurang dari nol, maka kita akan meng-update stok yang ada ditabel items dengan nilai yang ditampung di variabel sisa tadi. Hasilnya jika kita memasukkan qty melebihi stok yang ada ditabel items, maka akan muncul pesan kesalahan seperti ini pada saat insert transaction :
    Throw sql state error on trigger
  3. UPDATE BEFORE
  4. Trigger ini akan melakukan pengecekan pada saat tabel transaction melakukan proses update data. Dimana rule yang telah ditentukan diatas, maka script sql untuk membuat trigger update before adalah sebagai berikut :
    CREATE  TRIGGER `transaction_update_before` BEFORE UPDATE ON `transaction` FOR EACH ROW 
    BEGIN
    IF OLD.id_item = NEW.id_item THEN
    SET @stok = (SELECT stok FROM items WHERE id_item = OLD.id_item);
    SET @sisa = (@stok + OLD.qty) - NEW.qty;
    IF @sisa < 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Warning: stok tidak cukup';
    END IF;
    UPDATE items SET stok = @sisa WHERE id_item = OLD.id_item;
    ELSE
    SET @stok_lama = (SELECT stok FROM items WHERE id_item = OLD.id_item);
    SET @sisa_lama = (@stok_lama + OLD.qty);
    UPDATE items SET stok = @sisa_lama WHERE id_item = OLD.id_item;
    SET @stok_baru = (SELECT stok FROM items WHERE id_item = NEW.id_item);
    SET @sisa_baru = @stok_baru - NEW.qty;
    IF @sisa_baru < 0 THEN
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Warning: stok tidak cukup';
    END IF;
    UPDATE items SET stok = @sisa_baru WHERE id_item = NEW.id_item;
    END IF;
    END
    Saat membuat trigger update, kita melihat bahwa disana ada keyword NEW dan OLD. Keyword NEW disini berarti merupakan nilai sebuah field yang baru saja diubah, sedangkan OLD adalah nilai field yang sebelumnya atau yang lama. Sama seperti trigger insert, kita akan melakukan pengecekan jika kondisi tidak sesuai dengan yang diinginkan maka kita akan melemparkan pesan kesalahan dalam bentuk SIGNAL SQLSTATE '45000' .
  5. DELETE AFTER
  6. Terakhir trigger yang akan kita buat adalah trigger delete after. Trigger ini akan dieksekusi setelah proses delete terjadi. Script-nya adalah sebagai berikut :
    CREATE TRIGGER `transaction_delete_after` AFTER DELETE ON `transaction` FOR EACH ROW 
    BEGIN
    SET @stok = (SELECT stok FROM items WHERE id_item = OLD.id_item);
    SET @sisa = @stok + OLD.qty;
    UPDATE items SET stok = @sisa WHERE id_item = OLD.id_item;
    END
    Mengikuti rule yang telah dibuat sebelumnya, yakni jika ada baris data yang dihapus pada tabel transaction, maka stok pada tabel items akan bertambah sesuai dengan jumlah qty yang dihapus pada tabel transaction.
Demikian tutorial Trigger Database, Fungsi dan Manfaatnya. Jika ada pertanyaan silahkan ditanyakan dikolom komentar.
Read More

04 August 2014

Memindahkan Direktori Database MySQL di Ubuntu GNU/Linux

19:14 0


Baru baru ini saya meng-install sistem operasi desktop Ubuntu versi 14.04.1 LTS ke laptop dan salah satu aplikasi "wajib" adalah database server MySQL, karena hampir semua aplikasi web yang saya bangun menggunakan MySQL sebagai backend-nya. Salah satu kebiasaan saya ketika meng-install MySQL adalah memindahkan direktori tempat MySQL menyimpan semua databasenya ke lokasi non-standar, yang by default berlokasi di /var/lib/mysql, saya pindahkan ke lokasi /home/direktori/mysql misalnya. Hal ini saya lakukan agar memudahkan pemindahan dan backup data apabila Ubuntu-nya akan saya upgrade ke versi major.


Ternyata memindahkan direktori database MySQL di distro GNU/Linux populer seperti Ubuntu dan CentOS tidak semudah zaman dahulu, seperti zaman Ubuntu versi 8.04 dulu (lama banged yak :p) misalnya. Kalau dulu cukup ubah konfigurasi di file konfigurasi /etc/my.cnf, ubah permission direktori, restart daemon semua langsung jalan. Dengan semakin tinggi-nya keamanan di lapisan aplikasi ada beberapa hal yang harus kita lakukan untuk memindahkan direktori database MySQL di distro Ubuntu 14.04. Berikut akan saya paparkan caranya.


Ubah konfigurasi di my.cnf


Tahap pertama adalah dengan mengubah/memodifikasi file konfigurasi utama MySQL, my.cnf, yang pada Ubuntu terletak pada direktori /etc/mysql. Pada konfigurasi default kita akan melihat konfigurasi seperti ini:

...
[mysqld]
#
# * Basic Settings
#
...
datadir = /var/lib/mysql/
...


Ubah file my.cnf dengan text editor favorit anda, dan ubah pada bagian parameter datadir dan pada bagian InnoDB menjadi sebagai berikut:

...
[mysqld]
#
# * Basic Settings
#
...
datadir = /home/adityadees/mysql # sesuaikan dengan direktori baru database MySQL yang kita inginkan
...
#
# * InnoDB
#
# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.
# Read the manual for more InnoDB related options. There are many!
innodb_data_home_dir = /home/adityadees/mysql/
innodb_log_group_home_dir = /home/adityadees/mysql/
innodb_data_file_path = ibdata1:10M:autoextend
...


Simpan perubahan file tersebut.


Selanjutnya buka program Terminal dan ubah ownership direktori baru database MySQL kita (dalam hal ini /home/adityadees/mysql), agar bisa diakses oleh daemon server MySQL, sekaligus kita copy-kan isi direktori /var/lib/mysql ke direktori baru kita dengan perintah:

adityadees@localhost:~$ sudo cp -R /var/lib/mysql/* /home/adityadees/mysql/
adityadees@localhost:~$ sudo chown -R mysql /home/adityadees/mysql



Ubah setting AppArmor



Distro GNU/Linux populer biasanya menggunakan AppArmor, sebuah modul sistem keamanan kernel Linux yang salah satu fungsinya adalah membatasi aplikasi-aplikasi tertentu di lingkungan GNU/Linux, agar hanya bisa mengakses berkas atau direktori tertentu. Untuk lebih jelasnya mengenai AppArmor bisa kita baca di Wiki AppArmor. Agar daemon server MySQL bisa mengakses direktori database baru yang sudah kita ubah di file my.cnf, kita harus mengubah konfigurasi AppArmor MySQL dengan memodifikasi file /etc/apparmor.d/local/usr.sbin.mysqld. Tambahkan baris berikut pada berkas tersebut:

# Site-specific additions and overrides for usr.sbin.mysqld.
# For more details, please see /etc/apparmor.d/local/README.
/home/adityadees/mysql/* rw


Simpan perubahan berkas tersebut kemudian jalan perintah berikut pada Terminal:
adityadees@localhost:~$ sudo /etc/init.d/apparmor reload


Restart server MySQL



Selanjutnya adalah me-restart server MySQL kita dengan perintah:

adityadees@localhost:~$ sudo /etc/init.d/mysql restart


Apabila semua berjalan lancar, maka kita telah berhasil memindahkan direktori database MySQL kita ke lokasi yang baru yang kita inginkan. Ada kemungkinan cara ini juga berhasil untuk database server MariaDB, tetapi saya belum mencobanya. Semoga bermanfaat dan selamat mencoba :).

Read More

04 April 2007

MySQL Improved alias MySQLI!

10:27 0

Sejak PHP 5 dirilis, muncul extension baru sebagai API ke RDBMS MySQL. Extension baru ini dinamakan MySQLI atau MySQL Improved. MySQLI memperkenalkan cara baru dalam berinteraksi dengan database server MySQL melalui PHP (dan konon lebih cepat dan lebih secure, walaupun gw sendiri belum pernah melakukan benchmark).



Yang paling keren menurut gw adalah model OOP baru dari MySQLI ini. Jadi di MySQLI kita bisa menggunakan 2 style coding, OOP ataupun prosedural. Model OOP-nya asyyiik banget dan lengkap.



Untuk nginstall extension MySQLI di Linux cukup gampang, cari aja paket-paket binary yang udah disediain ma distro masing-masing atau kalo kita biasa compile sendiri maka kita harus nambahin flag :



--with-mysqli=shared,/usr/local/mysql/bin/mysql-config



pada command configure kita


Kalo di Windows lebih gampang lagi, cukup tambahin baris :



extension=php_mysqli.dll



pada deretan module-module extension yang laennya di file php.ini. Trus restart deh Web Server-nya.



Langsung aja kita liat contoh implementasi extension MySQLI di source code PHP kita, begini nih caranye :






<?php
 
// buat constant
define('DB_HOST', 'localhost');
define('DB_USER', 'adityadees');
define('DB_PASS', 'adityadeespass');
define('DB_NAME', 'adityadeesdb');
define('DB_PORT', '3306');
 
// cek dulu apa extensionnya dah aktif pa belom?
if (!extension_loaded('mysqli')) {

echo 'Extension MySQLI belum terinstall dengan benar. check php.ini';
exit();
}
 
// buat objek mysqli
$mysqli_obj = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME, DB_PORT);

 
/* cek apakah koneksi berhasil dilakukan */
if (mysqli_connect_errno()) {
echo 'Koneksi gagal dilakukan dengan alasan : '.mysqli_connect_error();
exit();
} else {

echo 'Koneksi berhasil dilakukan<br />'."\n";
echo 'Versi Server MySQL : '.$mysqli_obj->server_info."<br />\n";

}
 
 
/* tutup koneksi ke db server */
$mysqli_obj->close();
?>







Ya ampuunn, ternyata gampang bener yah!! Weiittsss nanti dulu, itu baru koneksi-nya aja gimana untuk ngirim query ke database server-nya? ini sedikit contoh query SELECT yang menghasilkan resultset (atau recordset, whatever lahh) :






<?php
 
// include file source code koneksi database sebelumnya
// yang misalnya udah kita kasih nama 'mysqli.inc.php';
require 'mysqli.inc.php';
 
// untuk melakukan query kita menggunakan
// metode 'query' milik kelas mysqli

// hasil dari pemanggilan metode ini nantinya akan
// menghasilkan sebuah objek baru milik kelas mysqli_result
$result_obj = $mysqli->query("SELECT nama FROM tabel_adityadees");
 
// cek apakah query berhasil dilakukan
if ($result_obj) {

// gunakan properti publik 'num_rows' milik kelas mysqli_result
// untuk mengetahui jumlah baris hasil query
echo 'Ditemukan '.$result_obj->num_rows.' baris data<br /><br />';

 
echo 'Data-data yang ditemukan adalah sbb : <br />';
 
// gunakan metode 'fetch_row' untuk mengambil data baris demi baris dari resultset
while ($data = $result_obj->fetch_row()) {

echo $data[0].'<br />'."\n";
}
 
// bebaskan memory resultset

$result_obj->close();
}
 
$mysqli_obj->close();
?>









Lohh?? Cuman segitu doank toh MySQLI? Tau gitu mah gw mendingan pake extension MySQL biasa aja dechh (cappeee dehh!!). Ya Enggak Lah!!! ada beberapa fitur baru yang menarik di MySQLI selaen koneksi dan query sederhana, misalnya meng-execute query SQL secara multiple dengan langsung dalam satu statement (bukan dengan pemanggilan metode 'query' berulang-ulang). Coba liat contoh berikut ini deh :






<?php
 
// include file source code koneksi database sebelumnya
// yang misalnya udah kita kasih nama 'mysqli.inc.php';
require 'mysqli.inc.php';
 
// setiap query SQL kita pisahkan dengan semi-colon atawa titik koma
$queries = "SELECT gmd FROM tabel_gmd;";

$queries .= "SELECT nama FROM tabel_adityadees;";
$queries .= "SELECT judul FROM tabel_biblio";
 
// gunakan metode 'multi_query'
// untuk meng-execute string query SQL multiple secara simultan
$multi_query_obj = $mysqli_obj->multi_query($queries);

 
/* execute multi query */
if ($multi_query_obj) {
// loop masing-masing result-nya
while (true) {

// ambil result set multiple query dengan metode 'store_result'
if ($result = $mysqli_obj->store_result()) {
while ($row = $result->fetch_row()) {

echo $row[0]."<br />\n";
}
 
// bebasin memory resultset
$result->close();
}

 
// apakah masih ada resultset lagi?
// kalau udah abis kita stop loop-nya
if (!$mysqli_obj->more_results()) {
break;
} else {

// kita buat pemisah antar resultset dengan garis horizontal HTML <hr>
echo "<hr>\n";
}
}
}
 
/* tutup koneksi ke server */

$mysqli_obj->close();
?>






Nah itu dia sekilas penggunaan extension MySQLI di PHP, masih banyak fitur lain yang saya ga bisa jelasin satu persatu di sini (takutnya blog ini malah isinya MySQLI melulu). Buat programmer PHP yang demen pake model OOP, MySQLI cocok banget untuk digunain sebagai bagian dari kode-kode mereka. SELAMAT MENCOBA!!

Read More

https://payclick.com/

Contact us for advertising.