Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
MANAJEMEN DATABASE 2.1. ARSITEKTUR CLIENT/SERVER MS SQL Server adalah salah satu jenis database relasional yang mendukung aplikasi dengan arsitektur client/server (two tier) yang mana proses sebagian proses dilakukan oleh server dan sebagian lagi dilakukan oleh aplikasi sehingga dapat mengurangi lalulintas jaringan karena MS SQL Server hanya memberikan data yang diperlukan oleh client saja. 2.2. DATABASE 2.2.1. Membuat Database Database yang akan dibuat adalah aplikasi inventory, karena pada database ini sudah mencakup pekerjaan-pekerjaan dalam system database yang diaplikasikan sehari-hari. Untuk membuat database inventory ikuti langkah-langkah di bawah ini: 1. Jalankan SQL Analyzer terlebih dahulu. 2. Ketikkan baris perintah di bawah ini: CREATE DATABASE Inventory ON PRIMARY ( NAME = Inv1, FILENAME = 'c:\LatSqlServer7\Inventdat1.mdf', SIZE = 10MB, MAXSIZE = 20, FILEGROWTH = 2), ( NAME = Inv2, FILENAME = 'c:\LatSqlServer7\Inventdat2.ndf', SIZE = 10MB, MAXSIZE = 20, FILEGROWTH = 2) LOG ON ( NAME = InvLog, FILENAME = 'c:\LatSqlServer7\Inventlog.ldf', SIZE = 5MB, MAXSIZE = 10, FILEGROWTH = 1) 3. Blok semua baris perintah di atas lalu tekan tombol F5 (atau klik icon Execute Query) untuk menjalankan baris perintah di atas. 4. Klik icon Save untuk menyimpan SQL. Simpanlah SQL setiap kali anda melakukan perubahan atau penambahan SQL! 5. Tunggu sampai selesai sehingga pada panel Resuts ditampilkan: The CREATE DATABASE process is allocating 10.00 MB on disk 'Inv1'. The CREATE DATABASE process is allocating 10.00 MB on disk 'Inv2'. The CREATE DATABASE process is allocating 10.00 MB on disk 'InvLog'. 1 | Basisdata Tingkat Lanjut/[email protected] Setelah langkah ke 5 di atas selesai maka sekarang anda telah berhasil membuat database inventory. Untuk mengaktifkan database inventory (perhatikan gambar-1.5) adalah dengan mengikuti langkahlangkah di bawah ini: 1. Klik drop down database dan pilih <Refresh> untuk menampilkan nama database yang baru dibuat. 2. Klik drop down database dan pilih Iventory untuk mengaktifkan database Inventory. Selain dengan pada Query Analyzer, anda juga dapat membuat database pada Enterprise Manager dengan mengikuti langkah-langkah di bawah ini: 1. Jalankan Enterprise Manager sehingga tampil lingkungan Enterprise Manager seperti gambar-1.6. Pada tampilan ini anda dapat melihat database inventory yang telah anda buat dengan Query Analyzer: a. Klik kanan mouse pada icon Inventory. b. Pilih Properties 2. Klik kanan mouse pada icon Database dan pilih New Database. 3. Ketikkan nama database, sebagai latihan ketikkan: Coba Enterprise Manager secara otomatis membuat file database Coba_data (Coba_data.MDF) dan file log Coba_log (Coba_log.LDF). Kedua file ini ditempatkan pada lokasi (lokasi ini dapat anda ganti sesuai dengan lokasi yang diinginkan) C:\MSSQL7\data. Gantilah nama file Coba_data dengan nama Coba_dat1 sebagai file data utama (Coba_Data1_Data.MDF). Selanjutnya tentukan spesifikasi file dengan mengikuti langkah-langkah di bawah ini: a. Klik kolom Initial Size (MB) dan ketikkan 10 b. Klik radiobutton In Megabytes dalam kotak File Growth dan ketikan 2. c. Klik radiobutton Restrict filegrowth dalam kotak Maximum file size & ketikan 20. 4. Membuat file secondary: a. Klik baris kedua dan ketikkan Coba_Data2. b. Klik kolom Initial Size (MB) dan ketikkan 10. c. Klik kolom File Group dan ketikkan SECONDARY. d. Klik radiobutton In Megabytes dalam kotak File Growth dan ketikkan 2. e. Klik radiobutton Restrict filegrowth dalam kotak Maximum file size & ketikan 20. 5. File Log: a. Klik tab Transaction Log. b. Klik kolom Initial Size (MB) dan ketikkan 5. Kapasitas dari file log ini 25% dari total filesize keseluruhan database. c. Klik radiobutton In Megabytes dalam kotak File Growth dan ketikan 1. d. Klik radiobutton Restrict filegrowth dalam kotak Maximum file size & ketikan 20. 2 | Basisdata Tingkat Lanjut/[email protected] Gambar-1.7. Properties Database Keterangan: Database Inventory yang dibuat di atas terdiri dari 2 buah file data dan 1 file log; 2 buah file data yaitu 1 file utama yaitu Inventdat1.mdf dan 1 file secondary (opsional) yaitu Inventdat2.ndf serta 1 file log (menampung aktivitas MS SQL) yaitu Inventlog.ldf CREATE DATABASE Inventory adalah untuk membuat nama logika database yaitu Inventory. ON untuk mengarahkan bahwa database yang ke disk NAME nama logika file PRIMARY untuk menentukan nama file utama dengan perluasan .mdf FILENAME nama fisik file dan lokasi fisik file SIZE kapasitas file (nilai awal) dalam ukuran MB MAXSIZE maksimum kapasitas file dalam ukuran MB FILEGROWTH petambahan file dalam ukuran MB atau persentase dari total keseluruhan kapasitas file data. LOG ON untuk membentuk file log. 2.2.2. Menghapus Database Sebelum anda menghapus database, database yang akan dihapus tidak boleh dalam keadaan aktif. Untuk menghapus database coba pada Query Analyzer dengan mengikuti langkah-langkah di bawah ini: 1. Ketikkan perintah: drop database coba. 2. Blok baris perintah drop database coba. 3. Tekan tombol F5. Untuk menghapus database coba pada Enterprise Manager dengan mengikuti langkah-langkah di bawah ini: 3 | Basisdata Tingkat Lanjut/[email protected] 1. Jalankan Enterprise Manager sehingga tampilan seperti gambar-1.6. 2. Klik kanan mouse pada icon Coba dan pilih Delete. 2.3. TABEL Tabel hampir sama dengan file database pada xBase seperti customber.dbf yang dibentuk dari beberapa field/kolom. 2.3.1. Batasan Batasan (constraint) digunakan untuk menjaga integritas dari database melalui penyaringan informasi yang dimasukkan ke dalam kolom tabel. Batasan memiliki prioritas utama di atas trigger, rule, dan default. →Sebuah kolom harus diisi data (tidak boleh null). →Untuk menguji data yang dimasukkan ke dalam suatu kolom. →Isi suatu kolom tidak boleh sama (unik). →Kunci Indeks suatu table, harus diisi data (not null) dan unique. →Kunci indeks pada tabel lain yang direlasikan ke suatu table. Suatu table yang mempunyai foreign key tidak dapat dihapus (drop) sebelum tabel lain yang direlasikan dihapus. Sebagai contoh untuk untuk menghapus tabel t_barang, anda harus menghapus tabel t_beli_detil dan t_jual_detil terlebih dahulu. 2.3.2. Membuat Tabel NOT NULL CHECK UNIQUE PIRMARY KEY FOREIGN KEY Tabel-tabel yang diperlukan dalam aplikasi harus dibuat terlebih dahulu dan disimpan dalam satu file database. Adapun tabel-tabel yang digunakan dalam contoh aplikasi inventory adalah seperti di bawah ini: Tabel: t_customer No Nama Kolom 1 ct_kode 2 ct_nama 3 ct_alamat1 4 ct_alamat2 5 ct_alamat3 6 ct_telepon 7 ct_fax 8 ct_email Tipe Char Char Char Char Char Char Char Char Panjang 5 30 40 40 40 30 30 30 Keterangan Kode customer Nama customer Alamat Alamat Alamat Telepon Fax Emaial Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_customer ( ct_kode char(5) NOT NULL, ct_nama char(30), ct_alamat1 char(40), ct_alamat2 char(40), 4 | Basisdata Tingkat Lanjut/[email protected] ) ct_alamat3 char(40), ct_telepon char(30), ct_fax char(30), ct_email char(30) Tabel t_supplier No Nama Kolom 1 sp_kode 2 sp_nama 3 sp_alamat1 4 sp_alamat2 5 sp_alamat3 6 sp_telepon 7 sp_fax 8 sp_email Tipe Char Char Char Char Char Char Char Char Panjang 5 30 40 40 40 30 30 30 Keterangan Kode supplier Nama supplier Alamat Alamat Alamat Telepon Fax Emaial Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_supplier ( sp_kode char(5) NOT NULL, sp_nama char(30), sp_alamat1 char(40), sp_alamat2 char(40), sp_alamat3 char(40), sp_telepon char(30), sp_fax char(30), sp_email char(30) ) Tabel t_barang No Nama Kolom Tipe 1 br_kode Char 2 br_nama Char 3 br_satuan Char 4 Br_harga Numeric 5 br_stock_lalu Numeric 6 br_stock_skrg Numeric 7 br_min_stock Numeric Panjang 5 35 5 7 12,2 12,2 12,2 Keterangan Kode barang Nama barang Harga satuan Stock sekarang Minimum stock Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_barang ( br_kode char(5) NOT NULL, br_nama char(35), br_satuan char(5), br_harga numeric(7), br_stock_lalu numeric(12,2), 5 | Basisdata Tingkat Lanjut/[email protected] ) br_stock_skrg numeric(12,2), br_min_stock numeric(4) Tabel t_beli No Nama Kolom 1 bl_no 2 bl_no 3 sp_kode Tipe Panjang Char 5 Datetime Char 5 Keterangan No Faktur Tanggal Kode supplier Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_beli ( bl_no char(5) NOT NULL, bl_tgl datetime, sp_kode char(5) ) Tabel t_beli_Detil No Nama Kolom 1 bl_no 2 br_kode 3 bd_jumlah 4 bd_harga Tipe Char Char Date Numeric Panjang 5 5 5 Keterangan No faktur Kode barang Jumlah Harga Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_beli_detil ( bl_no char(5) NOT NULL, br_kode char(5) NOT NULL, bd_jumlah numeric(5), bd_harga numeric(5) ) Tabel t_jual No Nama Kolom 1 jl_no 2 jl_tgl 3 ct_kode Tipe Panjang Char 5 Datetime Char 5 Keterangan No faktur Tgl penjualan Kode customer Ketikkan perintah di bawah ini dan blok lalu tekan tombol F5 untuk menjalankannya: CREATE TABLE t_jual ( jl_no char(5) NOT NULL, jl_tgl datetime, ct_kode char(5) ) 6 | Basisdata Tingkat Lanjut/[email protected] Tabel t_jual_detil No Nama Kolom 1 jl_no 2 br_kode 3 jd_jumlah 4 jd_harga Tipe Char Char Numeric Numeric Panjang 5 5 5 5 Keterangan No faktur Kode barang Jumlah Harga CREATE TABLE t_jual_detil ( jl_no char(5) NOT NULL, br_kode char(5) NOT NULL, jd_jumlah numeric(5), jd_harga numeric(5) ) 2.3.3. Mengubah Tabel Tabel-tabel yang telah dibuat, kemungkinan terdapat kekurangan-kekurangan atau ada yang harus diganti. Berikut ini beberapa contoh untuk mengubah sebuah table. -- Menghapus kolom ct_email pada tabel t_customer Alter table t_customer drop column ct_email -- Menambah kolom ct_email pada tabel t_customer Alter table t_customer add ct_email char(30) -- Mengubah panjang kolom ct_email pada tabel t_customer Alter table t_customer Alter column ct_email char(35) 2.3.4. Mehapus Tabel Tabel yang telah dibuat dapat anda hapus (drop). Namum sebelum table dihapus anda harus mengetahui relasi antara tabel yang akan dihapus bilamana table yang akan dihapus tersebut direferensikan (mempunyai relasi atau foreign key) ke table lain. Sebagai contoh untuk menghapus tabel t_barang, anda harus menghapus table t_beli_detil dan t_jual_detil terlebih dahulu. DROP t_beli_detil GO DROP t_jual_detil GO DROP t_barang Perintah GO pada baris perintah di atas digunakan untuk membatas baris perintah, sehingga apabila baris perintah di atas diblok lalu tekan tombol F5, pekerjaan ini sama juga dengan menjalankannya perintah baris pertama, ketiga dan ke lima. Perintah GO penting apabila dalam suatu file query (sql) dijalankan sekaligus. 7 | Basisdata Tingkat Lanjut/[email protected] 2.4. Constraint 2.4.1. Membuat Indeks Indeks (primary key) adalah salah batasan (constraint) digunakan untuk menghindari kerangkapan data yang dimasukkan ke dalam suatu table. Setiap table harus mempunyai indeks. Kolom yang akan dijadikan sebagai indeks jangan bertipe datetime karena data datetime selalu berbeda (tidak unik). Pembuatan indeks berarti anda melakukan perubahan table dan membuat suatu constraint. Sebagai contoh buatlah indeks table t_customer berdasarkan ct_kode dengan nama indeks xPKt_customer ALTER TABLE t_customer ADD CONSTRAINT XPKt_customer PRIMARY KEY (ct_kode) Blok baris perintah di atas lalu tekan tombol F5. Selengkapnya perintah untuk membuat indeks table-table yang lain adalah sebagai berikut: ALTER TABLE t_supplier ADD CONSTRAINT XPKt_supplier PRIMARY KEY (sp_kode) ALTER TABLE t_barang ADD CONSTRAINT XPKt_barang PRIMARY KEY (br_kode) ALTER TABLE t_beli ADD CONSTRAINT XPKt_beli ALTER TABLE t_beli_detil ADD CONSTRAINT XPKt_beli_detil ALTER TABLE t_jual ADD CONSTRAINT XPKt_jual ALTER TABLE t_jual_detil ADD CONSTRAINT XPKt_jual_detil PRIMARY KEY (bl_no) PRIMARY KEY (bl_no, br_kode) PRIMARY KEY (jl_no) PRIMARY KEY (jl_no, br_kode) 2.4.2. Membuat Relasi Relasi (foreign key) adalah menghubungkan suatu key pada suatu table ke table aktif untuk mencegah penghapusan record pada table referensi yang telah digunakan pada table lain. Misalkan kode supplier 00001 pada table t_supplier telah digunakan pada table t_beli. Apabila kode supplier 00001 dihapus pada table t_ supplier, maka akan tampil pesan error bahwa data ini tidak boleh dihapus. Sebagai contoh buatlah relasi table antara table t_ supplier dengan table t_beli berdasarkan sp_kode dengan nama indeks xFKt_supplier. 8 | Basisdata Tingkat Lanjut/[email protected] ALTER TABLE t_beli ADD CONSTRAINT xFKt_supplier FOREIGN KEY (sp_kode) REFERENCES t_supplier Blok baris perintah di atas lalu tekan tombol F5. Selengkapnya perintah untuk membuat foreign key table-table yang lain adalah sebagai berikut: ALTER TABLE t_beli_detil ADD CONSTRAINT xFKt_beli FOREIGN KEY (bl_no) REFERENCES t_beli ALTER TABLE t_beli_detil ADD CONSTRAINT xFKt_beli_barang FOREIGN KEY (br_kode) REFERENCES t_barang ALTER TABLE t_jual ADD CONSTRAINT xFKt_customer FOREIGN KEY (ct_kode) REFERENCES t_customer ALTER TABLE t_jual_detil ADD CONSTRAINT xFKt_jual FOREIGN KEY (jl_no) REFERENCES t_jual ALTER TABLE t_jual_detil ADD CONSTRAINT xFKt_jual_barang FOREIGN KEY (br_kode) REFERENCES t_barang 2.4.3. Check Check adalah batasan (constraint) untuk memeriksa data yang dimasukkan ke dalam suatu kolom dengan menguji suatu kondisi. Misalkan sebelum detil pembelian disimpan, periksa terlebih jumlah barang, jika jumlah barang kecil atau sama dengan nol, maka batalkan penyimpanan data. Chek sebaiknya ditempatkan pada aplikasi karena jika usernya banyak maka akan membebankan kepada server. Untuk membuat constraint check (pemberian nama check harus unik dalam suatu database.) pada table t_barang adalah dengan perintah di bawah ini: Alter table t_beli_detil add constraint Ck_JumBeli check ( bd_jumlah > 0) Alter table t_jual_detil add constraint Ck_JumJual check ( jd_jumlah > 0) 2.4.4. Default Default adalah batasan (constraint) untuk memberikan nilai default sebuah kolom apabila kolom tersebut tidak diisi. Nilai default 0 (nol) diberikan untuk kolom br_stock_lalu dan br_stock_skrg pada table t_barang. Apabila anda tidak memberikan nilai default nol pada 2 buah kolom ini, maka kolom ini akan selalu berisi null karena null + angka tidak tidak terdefinisi. 9 | Basisdata Tingkat Lanjut/[email protected] Selain nilai default pada table t_barang, anda juga dapat memberikan nilai default untuk kolom tanggal pada table t_beli dan t_jual. Untuk membuat constraint default (pemberian nama default harus unik dalam suatu database) pada pada ketiga table di atas adalah dengan perintah di bawah ini: Alter table t_barang add constraint Df_stock_lalu default 0 for br_stock_lalu Alter table t_barang add constraint Df_stock_skrg default 0 for br_stock_skrg Alter table t_beli add constraint Df_beli_tgl default getdate() for bl_tgl Alter table t_jual add constraint Df_jual_tgl default getdate() for jl_tgl 2.5. Rule Rule adalah batasan (constraint) sama dengan chek. Perbedaannya adalah check hanya berlaku untuk sebuah table sendangkan rule dapat digunakan untuk table-table yang memerlukanya. Sebagai contoh kita akan membuat rule untuk memeriksa jumlah barang pada pembelian dan penjualan harus > 0. Apabila anda menggunakan rule, maka hapuslah check yang sudah ada terlebih dahulu dengan perintah di bawah ini: Alter table t_beli_detil drop constraint Ck_JumBeli Alter table t_jual_detil drop constraint Ck_JumJual Untuk membuat constraint rule (pemberian nama rule harus unik dalam suatu database.) adalah dengan mengetikkan baris perintah di bawah ini: create rule rl_jumlah as @jumlah > 0 Setelah rule dibuat, maka pekerjaan selanjutnya adalah menghubungkan rule tersebut ke kolom yang menggunakannya yaitu ke kolom bd_jumlah dan jd_jumlah seperti di bawah ini: --bind rule rl_jumlah ke kolom bd_jumlah pada tabel t_beli_detil sp_bindrule 'rl_jumlah','t_beli_detil.bd_jumlah' --bind rule rl_jumlah ke kolom jd_jumlah pada tabel t_jual_detil sp_bindrule 'rl_jumlah','t_jual_detil.jd_jumlah' 2.6. Melihat Informasi Tabel Setelah anda membuat sebuah table, maka anda dapat melihat informasi yang berhungan dengan table tersebut seperti nama table, nama kolom, tipe kolom, indeks, constraint dan lain sebagainya. Untuk melihat informasi suatu table adalah dengan menjalankan sp_help yang diikuti dengan nama table yang diinginkan. Sebagai contoh untuk melihat informasi table t_customer ketikkan perintah: sp_help t_customer blok baris perintah ini lalu tekan tombol F5. 10 | Basisdata Tingkat Lanjut/[email protected] 2.7. Memasukkan Data Memasukkan data ke dalam table sebenarnya adalah pekerjaan aplikasi. Meskipun demikian pemasukan data melalui Query Analyzer adalah untuk menguji suatu table apakah sudah berfungsi seperti apa yang diharapkan. Perintah untuk memasukkan data ke dalam table adalah dengan perintah insert. Sebagai contoh untuk memasukkan data barang ke dalam table t_barang adalah sebagai berikut: INSERT t_barang VALUES ('00001','Disket Verbatin','Box',0,0,0) Perintah di atas untuk memasukkan data ke table t_barang yang mana data yang dimasukkan sesuai dengan urutan kolom pada table. Apabila urutan data yang dimasukkan tidak sesuai dengan urutan kolom atau tidak sama dengan jumlah kolom, maka anda harus menyebutkan nama kolom seperti contoh di bawah ini: INSERT t_barang (br_nama,br_satuan,br_kode,) VALUES ('Disket Verbatin','Box', '00001') Untuk melihat hasil dari perintah di atas ketikkan perintah di bawah ini: SELECT * FROM t_barang Maka hasil dari perintah di atas adalah sebagai berikut: br_kode br_nama br_satuan br_stock_lalu br_stock_skrg br_min_stock ------- ----------------------------------- --------- -------------------------------------00001 Disket Verbatin Box .00 .00 NULL Hasil dari perintah INSERT pertama berbeda dengan hasil INSERT kedua. Pada INSERT pertama semua kolom bertipe numeric (br_stock_lalu, br_stock_skrg dan br_min_stock) bernilai 0 (nol) sedangkan pada INSERT kedua hanya kolom br_stock_lalu dan br_stock_skrg yang bernilai 0 (nol) hal ini diisi dengan default df_stock_lalu, dan df_stock_skrg. Kolom br_min_stock bernilai NULL karena tidak diisi data. 2.8. Mengubah Data Anda dapat mengubah isi dari suatu kolom baik secara keseluruhan maupun baris tertentu saja dengan perintah update. Sebagai contoh anda dapat mengubah semua baris tabel t_barang pada kolom br_stock dengan nol dengan perintah update di bawah ini: update t_barang set br_stock_lalu = 0 Contoh lain untuk mengubah kode barang 00002 pada table t_beli_detil dengan kode barang 00003: update t_beli_detil set br_kode = '00003' where br_kode = '00002' 2.9. Menghapus Data Cara menghapus data sama halnya dengan mengubah data dengan perintah delete. Perlu diperhatikan menghapus isi suatu table yang direferensikan ke table lain, anda harus menghapus baris table yang berisi kolom referensi (foreign key atau table anak) terlebih dahulu, kemudian menghapus 11 | Basisdata Tingkat Lanjut/[email protected] baris table yang mereferensikan (primary key atau table induk) seperti untuk menghapus kode barang 00001 pada table t_barang anda harus menghapus semua baris pada table t_beli_detil dan t_jual_detil yang berisi kode barang 00001 terlebih dahulu. Contoh lain adalah untuk menghapus satu transaksi (satu faktur) pembelian, anda harus menghapus detil penjual terlebih dahulu kemudian dilanjutkan menghapus master detil penjualan seperti di bawah ini: --menghapus detil penjualan dengan no faktur Fak01 delete t_jual_detil where jl_no = 'Fak01' --menghapus semua isi tabel penjualan delete t_jual_detil Contoh lain untuk menghapus suatu kode barang pada detil penjualan dengan kode barang 00001 dan no faktur Fak01: delete t_jual_detil where jl_no = 'Fak01' and br_kode = ‘00001’ 2.10. Menampilkan Data Pekerjaan yang banyak dilakukan adalah menampilkan data untuk mendapatkan sutau informasi dari tabel-tabel yang ada. 2.10.1. Select Pada beberapa contoh yang telah dibahas sebelum telah diperkenalkan perintah select untuk menampilkan data (isi tabel). Data yang akan ditampilkan tergantung dari kebutuhan dari user. Menampilkan Seluruh Data --Tampilkan semua isi tabel customer select * from t_customer --Tampilkan semua isi tabel pembelian dan supplier select * from t_beli,t_supplier Menampilkan Data Tertentu --Tampilkan nama customer yang di awali dengan A select * from t_customer where ct_nama like 'A%' --Tampilkan nama customer yang di awali dengan B select * from t_customer where ct_nama like 'B%' --Tampilkan nama customer yang huruf awalnya 'E' atau 'F' select * from t_customer where left(ct_nama,1) in ('E','F') --Tampilkan nama customer yang di awali dengan A,B atau C select * from t_customer where ct_nama like '[A-C]%' --Tampilkan nama customer yang tidak di awali dengan A,B atau select * from t_customer where ct_nama not like '[A-C]%' --atau 12 | Basisdata Tingkat Lanjut/[email protected] select * from t_customer where ct_nama like '[^A-C]%' --Tampilkan nama customer yang di awali dengan AB tepat 4 karakter --where line 'AB dan underscore 2 kali maka akan tampil ABCD tetapi apabila --ditambah uderscore 3 kali maka tidak akan tampil select * from t_customer where ct_nama like 'AB__' --Tampil fax customer sama degan null select * from t_customer where ct_fax is null --Tampil fax customer yang tidak null select * from t_customer where ct_fax is not null --Tampilkan barang dan urutkan (oder) berdasarkan nama dari A ke Z select * from t_barang order by br_nama --Tampilkan barang dan urutkan (oder) berdasarkan nama dari Z ke A select * from t_barang order by br_nama DESC --Tampilkan 3 record pertama dari table barang Select top 3 * from t_barang --Tampilkan stock barang terbanyak Select top 1 * from t_barang order by br_stock_skrg DESC --atau Select max( br_stock_skrg ) from t_barang --atau dengan label JUMLAH STOCK Select max( br_stock_skrg ) as 'JUMLAH STOCK' from t_barang --Tampilkan Kode Barang, Nama Barang dan Jumlah Stock select br_kode,br_nama,br_stock_skrg from t_barang --Tampilkan semua barang yang jumlah stocknya lebih besar dari 10 select * from t_barang where br_stock_skrg > 10 --Tampilkan kode dan nama barang yang huruf awal nama lebih besar atau sama dengan N select br_kode,br_nama from t_barang where left(br_nama,1) >= 'N' --tampilkan satu kali (distinct) kode supplier dalam tabel t_beli select distinct(sp_kode)from t_beli --tampilkan dalam periode tertentu select distinct(sp_kode)from t_beli where bl_tgl >= '10/01/2001' and bl_tgl <= '10/31/2001' --atau dengan between select distinct(sp_kode)from t_beli where bl_tgl between '10/01/2001' and '10/31/2001' 2.10.2. Pengelompokan 13 | Basisdata Tingkat Lanjut/[email protected] Seringkali informasi yang diinginkan dikelompok berdasarkan kolom-kolom terntu seperti untuk mengetahui frekuensi transaksi supplier dan customer per bulan. Untuk pengelompokan data dengan parameter GROUP BY dan HAVING sebagai parameter kondisi pengelompokan data. --Tampilkan Supplier dari Pembelian, -->error karena pada parameter group by tidak --diikutsertakan semua kolom yang ditampilkan select sp_kode,bl_no from t_beli group by sp_kode --penulisan yang benar adalah select sp_kode,bl_no from t_beli group by sp_kode,bl_no --Tampilkan berapa kali suatu Supplier malakukan transaksi select sp_kode,count(sp_kode)as frekuensi from t_beli group by sp_kode --Group by dan having (having = where) --akan error karena group by berlawanan degnan having select sp_kode,count(sp_kode) as frekuensi from t_beli group by sp_kode where sp_kode = '00001' --seharusnya select sp_kode,count(sp_kode) as frekuensi from t_beli group by sp_kode having sp_kode = '00001' 2.10.3. Penggabungan Tabel Inner Joint Adalah operator untuk menggabungkan dua buah table yang mempunyai nilai yang sama melihat dari 2 sisi, sisi kiri sama dengan sisi kanan. select t_barang.br_kode,br_nama,bd_jumlah,bd_harga,( bd_jumlah * bd_harga ) as 'JML HARGA' from t_barang inner join t_beli_detil on t_barang.br_kode = t_beli_detil.br_kode Penulisan t_barang.br_kode dimaksudkan untuk menentukan kode barang pada table mana yang akan ditampilkan karena terdapat dua buah kode barang yaitu pada table t_barang dan t_beli_detil. Anda dapat menampilkan salah satu dari kode barang ini. Anda dapat menggunakan alias untuk memperpendek penulisan nama table sehingga baris perintah di atas dapat ditulis seperti di bawah ini: select a.br_kode,br_nama,bd_jumlah,bd_harga, ( bd_jumlah * bd_harga ) as 'JML HARGA' from t_barang a inner join t_beli_detil b on a.br_kode = b.br_kode Penggunaan kata inner joint dapat anda ganti dengan operator sama dengan (=) sehingga baris perintah di atas dapat anda tulis seperti di bawah ini: select a.br_kode,br_nama,bd_jumlah,bd_harga,( bd_jumlah * bd_harga ) as 'JML HARGA' from t_barang a, t_beli_detil b where a.br_kode = b.br_kode 14 | Basisdata Tingkat Lanjut/[email protected] --Tampilkan data pembelian dengan kode supplier 00002 (joint 3 tabel) select a.sp_kode,b.br_kode,br_nama,bd_jumlah,bd_harga,( bd_jumlah *bd_harga) as 'JML HARGA' from t_beli a,t_beli_detil b,t_barang c where a.bl_no = b.bl_no and b.br_kode = c.br_kode and a.sp_kode = '00002' --Menampilkan jumlah transaksi yang dilakukan oleh supplier select a.sp_kode,sp_nama,sp_alamat1,count(a.sp_kode) as Frekunsi from t_beli a inner join t_supplier b on a.sp_kode = b.sp_kode group by a.sp_kode,sp_nama,sp_alamat1 Outer Joint Adalah operator untuk menggabungkan data dengan melihat satu sisi saja, kiri (left joint) atau kanan (right joint) saja. Left joint adalah operator untuk menampilkan semua data pada table pertama (left) meskipun pada table kedua (right) tidak dipenuhi kondisinya. Sebagai contoh ada tiga supplier dalam tabel t_supplier, pada transaksi pembeli hanya dua supplier melakukan transaksi. Apabila anda melakukan left joint t_supplier dengan table t_beli maka akan ditampilkan data semua supplier hanya saja satu supplier tidak ada transaksi. select a.sp_kode,bl_no from t_supplier a left outer join t_beli b on a.sp_kode = b.sp_kode --atau select a.sp_kode,bl_no from t_supplier a,t_beli b where a.sp_kode *= b.sp_kode Misalkan hasil dari perintah di atas adalah sebagai berikut: sp_kode bl_no ------- ----00001 Fak01 00001 Fak05 00002 Fak02 00002 Fak03 00002 Fak04 00003 NULL (6 row(s) affected) Apabila anda tidak melakukan tidak melakukan left joint seperti di bawah ini, maka hasilnya adalah 5 row(s) affected, karena kode supplier 00003 tidak ada pada table t_beli. select a.sp_kode,bl_no from t_supplier a,t_beli b where a.sp_kode = b.sp_kode sp_kode bl_no ------- ----15 | Basisdata Tingkat Lanjut/[email protected] 00001 00001 00002 00002 00002 Fak01 Fak05 Fak02 Fak03 Fak04 (5 row(s) affected) Right Joint Right joint adalah operator untuk menampilkan semua data pada table kedua (right) meskipun pada table pertama (left) tidak dipenuhi kondisinya. Right joint adalah kebalikan dari Left Joint. Full Joint Adalah operator untuk menggabungkan dua buah table dan menampilkan semua baris pada table pertama dan table kedua. select a.sp_kode,bl_no from t_supplier a full join t_beli b on a.sp_kode = b.sp_kode Cross Joint Adalah operator untuk mengalikan setiap baris table pertama dengan baris table kedua. Sebagai contoh table t_supplier berisi 3 baris dan table t_beli berisi 5 baris maka hasil dari cross joint akan menghasilkan 15 ( 3 x 5 ) baris. select a.sp_kode,bl_no from t_supplier a cross join t_beli b Union Adalah operator untuk untuk menggabungkan hasil select dari dua buah table atau lebih yang mempunyai isi kolom yang sama meskipun nama kolom berbeda ke dalam satu hasil. select * from t_supplier union select * from t_customer Nama-nama kolom dari hasil union di atas adalah sesuai dengan nama kolom pada table t_supplier. Tentunya akan memberikan informasi yang salah. Oleh karena itu anda dapat menyamakan antara kolom supplier dengan kolom customer; kolom sp_kode dan ct_kode dinamakan kolom KODE , kolom sp_nama dan ct_nama dinamakan kolom NAMA dan seterusnya seperti di bawah ini: select sp_kode as KODE, sp_nama as NAMA, sp_alamat1 as ALAMAT, sp_alamat2 as JALAN, sp_alamat3 as KOTA, sp_fax as FAX, sp_email as EMAIL from t_supplier union select ct_kode,ct_nama,ct_alamat1,ct_alamat2,ct_alamat3,ct_fax,ct_email from t_customer 2.10.4. Sub Query 16 | Basisdata Tingkat Lanjut/[email protected] Sub Query adalah sebuah query terdapat dalam suatu query (nested query). Suatu subquery harus di di awali dengan kurung buka dan di akhiri dengan kurung tutup yang menandakan bahwa subquery adalah sama dengan satu kolom. Dalam satu subquery hanya boleh mengembalikan 1 (satu) baris data, jika lebih dari 1 baris (row) maka akan terjadi error. --Tampilkan supplier yang telah telah melakukan transaksi dengan operator in select sp_kode,sp_nama from t_supplier where sp_kode in ( select sp_kode from t_beli ) --Tampilkan supplier yang telah telah melakukan transaksi dengan operator exists select sp_kode,sp_nama from t_supplier where exists ( select sp_kode from t_beli where t_supplier.sp_kode = t_beli.sp_kode ) --Untuk satu supplier select sp_kode,sp_nama from t_supplier where sp_kode in ( select sp_kode from t_beli where t_beli.sp_kode = '00001' ) --Tampilkan no faktur, kode barang, jumlah, harga dan nama barang dan jumlah harga --select a.bl_no,a.br_kode, ( select t_barang.br_nama from t_barang where t_barang.br_kode = a.br_kode ),a.bd_jumlah,a.bd_harga, (a.bd_jumlah*a.bd_harga) as 'JML HARGA' from t_beli_detil a group by a.bl_no,a.br_kode,a.bd_jumlah,a.bd_harga --Tampilkan no faktur, kode barang, nama supplier 15 karakter pertama, --jumlah, harga dan nama barang dan jumlah harga select a.bl_no,a.br_kode, ( select left(t_supplier.sp_nama,15) from t_supplier where t_supplier.sp_kode in (select t_beli.sp_kode from t_beli where t_beli.bl_no = a.bl_no ) ), ( select t_barang.br_nama from t_barang where t_barang.br_kode = a.br_kode ), a.bd_jumlah,a.bd_harga,(a.bd_jumlah * a.bd_harga) as 'JML HARGA' from t_beli_detil a group by a.bl_no,a.br_kode,a.bd_jumlah,a.bd_harga 17 | Basisdata Tingkat Lanjut/[email protected] 2.10.5. Iktisar Iktisar adalah laporan hasil ringkasan dari suatu transaksi data yang dapat menunjang dalam pengambilan suatu keputusan. Sebagai contoh anda dapat menjumlahkan harga satuan barang dan mencari harga ratanya dengan perintah select dan klausa compute sum untuk jumlah dan klausa compute avg untuk rata-rata. Untuk membuat iktisar harus diikutsertakan klausa order by (data diurutkan berdasarakan apa?) agar hasil ringkasan dikelompokkan. select br_kode,br_nama,br_harga from t_barang order by br_kode compute sum( br_harga ) compute avg( br_harga ) Contoh lain adalah untuk mencari berapa jumlah barang pada pembelian dan terdapat pada faktur mana saja barang tersebut? Iktisar ini dapat dicari dengan mengetikkan baris perintah di bawah ini. select bl_no,br_kode,bd_jumlah from t_beli_detil order by br_kode compute sum( bd_jumlah ) by br_kode compute sum( bd_jumlah ) 2.10.6. View View adalah sebuah table semu yang berisi query sehingga table view tidak dapat digunakan untuk menyimpan data. Dengan adanya table view maka anda dapat membatasi akses user terhadap suatu table. Sebagai contoh seorang user dengan level operator tidak boleh melihat harga satuan (pokok) suatu barang, maka anda dapat membuat table untuk menampilkan kolom-kolom tertentu saja. select br_kode,br_nama,br_stock_skrg from t_barang Perintah di atas akan menghasilkan kode, nama, dan stock barang. Agar anda tidak mengetikkan perintah tersebut setiap kali ingin menampilkan data tersebut di atas, anda dapat membuat view katakana nama view-nya dalah tv_barang1. create view tv_barang1 as select br_kode,br_nama,br_stock_skrg from t_barang Untuk menampilkan isi table view sama halnya dengan menampilkan isi table. Untuk menampilkan isi table view tv_barang1 adalah sebagai berikut: select * from tv_barang1 Apabila dalam sebuah table view terdapat rumus (calculation field) mis: (bd_jumlah * bd_harga ) maka rumus ini harus diberi label dengan as misalnya as nilai. Contoh lain adalah seperti melihat frekuensi transaksi suatu supplier seperti di bawah ini. 18 | Basisdata Tingkat Lanjut/[email protected] create view tv_supp_frek as select sp_kode,count(sp_kode)as frekuensi from t_beli group by sp_kode Anda dapat melihat informasi table untuk melihat apakah suatu table adalah table atau bukan dengan menjalankan store prosedure sp_tables. Apabila sutau table view tidak digunakan lagi, anda dapat menghapusnya seperti di bawah ini. drop view tv_supp_frek 2.11. Skrip Skrip (script) adalah bahasa pemrograman SQL berupa perintah-perintah yang digunakan untuk melakukan aktivitas dalam database. Perintah-perintah yang telah dibahas pada bagian sebelumnya adalah contoh dari skrip. Baris perintah yang dijalankan disebut dengan batch dan bila batch ini disimpan dengan suatu nama disebut stored procedure (sp). Skrip mempunyai tipe data yang bervariasi. Anda dapat mendefinisikan suatu variable dalam skrip yang dipakai pada skrip yang bersangkutan. Skrip berisi alur kontrol yang dibangun untuk pelaksanaan kondisi dari kode dan mengimplementasikan pengulangan. Bahasa pemrograman skrip ini mempunyai beberapa statemen yang sama dengan bahasa pemrograman tingkat tinggi lainnya. Dasar bahasa pemrograman ada 3 (tiga) yaitu: 1. Percabangan (if) 2. Pengulangan (while) 3. Variabel Ada bebera skrip dasar yang sering digunakan yang harus anda ketahui yaitu Use, Declare, Set, Select dan variable global yang diawali dengan tanda @@. Use Skrip use digunakan untuk menset database aktif. Pada bagian sebelumnya kita mengaktifkan database dengan mengklik drop down database. Contoh: use Inventory Declare Skrip declare digunakan mendeklarasikan variable yang mana nama variable diawali dengan tanda @ dan serta tentukan tipe datanya. Contoh: declare @kode_barang char(5), @Jumlah_transaksi numeric(12,2) Set Skrip set digunakan untuk memberikan nilai ke suatu variable. Contoh: 19 | Basisdata Tingkat Lanjut/[email protected] declare @kode_barang char(5), @nama_barang char(35), @Jumlah_transaksi numeric(12,2) set @kode_barang = '00001' set @nama_barang = ( select br_nama from t_barang where br_kode = @kode_barang ) set @Jumlah_transaksi = 25 --Trampilkan isi variable print @kode_barang print @nama_barang print @Jumlah_transaksi Select Skrip select fungsinya sama dengan set digunakan untuk memberikan nilai ke suatu variable. Perbedaanya adalah pada set pemberian nilai dari dalam tabel ke suatu variable menggunakan select, sedangkan pada select, select ditempatkan diawal atau pengganti set. Contoh: declare @kode_barang char(5), @nama_barang char(35), @Jumlah_transaksi numeric(12,2) select @kode_barang = '00001' select @nama_barang = br_nama from t_barang where br_kode = @kode_barang select @Jumlah_transaksi = 25 Variabel Global Variabel global disebut juga dengan system function adalah variable yang telah disediankan oleh MS SQL Server. Variabel global diawali dengan tanda @@. Isi dari variable global adalah berhubungan dengan system seperti koneksi aktif (@@connections), nama server (@@servername), versi MS SQL Server (@@version) dan lain sebagainya. Anda dapat melihat daftar variable global pada SQL Server Books Online dengan mengklik tab Index dan ketikkan @@. Contoh: print 'Koneksi aktif :'+ cast( @@connections as varchar(10) ) print 'Bahasa :'+ @@language print 'Maksimum Koneksi :'+ cast( @@max_connections as varchar(5) ) print 'Nama Server :'+ @@servername print 'Versi SQL Srver :'+ @@version Percabagan (If..Else…) If … Else adalah sebuah kontrol struktur pengambilan keputusan untuk melaksanakan satu atau lebih statemen pada suatu kondisi. Sintaks: IF <kondisi1> <statemen> {ELSE kondisi2 <statemen>} 20 | Basisdata Tingkat Lanjut/[email protected] Contoh: declare @Jumlah_transaksi numeric(12,2) select @Jumlah_transaksi = bd_jumlah from t_beli_detil where br_kode = '00001' and bl_no = 'Fak01' if @Jumlah_transaksi > 0 print @Jumlah_transaksi else print 'Jumlah barang harus lebih besar dari nol!' Pengulangan (While) Pengulangan adalah sebuah struktur kontrol yang berfungsi untuk melaksanakan perintah-perintah suatu blok statemen secara berulang-ulang selama kondisi berlogika benar. Contoh: declare @nomor int set @nomor = 0 while ( @nomor < 5 ) begin set @nomor = @nomor + 1 print @nomor end 2.11.1. Stored Procedure Kumpulan (batch) perintah yang disimpan ke dalam database dengan suatu nama disebut stored procedure (sp). Hampir semua kode Transact-SQL yang ditulis sebagai batch untuk membuat stored procedure. Contoh: create proc sp_pengulangan as declare @nomor int set @nomor = 0 while ( @nomor < 5 ) begin set @nomor = @nomor + 1 print @nomor end --menjalankan stored procedure exec sp_pengulangan --atau sp_pengulangan --stored procedure untuk menampilkan barang create proc sp_barang as 21 | Basisdata Tingkat Lanjut/[email protected] select * from t_barang --jalankan stored procedure sp_barang sp_barang --stored procedure untuk carid kode barang create proc sp_cariBarang @kode varchar(5) as select * from t_barang where br_kode = @kode --jalankan sp_cariBarang sp_cariBarang '00001' --Mengubah store procedure dengan alter lalu lakukan perubahan misalnya kesalahan --mengetikkan nama field alter proc sp_cariBarang @kode varchar(5) as select * from t_barang where br_kode = @kode --Memeriksa ada atau tidaknya data yang dicari dengan exist alter proc sp_cariBarang @kode varchar(5) as if exists (select br_kode from t_barang where br_kode = @kode ) --menghasilkan nilai true ( >= 1 ) select * from t_barang where br_kode = @kode else print 'Barang yang anda cari tidak ada...!' --Cari yang tidak ada, maka akan ditampilkan pesan sp_cariBarang '00000' --Store Procedure dengan lebih dari 1 parameter untuk input barangparameter --antara parameter dipisahkan dengan koma create proc sp_inputBarang @kode char(5),@Nama Varchar(30) ,@satuan char(15), @harga numeric,@minstock int as insert into t_barang (br_kode,br_nama,br_satuan,br_harga,br_min_stock) values (@kode,@Nama,@satuan,@harga,@minstock) --Jalan sp_inputBarang sp_inputBarang '00004','Keyboard','Buah',50000,10 22 | Basisdata Tingkat Lanjut/[email protected] --case cara 2 (search case) untuk lebih dari 1 nilai create proc sp_infoBarang as select br_kode,br_nama, case br_stock_skrg when > 10 then 'Masih ada' else 'Hampir habis' end from t_barang --sp di atas error seharusnya seeprti di bawah ini create proc sp_infoBarang as select br_kode,br_nama, case when br_stock_skrg > 10.00 then 'Masih ada' when br_stock_skrg is null then 'NULL ' else 'Hampir habis' end from t_barang --Jalankan sp_infoBarang sp_infoBarang 2.11.2. Pesan Error Setelah sebuah database selesai dibuat, maka untuk melakukan aktivitas pada database terebut bukan lagi pada lingkungan Query Analyzer akan tetapi pada aplikasi yang dibuat dengan bahasa pemrogran seperti PowerBuilder, Delphi, Visual Basic dan lain sebagainya. Pada contoh-contoh yang telah dibahas, anda telah menampilkan pesan error dengan perintah print. Perintah ini hanya akan menampilkan pesan pada lingkungan Query Analyzer dan tidak akan sampai ke aplikasi yang menggunakan database tersebut. MS SQL Server menyediakan function RAISERROR() untuk mengirimkan pesan ke aplikasi. MS SQL Server mengelompokkan pesan error menajdi dua level, yaitu level pertama adalah pesan error yang digunakan oleh user bernilai 1 s/d 18 (yang umum digunakan adalah 16) sedangkan level kedua adalah pesan error yang digunakan oleh system bernilai 19 s/d 25. Apabila level kedua bernilai antara 20 s/d 25, maka error yang terjadi adalah error fatal dan koneksi database harus diputus. Pada saat menyampaikan pesan error ke aplikasi, juga diikuti status dan biasanya bernilai 1. Contoh: alter proc sp_cariBarang @kode varchar(5) as if exists (select br_kode from t_barang where br_kode = @kode ) select * from t_barang where br_kode = @kode else raiserror( 'Barang yang anda cari tidak ada...!',16,1) 23 | Basisdata Tingkat Lanjut/[email protected] 2.11.3. Trigger Pada saat anda melakukan aktivitas seperti insert, update atau delete data pada suatu tabel, data tersebut tidak langsung disimpan kedalam database melainkan ditempatkan sementara dalam log. Perkerjaan ini dinamakan transaction (disingkat dengan tran). Apabila terjadi error pada saat aktivitas dilakukan maka aktivitas akan dibatalkan (rollback) sebaliknya data disimpan secara permanen (commit). Trigger adalah sejenis stored procedure yang dijalankan pada saat aktivitas insert, update dan delete dilakukan. Pada trigger anda dapat mencegah aktivitas insert, update atau delete yang dilakukan user. Pada bagian 2.4.2. (Membuat Relasi) anda dapat mencegah user untuk memasukkan kode barang ke tabel t_beli_detil, karena kode barang tersebut belum ada pada tabel t_barang atau sebaliknya user tidak boleh menghapus suatu kode barang dalam tabel t_barang karena telah digunakan dalam tabel lain. Perkerjaan ini juga dapat dilakukan dengan trigger, tetapi untuk relasi antar tabel lebih baik dan mudah dilakukan dengan relasi (foreign key). Trigger yang akan dibahas disini adalah trigger untuk tabel t_beli_detil dan t_jual_detil. Pada saat aktivitas dilakukan pada tabel t_beli_detil akan mengupdate stock barang (br_stock_skrg). Pada saat insert akan menambah stock barang, update akan mengurangi dan menambah stock barang dan pada saat delete akan mengurangi stock barang. Sendangkan pada aktivitas pada tabel t_jual_detil adalah kebalikan dari aktivitas tabel t_beli_detil. Dengan adanya trigger, maka aplikasi database yang dibuat dengan suatu bahasa pemrogram tidak perlu memikirkan proses seperti update stock barang tetapi cukup melakukan insert, update dan delete. Selain itu, jika proses update stock barang dilakukan pada aplikasi, besar kemungkinan akan terjadi kesalahan proses dan informasi. Sebagi contoh pada penjualan barang pada saat aplikasi mencek jumlah stok untuk insert data, stock cukup tetapi data belum sempat disimpan stock sudah berkurang karena ada user lain yang melakukan transaksi penjualan. Untuk membuat trigger dengan perintah create trigger dan untuk mengubah trigger dengan perintah alter tringger. Anda juga dapat membuat/mengubah trigger pada tabel yang bersangkutan di lingkungan Enterprise Manager. Sebelum data disimpan secara permanent (commint), pada aktivitas insert data akan disimpan sementara dalam tabel sementara yang dinamakan inserted; pada aktivitas update dalam tabel sementara inserted dan deleted; sedangkan pada aktivitas deleted akan disimpan dalam tabel sementara deleted. Dengan demikian anda dapat mengambil isi tabel ini seperti select * from inserted dan select * from deleted. Trigger insert pada detil pembelian CREATE TRIGGER tI_beli_detil ON t_beli_detil FOR INSERT AS declare @kdTrn char(5) declare @kdBrg char(5) declare @JmlJual Int declare @JmlStock numeric(12,2) select @kdTrn = bl_no from inserted select @kdBrg = br_kode from inserted 24 | Basisdata Tingkat Lanjut/[email protected] select @JmlJual = bd_jumlah from inserted begin update t_barang set br_stock_skrg = br_stock_skrg+@JmlJual where br_kode = @kdBrg commit tran end Trigger update pada detil pembelian CREATE TRIGGER tU_beli_detil ON t_beli_detil FOR UPDATE AS declare @kdTrn char(5) declare @kdBrg char(5) declare @Oldkd char(5) declare @JmlJual Int declare @OldJml Int declare @JmlStock numeric(12,2) select @kdTrn = bl_no from inserted select @kdBrg = br_kode from inserted select @OldKd = br_kode from deleted select @JmlJual = bd_jumlah from inserted select @OldJml = bd_jumlah from deleted select @JmlStock= br_stock_skrg from t_barang where br_kode = @kdBrg begin --Batalkan transaksi lama update t_barang set br_stock_skrg = br_stock_skrg - @OldJml where br_kode = @Oldkd --Simpan transaksi baru update t_barang set br_stock_skrg =br_stock_skrg + @JmlJual where br_kode = @kdBrg commit tran end Trigger delete pada detil pembelian CREATE TRIGGER tD_beli_detil ON t_beli_detil FOR DELETE AS declare @kdTrn char(5) declare @kdBrg char(5) declare @JmlJual Int declare @JmlStock numeric(12,2) select @kdTrn = bl_no from deleted select @kdBrg = br_kode from deleted select @JmlJual = bd_jumlah from deleted select @JmlStock= br_stock_skrg from t_barang where br_kode = @kdBrg 25 | Basisdata Tingkat Lanjut/[email protected] begin update t_barang set br_stock_skrg =br_stock_skrg - @JmlJual where br_kode = @kdBrg commit tran end 26 | Basisdata Tingkat Lanjut/[email protected]