Mỗi nhân viên có 1 mã và tuổi phải >18 Mỗi nhân viên và xe đều ở 1 xí nghiệp, thông tin xí nghiệp gồm : mã xí nghiệp, tên xí nghiệp và SĐT Mỗi xe có một tuyến, mỗi tuyến được xác địn
Trang 1TRƯỜNG ĐẠI HỌC MỞ HÀ NỘI KHOA CÔNG NGHỆ THÔNG TIN
-BÁO CÁO BÀI TẬP LỚN
HỆ QUẢN TRỊ CSDL
ĐỀ TÀI QUẢN LÝ XE BUS Giáo viên hướng dẫn: Th.S Nguyễn Thị Tâm Sinh viên thực hiện: Nguyễn Quang Huy-2010A05
Nguyễn Duy Hân-2010A01
Hà Nội, 2021
Trang 2Mục Lục
I Phát biểu bài toán 4
1 Xây dựng mô hình thực thể liên kết 5
2 Xây dựng mô hình cơ sở dữ liệu quan hệ 5
3 Chuẩn hóa cơ sở dữ liệu của bài toán 7
II Tạo bảng CSDL 8
1 Tạo bảng 8
2 Nhập dữ liệu 14
III Thực Hiện Các Yêu Cầu 20
1 Truy vấn dữ liệu 20
2 Tạo View hiện dữ liệu 24
3 Tạo các PROCDUCE 29
4 Tạo Trigger kiểm soát ràng buộc dữ liệu 45
5 Phân quyền cho các thành viên 60
6 Phân tán ngang theo bảng Nhân Viên 63
Trang 3I.Phát biểu bài toán
Để quản lý xe bus một cách hiểu quả, ta cần một hệ thống quản lý Hệ thống bao gồm:
Đầu tiên là quản lý xe cần có biển số, loại xe ,số ghế và năm bắt đầu sử dụng
Trên mỗi xe đều có 2 nhân viên, một lái xe và một phụ xe Thông tin nhân viên bao gồm: Mã nhân viên, tên nhân viên, giới tính, ngày sinh, địa chỉ, ngày vào làm, lương cơ bản, phụ cấp, chức vụ Mỗi nhân viên có 1 mã và tuổi phải >18
Mỗi nhân viên và xe đều ở 1 xí nghiệp, thông tin xí nghiệp gồm : mã xí nghiệp, tên xí nghiệp và SĐT
Mỗi xe có một tuyến, mỗi tuyến được xác định bởi mã tuyến, tên tuyến và lộ trình
Thông tin chi tiết trạm dừng gồm: mã trạm dừng và mã tuyến
Trên mỗi xe đều có thông tin của tuyến và nhân viên, bao gồm Mã tuyến, biển số,
mã nhân viên, ngày chạy, số giờ
Từ phát biểu bài toán ta có mô hình thực thể liên kết
Trang 4Xây dựng mô hình quan hệ
Bước 1 Xử lý thực thể thông thường.
Xe: biển số, loại xe, số ghế, năm bắt đầu sử dụng
Tuyến: Mã tuyến, tên tuyến
Trạm dừng: Mã trạm dừng, tên trạm dừng
Nhân viên: Mã nhân viên, tên nhân viên, giới tính, ngày sinh, địa chỉ, ngày vào làm, lương cơ bản, phụ cấp, chức vụ
Nhà xe: Mã nhà xe, tên nhà xe, số điện thoại
Bước 2 Xử lý thực thể yếu: không tồn tại thực thể yếu
Bước 3 Xử lý mối liên hệ 1:1: Không có
Bước 4 Xử lý liên kết 1:N
Xe-nhà xe: Biển số, loại xe, số ghế, năm bắt đầu sử dụng, mã nhà xe
Nhân viên-nhà xe: Mã nhân viên, tên nhân viên, giới tính, ngày sinh, địa chỉ, ngày vào làm, lương cơ bản, phụ cấp, chức vụ, mã nhà xe
Tuyến: Mã tuyến, tên tuyến, lộ trình
Xe_Lái xe (Mã tuyến, biển số, Mã nhân viên, Ngày chạy, số giờ)
Bước 5 Xử lý liên kết M:N
CT_Tramdung (Mã trạm dừng, Mã tuyến)
=>V ậy cơ sở dữ liệu của bài toán:
Xe: Biển số, loại xe,số ghế, năm bắt đầu sử dụng
Tuyến: Mã tuyến, tên tuyến, lộ trình
Trạm dừng: Mã trạm dừng, tên trạm dừng
Nhà xe: Mã nhà xe, tên nhà xe, SĐT
Nhân viên: Mã nhân viên, tên nhân viên, giới tính, ngày sinh, địa chỉ, ngày vào làm, lương cơ bản, phụ cấp, chức vụ
Chi Tiết Lái xe (Mã tuyến, Biển số, Mã nhân viên, Ngày chạy, Số giờ)
Chi Tiết Trạm dừng (Mã trạm dừng,Mã tuyến)
Trang 5Chuẩn hóa CSDL bài toán:
Biển số => tên xe, loại xe, số ghế, năm bắt đầu sử dụng
Mã trạm dừng => tên trạm dừng
Mã tuyến => tên tuyến
Mã nhân viên => tên nhân viên, giới tính, ngày sinh, địa chỉ, ngày vào làm, lương cơ
bản, phụ cấp, chức vụ
Từ các phụ thuộc hàm trên ta thấy:
Mọi thuộc tính đều là nguyên tố, giá trị các thuộc tính trên bộ là đơn trị, không có thuộc tính nào có giá trị được tính toán từ một số thuộc tính khác
Lược đồ quan hệ trên đã ở dạng chuẩn 1NF
Mọi thuộc tính không khóa của quan hệ đều phụ thuộc hàm đầy đủ vàokhóa chính
Lược đồ quan hệ trên đã ở dạng chuẩn 2NF
Mọi thuộc tính không khóa của quan hệ đều không phụ thuộc bắc cầu vào bất kì khóa chính của quan hệ
Lược đồ quan hệ trên đã ở dạng chuẩn 3NF
Vậy lược đồ quan hệ đã được chuẩn hóa về dạng cao nhất – 3NF
II.Xây dựng CSDL bài toán
1 Tạo bảng
tblXe: Lưu trữ thông tin xe
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
tblTramdung: Lưu trữ thông tin trạm dừng
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
Trang 62 Tentramdung Nvarchar(50)
tblTuyen: Lưu trữ thông tin Tuyến bus
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
Nhaxe: Lưu trữ thông tin Nhà xe
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
tblChiTietTramdung: Lưu trữ thông tin chi tiết tuyến bus
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
tblNhanVien: Lưu trữ thông tin nhân viên
TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
Trang 7TT Tên thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
Select *from tblTuyen
Select * from tblTramdung
Select * from tblChiTietTramdung
Trang 8Select * from tblXe
Select * from tblNhanvien
Select * from tblChiTietLaixe
Trang 9Select * from NhaXe
III Thực hiện các yêu cầu
1 Truy vấn dữ liệu
Truy vấn 1 bảng
1 Lấy ra thông tin tên,ngày sinh, địa chỉ của các nhân viên nam
select TenNV,Ngaysinh,Diachi from tblNhanvien
where Gioitinh='Nam'
2 Lấy ra thông tin xe có số ghế là 26
select Bienso, Loaixe,Ngaysanxuat from tblXe
where Soghe=26
3 Lấy ra những nhân viên có địa chỉ ở Hà Nội
select *from tblNhanvien
where Diachi=N'Hà Nội'
4 Lấy ra thông tin tuyến xe có mã là 3
Trang 10select *from tblTuyen
where Matuyen=3
5 Đưa ra tên nhân viên có tuổi cao nhất
select top 1 TenNV,Max(year(getdate())-year(Ngaysinh)) as Tuoimax from tblNhanvien
group by TenNV
order by Tuoimax desc
Truy vấn nhiều bảng
1 Lấy ra tên những nhân viên đi trên tuyến 3
select TenNV,Matuyen from tblNhanvien,tblChiTietLaixe
where tblNhanvien.MaNV=tblChiTietLaixe.MaNV
and Matuyen=3
2 Lấy ra tên những nhân viên có số giờ trên xe lớn hơn 12
select TenNV,sogio from tblNhanvien,tblChiTietLaixe
where tblNhanvien.MaNV=tblChiTietLaixe.MaNV
and sogio>12
3 Lấy ra tên các trạm dừng của tuyến 17
select tblTuyen.Matuyen,Tentramdung from tblTuyen join
1 Tạo view đếm số xe đi của mỗi nhân viên
create view vw_dixe as
select tblNhanVien.MaNV, count(MaTuyen) as[Số lần đi] from tblNhanvien, tblChiTietLaixe
where tblNhanVien.MaNV = tblChiTietLaixe.MaNV
Trang 11group by tblNhanVien.MaNV
select *from vw_dixe
2 Tạo view tìm xem những xe nào có lộ trình đi giáp bát
create view vw_gb as
select * from tblTuyen where Lotrinh like N'%Giáp Bát%'
select *from vw_gb
3 Tạo view xem những tuyến nào đi qua trạm Ô quan Chưởng
create view vw_oqc as
select tblTuyen.Matuyen,tblTuyen.Tentuyen from tblChiTietTramdung, tblTuyen, tblTramdung
where tblChiTietTramdung.Matuyen = tblTuyen.Matuyen
and tblChiTietTramdung.Matramdung = tblTramdung.Matramdung
and Tentramdung = N'Ô Quan Chưởng'
select *from vw_oqc
Trang 124 Tạo view xem thông tin nhân viên nam
create view vw_man as
select * from tblNhanvien where Gioitinh = 'Nam'
select *from vw_man
5 Tạo view đếm số xe đi qua bệnh viện việt đức
create view vw_demxe as
select Tentramdung, count(tblChiTietTramdung.Matuyen) as[Số xe đi qua] from
tblChiTietTramdung, tblTuyen, tblTramdung
where tblChiTietTramdung.Matuyen = tblTuyen.Matuyen
and tblChiTietTramdung.Matramdung = tblTramdung.Matramdung
and Tentramdung = N'Bệnh Viện Việt Đức'
group by Tentramdung
select *from vw_demxe
6 Tạo view xem nhân viên có lương cơ bản cao nhất
create view vw_max as
select top 1 * from tblNhanvien
order by Luongcoban desc
select *from vw_max
Trang 137 Tạo view xem thông tin xe
create view vw_xe as
select * from tblXe
select *from vw_xe
8 Tạo view xem tuổi nhân viên
create view vw_age as
select TenNV,datediff(day,Ngaysinh,getdate())/365 as [Tuổi] from tblNhanvien select *from vw_age
9 Tạo view xem số giờ chạy xong tuyến của nhân viên
create view vw_sogio as
select tblNhanvien.MaNV,Matuyen, sogio from tblChiTietLaixe, tblNhanvien where tblChiTietLaixe.MaNV = tblNhanvien.MaNV
select *from vw_sogio
Trang 1410.Tạo view đếm số nhân viên nữ
create view vw_cntwomen as
select count(MaNV) as [Số lượng] from tblNhanvien
where Gioitinh = N'Nữ'
select *from vw_cntwomen
Tạo view xem nhân viên đi trên xe với biển số nhập vào
tblNhanvien
and tblChiTietLaixe.MaNV = tblNhanvien.MaNV
and tblXe.Bienso ='02-T9-1945'
end
exec td_tuyen N'Ô Quan Chưởng'
/* 2.Truyền vào thời gian, tăng lương cơ bản thêm 2000 cho nhân viên lái nhiều hơn thời gian truyền vào
create proc up_nv
@tg int
Trang 15as
begin
update tblNhanvien set Luongcoban = Luongcoban + 2000 where MaNV = (select MaNV from tblChiTietLaixe where sogio>@tg) end
exec up_nv 12
/* 3.Tạo thủ tục xem số xe đã đi của mỗi nhân viên
create proc xe_di
exec xe_di 'NV01'
/* 4.Tạo thủ tục truyền vào năm, xem những xe nào sản xuất trong năm đó
create proc xe_sx
/* 6.Tạo thủ tục lấy ra nhân viên theo độ tuổi, tuổi là tham số truyền vào
create proc tuoi_nv
Trang 16exec tuoi_nv 30
/* 7.Tạo thủ tục tăng lương cho nhân viên có mã số truyền vào
create proc up_mnv
@mnv nchar(10)
as
begin
update tblNhanvien set Luongcoban = Luongcoban *2 where MaNV = @mnv
end
exec up_mnv 'NV01'
/* 8.Tạo thủ tục thêm 1 bản ghi mới cho bảng Tram Dung
create proc ins_td
else begin
print N'Trạm dừng đã có' return
end end
exec ins_td 'TD06','Bệnh viện Bạch Mai'
/* 9.Tạo thủ tục thêm nhân viên với điều kiện ngày vào làm nhỏ hơn ngày hiện tại
create proc ins_nv
@mnv nchar(10),@ten nvarchar(30),@gt nchar(3),@Ngaysinh date, @dc nvarchar(30),@nvl date, @lcb int, @pc int, @cv nvarchar(20)
as
Trang 17begin
if (@nvl<getdate()) begin
INSERT INTO tblNhanvien VALUES (@mnv,@ten,@gt,@Ngaysinh,@dc,@nvl,@lcb,@pc,@cv) end
else begin
print N'Ngày vào làm phải nhỏ hơn ngày hiện tại' return
end end
EXECUTE ins_nv 'NV07', N'Bùi Ngọc Hà',N'Nữ','19961004','Hà
nội','20171028',7500000,300,'Phụ xe'
/* 10.Tạo thủ tục thêm tuyến với tham số truyền vào
create proc ins_tuyen
@mt nchar(10),@ten nvarchar(30), @lt text
else begin
print N'Tuyến đã có' return
end end
/* 11.Tạo thủ tục thêm xe với tham số truyền vào
create proc ins_xe
@bs nchar(10),@loai nvarchar(30), @soghe int, @nsx date
Trang 18else begin
print N'Xe đã có' return
end end
exec ins_xe '11-11-2020',N'Xe thường',26,'11-11-2020'
/* 12.Tạo thủ tục xem nhân viên với địa chỉ truyền vào
create proc sel_dc
exec sel_dc N'Hà Nội'
/* 13.Lấy ra nhân viên nam hoặc nữ với độ tuổi tăng dần, truyền vào giới tính create proc sel_gt
exec sel_gt 'Nam'
/* 14.Tạo thủ tục xem xe nào cũ nhất với tham số truyền vào là loại xe
create proc sel_gt
exec sel_xe @loai=N'Xe thường'
Trang 19/* 15.Tạo thủ tục đếm nhân viên theo giới tính
CREATE PROC sp_DemGioiTinh
@Nam int OUTPUT,
@Nu int OUTPUT
AS
BEGIN
SET @Nam = 0 SET @Nu = 0 SELECT @Nam = COUNT (*) FROM dbo.tblNhanvien WHERE Gioitinh
DECLARE @TongGTNam INT, @TongGTNu INT, @TongSo INT
EXEC @TongSo = sp_DemGioiTinh @Nam=@TongGTNam OUTPUT, @Nu =
@TongGTNu OUTPUT
SELECT @TongGTNam AS N'Nam', @TongGTNu AS N'Nữ', @TongSo AS N'Tổng số'
/* 16 Tạo thủ tục xem nhân viên già nhất
create proc old_nv
/* 17 Tạo thủ tục xem lứa tuổi nhân viên
create proc lua_tuoi
as
begin
SELECT TenNV, LuaTuoi = CASE WHEN YEAR(GETDATE())-YEAR([Ngaysinh])>=40 AND YEAR(GETDATE())-YEAR([Ngaysinh])<60 THEN 'Trung niên'
WHEN YEAR(GETDATE())-YEAR([Ngaysinh])<40 THEN 'Thanh niên'
ELSE ''
Trang 20END FROM tblNhanvien End
/* 18.Tăng lương cho nhân viên có thâm niên hơn 5 năm với năm là tham số truyền vào
CREATE PROC sp_tangluongcb
@nam INT
AS
BEGIN
UPDATE tblNhanvien SET Luongcoban=1.5*Luongcoban WHERE( @nam-YEAR(Ngayvaolam))>=5 END
EXEC sp_tangluongcb @nam=2019
/* 19.Đếm số nhân viên sinh trong tháng với tháng là số truyền vào
CREATE PROC birth_month
exec birth_month 3
/* 20.Tạo thủ tục thêm chi tiết trạm dừng
CREATE PROC ins_cttd
if not exists(select * from tblTramdung where Matramdung = @mtd) begin
print N'Không có trạm dừng này' return
Trang 21end else
begin
insert into tblChiTietTramdung values(@mtd, @mt)
end end
GO
insert into tblNhanvien
values ('NV07',N'Nguyễn Đức G','Nam','2000-10-11',N'Hà 5',2000000,150,N'Phụ xe')
Nội','2020-10-insert into tblNhanvien
values ('NV08',N'Nguyễn Duy H','Na','2000-10-11',N'Hà 5',2000000,150,N'Phụ xe')
Trang 22Nội','2020-10-/* 2 Tạo trigger kiểm soát số tuổi nhân viên mới không vượt quá 50 CREATE TRIGGER trg_tuoinv ON tblNhanVien
IF (@Tuoinvmoi>50) BEGIN
PRINT N'Nhân viên không được quá 50 tuổi' ROLLBACK TRAN
END END
GO
insert into tblNhanvien
values ('NV08',N'Nguyễn Đức h','Nam','1950-10-11',N'Hà 5',2000000,150,N'Phụ xe')
Nội','2020-10-/* 3 Tạo trigger kiểm soát số giờ tuyến chạy không dưới 12 tiếng
IF (@sg < 12) BEGIN
PRINT N'Số giờ tuyến chạy không dưới 12 tiếng'
Trang 23ROLLBACK TRAN END
END END
update tblChiTietLaixe
set sogio=11 where Matuyen=3
/* 4 Tạo trigger kiểm soát ngày vào làm phải sau ngày sinh
DECLARE @Ngayvaolam DATETIME, @Ngaysinh DATETIME
SELECT @Ngayvaolam = Ngayvaolam FROM inserted SELECT @Ngaysinh = Ngaysinh FROM inserted
END
GO
insert into tblNhanvien
values ('NV08',N'Nguyễn Đức h','Nam','2020-10-11',N'Hà 5',2000000,150,N'Phụ xe')
Trang 24Nội','2020-10-/* 5 Tạo trigger không cho sửa tên tuyến trong bảng tblTuyen
CREATE TRIGGER trg_updateTentuyen
GO
update tblTuyen
set Tentuyen =N'Ngã tư sở' where Tentuyen=N'Long Biên-Nội Bài'
/* 6 Tạo trigger cập nhật mã trạm dừng thì bảng tblChiTietTramdung cập nhật theo
create TRIGGER trg_updateMatramdung
DECLARE @Macu nchar(10), @Mamoi nchar(10) SELECT @Macu = Matramdung FROM DELETED SELECT @Mamoi = Matramdung FROM INSERTED
If ( EXISTS (select Matramdung from tblTramdung Where Matramdung= @Macu) )
BEGIN
UPDATE tblChiTietTramdung SET Matramdung =
@Mamoi WHERE Matramdung = @Macu END
Trang 25END END
GO
insert into tblNhanvien
values ('NV08',N'Nguyễn Đức h','Nam','2020-10-11',N'Hà 5',2000000,150,N'Phụ')
Nội','2020-10-/* 8 Tạo trigger kiểm soát số ghế phải phù hợp với loại xe
ALTER TRIGGER trg_sgxe
BEGIN
DECLARE @soghe int
Trang 26SELECT @soghe = soghe FROM inserted
IF (@loaixe = N'Xe thường' and @soghe != 26) BEGIN
PRINT N'Loại xe thường chỉ nhận số ghế là 26' ROLLBACK TRAN
END ELSE IF (@loaixe = N'Xe 2 tầng' and @soghe != 43) BEGIN
PRINT N'Loại xe 2 tầng chỉ nhận số ghế là 43' ROLLBACK TRAN
END
ELSE IF (@loaixe = N'Xe đường dài' and
@soghe != 41) BEGIN
PRINT N'Loại xe đường dài chỉ nhận số ghế là 41'
ROLLBACK TRAN END
END ELSE BEGIN
PRINT N'Loại xe chỉ có Xe thường, Xe 2 tầng, Xe đường dài' ROLLBACK TRAN
END END
GO
insert into tblXe
values(3,N'Xe thườ',26,null)
values( , N'Xe thường' ,43,null)
/* 9 Tạo trigger kiểm soát tuổi đi làm của nhân viên
Trang 27CREATE TRIGGER trg_tuoidilam
END
insert into tblNhanvien
values ('NV08',N'Nguyễn Đức h','Nam','2009-10-11',N'Hà
PRINT N'Lương của nhân viên mới không dưới 2 triệu'
ROLLBACK TRAN
Trang 28END END
END
insert into tblNhanvien
values ('NV08',N'Nguyễn Đức h','Nam','2000-10-11',N'Hà 5',1000000,150,N'Phụ xe')
Nội','2020-10-5 Phân quyền cho các thành viên
Tạo tài khoản người dùng cho mỗi thành viên trong nhóm
CREATE LOGIN Quanghuy WITH PASSWORD = '123456',
DEFAULT_DATABASE = Quanlyxebus;
CREATE USER Huy FOR LOGIN Quanghuy;
CREATE LOGIN Duyhan WITH PASSWORD = '123456',
DEFAULT_DATABASE = Quanlyxebus;
CREATE USER Han FOR LOGIN Duyhan;
Cấp phát cho người dùng có tên Huy quyền thực thi all trên bảng tblNhanvien
GRANT ALL PRIVILEGES
ON tblNhanVien
TO Huy;
Cấp phát cho người dùng Han quyền SELECT, INSERT, UPDATE, DELETE VÀ REFERENCES
trên bảng tblXe và được chuyển tiếp quyền cho người dùng khác
GRANT SELECT, UPDATE, DELETE, REFERENCES
ON tblXe
TO Han
WITH GRANT OPTION;
Cấp phát quyền tạo bảng, khung nhìn cho người dùng có tên là Han GRANT CREATE TABLE, CREATE VIEW