Tiga soal uraian: tujuan keamanan basis data dan DAC vs MAC, stored procedure MySQL yang menggabungkan dua tabel dengan dua parameter, serta constraint dan trigger dari studi kasus tugas kelompok.
Soal 1 — Tujuan keamanan basis data, DAC vs MAC (30%)
a. Tiga tujuan keamanan
| Tujuan | Artinya | Contoh nyata |
|---|
| Kerahasiaan (confidentiality / secrecy) | data hanya bisa dibaca pihak yang berhak | nilai mahasiswa di SIAP hanya bisa dilihat mahasiswa itu, dosen wali, dan dosen pengampu |
| Integritas (integrity) | data hanya bisa diubah oleh pihak berhak, dengan cara yang sah | mahasiswa bisa membaca nilainya tetapi tidak bisa mengubahnya; perubahan nilai oleh dosen tercatat di log audit |
| Ketersediaan (availability) | pengguna sah tetap bisa mengakses data saat dibutuhkan | server KRS tetap bisa diakses saat masa pengisian KRS (replikasi, backup, perlindungan dari DoS) |
b. DAC vs MAC
| DAC (Discretionary Access Control) | MAC (Mandatory Access Control) |
|---|
| Siapa yang menentukan hak akses | pemilik objek, atas kebijakannya sendiri | sistem/administrator lewat aturan global yang tidak bisa diubah pengguna |
| Mekanisme | hak (privilege) diberikan/dicabut per user atau role: GRANT/REVOKE | label keamanan: objek punya classification, subjek punya clearance (misal Top Secret > Secret > Confidential > Unclassified) |
| Aturan tipikal | apa pun yang di-GRANT | model Bell–LaPadula: no read up (tidak boleh membaca level lebih tinggi), no write down (tidak boleh menulis ke level lebih rendah) |
| Kelemahan | rentan “kebocoran”: user yang punya hak bisa menyalin data atau meneruskan hak (WITH GRANT OPTION) | kaku dan rumit dikelola |
| Contoh | MySQL: GRANT SELECT ON akademik.nilai TO 'dosen'@'%'; | sistem militer/pemerintahan; DBMS dengan label row-level |
Soal 2 — Stored procedure gabungan dua tabel (35%)
Inti soal: buat stored procedure MySQL dengan dua parameter karakter (pNamaBarang, pSuplier) yang
menampilkan kode barang, nama, kategori, suplier, kode batch, harga satuan, lokasi, dan status. Sumber datanya
gabungan dari pemasukan_barang (status bukan kedaluwarsa dan bukan rusak) dan pengembalian_barang (status over
stok). Lalu simulasikan pemanggilannya.
Karena kedua tabel punya kolom yang sama dan hasilnya adalah gabungan baris, operator yang tepat adalah
UNION ALL (bukan JOIN).
DELIMITER $$
CREATE PROCEDURE cari_barang(
IN pNamaBarang VARCHAR(100),
IN pSuplier VARCHAR(100)
)
BEGIN
SELECT kode_barang, nama_barang, kategori, suplier, kode_batch,
harga_satuan, lokasi, status
FROM pemasukan_barang
WHERE status NOT IN ('kedaluwarsa', 'rusak')
AND nama_barang LIKE CONCAT('%', pNamaBarang, '%')
AND suplier LIKE CONCAT('%', pSuplier, '%')
UNION ALL
SELECT kode_barang, nama_barang, kategori, suplier, kode_batch,
harga_satuan, lokasi, status
FROM pengembalian_barang
WHERE status = 'over stok'
AND nama_barang LIKE CONCAT('%', pNamaBarang, '%')
AND suplier LIKE CONCAT('%', pSuplier, '%')
ORDER BY nama_barang, kode_batch;
END$$
DELIMITER ;
Simulasi:
CALL cari_barang('Susu', 'Indofood'); -- semua produk "Susu…" dari suplier "Indofood…"
CALL cari_barang('', 'Wings'); -- string kosong: semua barang dari suplier Wings
Contoh hasil (data karangan sendiri; sesuai ORDER BY):
| kode_barang | nama_barang | kategori | suplier | kode_batch | harga_satuan | lokasi | status |
|---|
| BRG-021 | Susu UHT 1L | Minuman | Indofood | B2603-07 | 18500 | Gudang 2 | over stok |
| BRG-021 | Susu UHT 1L | Minuman | Indofood | B2604-01 | 18500 | Rak A3 | baik |
Soal 3 — Studi kasus tugas kelompok (35%)
Jawabannya bergantung pada studi kasus kelompok masing-masing. Berikut contoh lengkap dengan kasus inventaris
gudang, yang strukturnya bisa disesuaikan dengan kasus kalian.
a. Struktur tabel
CREATE TABLE barang (
kode_barang VARCHAR(10) PRIMARY KEY,
nama_barang VARCHAR(100) NOT NULL,
kategori VARCHAR(50) NOT NULL,
stok INT NOT NULL DEFAULT 0
);
CREATE TABLE pemasukan_barang (
id_masuk INT AUTO_INCREMENT PRIMARY KEY,
kode_barang VARCHAR(10) NOT NULL,
jumlah INT NOT NULL,
harga_satuan DECIMAL(12,2) NOT NULL,
tgl_masuk DATE NOT NULL,
FOREIGN KEY (kode_barang) REFERENCES barang(kode_barang)
);
CREATE TABLE log_stok (
id_log INT AUTO_INCREMENT PRIMARY KEY,
kode_barang VARCHAR(10) NOT NULL,
perubahan INT NOT NULL,
keterangan VARCHAR(100),
waktu TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
barang menyimpan master barang dan stok terkini. pemasukan_barang mencatat setiap barang masuk. log_stok
adalah jejak audit setiap perubahan stok.
b. Dua constraint berbeda + alasan bisnis
-- 1) CHECK: jumlah masuk dan harga harus positif
ALTER TABLE pemasukan_barang
ADD CONSTRAINT chk_jumlah_harga CHECK (jumlah > 0 AND harga_satuan > 0);
-- 2) UNIQUE: satu nama barang hanya boleh terdaftar sekali per kategori
ALTER TABLE barang
ADD CONSTRAINT uq_nama_kategori UNIQUE (nama_barang, kategori);
- CHECK: penerimaan barang dengan jumlah 0/negatif atau harga 0 pasti salah input dan akan merusak perhitungan
nilai persediaan.
- UNIQUE: mencegah barang ganda (“Susu UHT 1L” terdaftar dua kali dengan kode berbeda), yang membuat stok
terpecah dan laporan tidak akurat. (FOREIGN KEY di atas juga constraint, yang menjaga integritas referensial.)
c. Dua skenario trigger yang melibatkan ketiga tabel
DELIMITER $$
-- 1) Barang masuk → stok bertambah → tercatat di log
CREATE TRIGGER trg_after_insert_masuk
AFTER INSERT ON pemasukan_barang
FOR EACH ROW
BEGIN
UPDATE barang SET stok = stok + NEW.jumlah WHERE kode_barang = NEW.kode_barang;
INSERT INTO log_stok (kode_barang, perubahan, keterangan)
VALUES (NEW.kode_barang, NEW.jumlah, CONCAT('Pemasukan #', NEW.id_masuk));
END$$
-- 2) Catatan pemasukan dibatalkan (dihapus) → stok dikurangi kembali → tercatat di log
CREATE TRIGGER trg_after_delete_masuk
AFTER DELETE ON pemasukan_barang
FOR EACH ROW
BEGIN
UPDATE barang SET stok = stok - OLD.jumlah WHERE kode_barang = OLD.kode_barang;
INSERT INTO log_stok (kode_barang, perubahan, keterangan)
VALUES (OLD.kode_barang, -OLD.jumlah, CONCAT('Pembatalan pemasukan #', OLD.id_masuk));
END$$
DELIMITER ;
Logika: stok di tabel barang tidak pernah diubah manual. Stok selalu turunan dari transaksi di
pemasukan_barang, dan setiap perubahannya meninggalkan jejak di log_stok. Di dalam trigger, NEW merujuk baris
yang baru di-insert dan OLD merujuk baris yang dihapus. Trigger AFTER dipakai karena perubahan stok hanya boleh
terjadi setelah baris pemasukan benar-benar tersimpan.
Pembahasan ditulis independen oleh belajar.myudak, bukan kunci jawaban resmi. Soal asli tetap milik pengampu
mata kuliah dan ditampilkan langsung dari arsip Google Drive.