You are on page 1of 6

UTS BASIS DATA

Ardyanto Hermawan 11/18/2011

UTS TEKNIK BASIS DATA OPEN BOOK 18 November 2011 SOAL B

I.

Tulis query berikut dalam SQL: 1. Mencetak nama setiap karyawan yang gajinya melebihi anggaran dari semua departemen ia bekerja.
SELECT FROM emp.ename dept INNER JOIN emp ON dept.managerid = emp.eid INNER JOIN works ON dept.did = works.did AND emp.eid =

works.eid WHERE emp.salary>dept.budget

2. Jika seorang manajer mengelola lebih dari satu departemen, dia mengontrol jumlah semua anggaran untuk departemendepartemen. Cari managerids manajer yang mengendalikan lebih dari $ 5 juta.
SELECT FROM dept.managerid dept INNER JOIN emp ON dept.managerid = emp.eid INNER JOIN works ON dept.did = works.did AND emp.eid =

works.eid WHERE dept.budget>5000000

3. Temukan enames manajer yang mengelola departemen dengan anggaran terbesar.


SELECT FROM emp.ename dept INNER JOIN emp ON dept.managerid = emp.eid INNER JOIN

works ON dept.did = works.did AND emp.eid = works.eid WHERE dept.budget = (SELECT MAX(dept.budget) FROM dept)

4. Cari managerids manajer yang mengelola departemen hanya dengan anggaran lebih besar dari $ 1 juta.
SELECT FROM dept.managerid dept INNER JOIN emp ON dept.managerid = emp.eid INNER JOIN works ON dept.did = works.did AND emp.eid =

works.eid WHERE dept.budget > 1000000

5.

Cetak nama dan usia setiap karyawan yang bekerja di dua departmen, yakni departemen Hardware dan departemen Software.
SELECT FROM DISTINCT emp.ename, emp.age dept INNER JOIN emp ON dept.managerid = emp.eid INNER JOIN works ON dept.did = works.did AND emp.eid =

works.eid WHERE dept.dname='Hardware' OR dept.dname='Software'

6. Cari enames manajer yang mengelola departemen dengan anggaran yang lebih besar hanya dari $ 1 juta, tapi setidaknya satu departemen dengan anggaran kurang dari $ 5 juta.
SELECT emp.ename FROM dept,works,emp WHERE emp.eid=works.eid and dept.did=works.did and (dept.budget between 1000000 and 5000000)

II.

Buat trigger untuk table-table di atas: 1. Buat trigger DDL yang bisa mencegah table Emp untuk diubah.
CREATE TRIGGER PreventChanges ON DATABASE FOR ALTER_TABLE AS PRINT 'Tidak diijinkan untuk membuat erubahan ada tabel emp.' PRINT 'Untuk memberikan perubahan harus disable DDL trigger ini.' ROLLBACK

Kemudian melakukan alter table pada emp, dan hasil seperti dibawah ini
alter table emp add nama nvarchar(50);

2. Buat trigger DML yang mencatat perubahan yang dilakukan pada table Dept Membuat table DMLedit untuk menampung hasil update pada table dept
CREATE TABLE DMLedit( Changed TIMESTAMP, DateChanged DateTime, TableName char(30), UserName varchar(50), Operation char(6) )

Membuat Trigger dengan nama EditDML yang bereaksi setelah table dept mengalami perubahan.
CREATE TRIGGER EditDML ON dbo.dept AFTER UPDATE -- NOT FOR REPLICATION AS DECLARE @Operation char(6) IF EXISTS(SELECT * FROM deleted) SET @Operation = 'Update' INSERT INTO dbo.DMLedit(DateChanged, TableName, UserName, Operation) SELECT GetDate(), 'dept', suser_sname(), @Operation -- End of Trigger

Untuk mengecek apakah trigger sudah bereaksi, maka dilakukan percobaan update.
update dbo.dept set budget=500 where dname='Shipping'

Bila hasil query update suskes, pada table DMLedit akan terdapat record yang menunjukkan bahwa table dept telah mengalami perubahan.

3. Buat batasan tabel pada Emp yang akan memastikan bahwa setiap karyawan memiliki salary setidaknya $ 10.000 Membuat trigger dengan nama trigger2an pada table emp.
CREATE TRIGGER Trigger2an ON dbo.emp AFTER INSERT,UPDATE AS DECLARE @salary2 numeric(10, 2) SELECT @salary2 = emp.age FROM dept,works,emp IF @salary2 < 10000 BEGIN RAISERROR ('Salary harus lebih dari 10.000', 16, 1) ROLLBACK END update emp set salary=2000 where ename='Maria White'

Hasil query update akan mengalami kegagalan seperti gambar di bawah ini.

4. Buat batasan tabel pada Dept yang memastikan semua manajer memiliki age > 30. Membuat trigger dengan nama trigger2an pada table emp.
CREATE TRIGGER Trigger3an ON dbo.dept AFTER INSERT,UPDATE AS DECLARE @age2 numeric(3, 0) SELECT @age2 = emp.age FROM dept,works,emp WHERE dept.did=works.did AND emp.eid=works.eid IF @age2 < 30 BEGIN RAISERROR ('Age harus lebih dari 30 Tahun', 16, 1) ROLLBACK END update emp set age=20 where ename='Maria White'

Hasil query update akan mengalami kegagalan seperti gambar di bawah ini.

You might also like