Xây dựng CSDL quản lý khách sạn - Quản lý danh sách phòng trả, các tiện nghi trong phòng trả - Quản lý các yêu cầu đặt phòng, thuê phòng của các khách hàng - Quản lý các thông tin về khách hàng, ghi nhần các khách hàng đặc biệt và có chính sách ưu tiên với các khách hàng quen - In ấn các báo cáo, thống kê doanh thu...
Trang 1I Mô tả các chức năng của hệ thống.
1 Phân quyền cho các đối tượng sử dụng
- Nhân viên lễ tân : nhập các thông tin của khách hàng khi tiếp đón khách, cácthông tin giao dịch với khách hàng, thanh toán cho khách hàng khi họ trả phòng
- Nhân viên phục vụ : nhập các thông tin sử dụng dịch vụ của khách hàng, cậpnhật sự thay đổi giá sử dụng dịch vụ
- Nhân viên quản lý phòng : cập nhật trang thiết bị của từng phòng, phân hạngphòng, giá thuê của từng loại phòng, thông tin về thay đổi của phòng thuê
- Nhân viên quản trị hệ thống : cập nhật thêm danh sách nhân viên mới và cấpquyền sử dụng cho những người có nhiệm vụ
- Giám đốc khách sạn : xem các thông tin tổng hợp về công việc kinh doanh củakhách sạn
2 Chức năng của hệ thống
- Quản lý danh sách phòng, các tiện nghi trong phòng, số giường và trạng tháicủa phòng
- Quản lý các yêu cầu đặt phòng, thuê phòng của các khách hàng
- Quản lý các thông tin về khách hàng, ghi nhận các khách hàng đặc biệt và cóchính sách ưu tiên đối với các khách hàng quen
- Theo dõi và thống kê việc sử dụng dịch vụ của khách hàng (điện thoại, ănuống, giặt là…)
- Cho phép in các hóa đơn thanh toán khi khách hàng trả phòng
- Hệ thống có thể in ra các báo cáo thống kê tình hình kinh doanh của kháchsạn
II Thiết kế CSDL
1 Cấu trúc các bảng.
a) [QuanLyPhong].[GIAPHONG]
Column Name Description Datatype Length Allow Null
Trang 2b) [QuanLyPhong] [PHONG]
Column Name Description Datatype Length Allow Null
SoPhong Số phòng Khóa chính MA:varchar 10
LoaiPhong Loại phòng Khóa ngoại của
GIAPHONG.GiaPhong
Varchar 20
c) [LeTan] [KHACHHANG]
Column Name Description Datatype Length Allow Null
MaKH Mã khách hàng Khóa chính MA:varchar 10
d) [QuanTri] [NHANVIEN]
Trang 3Column Name Description Datatype Length Allow Null
MaNV Mã nhân viên Khóa chính MA:varchar 10
NgayLam Ngày làm việc Datetime
CapTren Cập trên trực tiếp quản lý
Khóa ngoại của NHANVIEN.MaNV
SoPhong Số phòng Khóa chính Khóa
ngoại của PHONG.SoPhong
MA:varchar 10
NgayMuon Ngày mượn phòng Datetime
f) [LeTan] [HOADON]
Column Name Description Datatype Length Allow Null
MaHD Mã hóa đơn Khóa chính MA:varchar 10
MaKH Mã khách hàng Khóa ngoại
của KHACHHANG.MaKH
MA:varchar 10
g) [LeTan] [CTHD]
Trang 4Column Name Description Datatype Length Allow Null
MaHD Mã hóa đơn Khóa chính
Khóa ngoại của HOADON.MaHD
MA:varchar 10
SoPhong Số phòng Khóa chính Khóa
ngoại của PHONG.SoPhong
MA:varchar 10
ThoiGian(ngay) Thời gian ở Int
h) [PhucVu].[DICHVU]
Column Name Description Datatype Length Allow Null
MaDV Mã dich vụ Khóa chính MA:varchar 10
i) [LeTan].[DATPHONG]
Column Name Description Datatype Length Allow Null
Phong Phòng cần đặt Khóa ngoại
của PHONG.SoPhong
TEN:varchar 50
NgayDat Ngày đặt phòng Datetime
NgayMuon Ngày mượn phòng Datetime
j) [PhucVu].[SUDUNGDV]
Trang 5Column Name Description Datatype Length Allow Null
2 Sơ đồ quan hệ giữa các bảng.
III Mô tả các thủ tục, hàm và trigger.
+ Nhập MaDH, SoPhong, ThoiGian, Gia
+ Tính TinhTien = ThoiGian * Gia
+ Chèn dữ liệu vào bảng [LeTan].[CTHD]
b) Thủ tục nhập MUONTRAPHONG
Trang 6- Tên : LeTan.proc_MUON
- Kết quả thực hiện : Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG]
- Các bước thực hiện :
+ Nhập MaKH, SoPhong
+ Lấy NgayMuon = ngày hệ thống
+ Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
+ Nhập vao MaKH, MaDV, SL
+ Kiểm tra khách hàng có trong bảng KHACHHANG hay không
Nếu có :
+ Lấy giá của dịch vụ từ bảng DICHVU+ Tính tiền = Gia*SL
+ Chèn dữ liệu vào bảng [PhucVu].[SUDUNGDV]
Ngược lại : Thông báo khách hàng không tồn tại
e) Thủ tục in hóa đơn thanh toán
- Tên : LeTan.proc_INHD
- Kết quả thực hiện : In hóa đơn cho khách hàng
- Các bước thực hiện :
+ Nhập MaKH
Trang 7+ Kiểm tra khách hàng đã được lập hóa đơn chưa
Nếu có :
+ Lấy tên khách hàng từ bảng KHACHHANG+ Tính tổng tiền thuê phòng của khách hàng từ bảng HOADON vàCTHD
+Tính tiền sử dụng dịch vụ của khách hàng đó+ Tính tổng tiền phải trả = tiền thuê phòng + tiền sử dụng dịch vụNgược lại : thông báo khách hàng không tồn tại
+ Nhập mã nhân viên cần tìm kiếm
+ Tạo một bảng tạm có cấu trúc giống với bảng gốc ([QuanTri].[NHANVIEN])+ Chèn thông tin các nhân viên có cấp trên là mã nhân viên nhập vào
+ Tìm kiếm các nhân viên có cấp trên là mã nhân viên vừa chèn vào
+ Thông báo không thể tạo login
b) Trigger khi chèn dữ liệu vào bảng [LeTan].[DATPHONG]
- Tên : tg_DATPHONG
- Kết quả thực hiện :
+ Nhập thông tin vào bảng [LeTan].[DATPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG]
- Các bước thực hiện :
Trang 8+ Lấy các giá trị HoTen,Tuoi, GioiTinh, DiaChi, NgheNghiep, SDT, CMND,SoPhong từ dữ liệu nhập vào.
+ Kiểm tra TrangThai của phòng ứng với giá trị SoPhong nhập vào trongbảng [QuanLyPhong].[PHONG] có còn trống không
Nếu có :
+ Chèn dữ liệu vào bảng [LeTan].[DATPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG] là ‘Da Dat’
Ngược lại :
+ Thông báo phòng đã có người ở
c) Trigger khi chèn dữ liệu vào bảng [LeTan] [MUONTRAPHONG]
- Tên : tg_MUON
- Kết quả thực hiện :
+ Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG]+ Xóa dữ liệu trong bảng [LeTan].[DATPHONG]
- Các bước thực hiện :
+ Lấy các giá trị MaKH, SoPhong, NgayMuon từ dữ liệu nhập vào
+ Nếu phòng còn trống thì :
Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
Cập nhật trạng thái của phòng = full+ Nếu khách hàng đã đặt phòng trước thì :
Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
Cập nhật trạng thái của phòng = fullXóa dữ liệu trong bảng [LeTan].[DATPHONG]
d) Trigger khi thực hiện trả phòng.
- Tên : tg_TRA
- Kết quả thực hiện :
+ Cập nhật NgayTra trong bảng [LeTan].[MUONTRAPHONG]
+ Cập nhật lại TrangThai cua phong = Trong
+ Chèn dữ liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD]
- Các bước thực hiện :
Trang 9+ Nếu NgayTra có sự thay đổi từ NULL sang NOT NULL :
Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] = ngày hệ thốngCập nhật lại TrangThai cua phong = Trong
Chèn dữ liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD]
+ Lấy các giá trị NgaySinh, NgayLam từ dữ liệu nhập vào
+ Tính tuổi của nhân viên đến thời điểm làm việc Nếu tuổi < 18 thì thông báongười này chưa đủ tuổi làm việc
IV Mô tả các View
1 VIEW tìm phòng trống
- Tên : QuanLyPhong.v_TimPhongTrong
- Kết quả thực hiện : Hiển thị danh sách các phòng còn trống
2 VIEW thống kê hóa đơn
1 loginQuanTri ANY PERMISSION
2 loginLeTan CONNECT SQL, VIEW ANY DATABASE
3 loginPhucVu CONNECT SQL, VIEW ANY DATABASE
4 loginQuanLyPhong CONNECT SQL, VIEW ANY DATABASE
5 loginKhachHang CONNECT SQL, VIEW ANY DATABASE
6 loginGD CONNECT SQL, VIEW ANY DATABASE
2 Tạo các user
Trang 10STT Tên user Quyền
1 userQuanTri - Cập nhật bảng [QuanTri].[NHANVIEN]- Cấp quyền cho người sử dụng
1 db_QuanTri - Cập nhật bảng [QuanTri].[NHANVIEN]- Cấp quyền cho người sử dụng
2 db_NV - Có quyền SELECT trên các schema QuanTri, LeTan,PhucVu, QuanLyPhong
Trang 11- db_QuanTri
Trang 13- db_NV
Trang 15- db_KH
Trang 17b) Cấp phát quyền cho user
- userLeTan
Trang 18- userKhachHang
- userGD
Trang 195 Cấp phát quyền cho role và user sử dụng các câu lệnh T-SQL
a) Cấp phát quyền cho role
- db_QuanTri
grant insert , update , delete on SCHEMA :: quantri to db_QuanTri deny insert , update , delete on SCHEMA :: quanlyphong to db_QuanTri deny insert , update , delete on SCHEMA :: letan to db_QuanTri deny insert , update , delete on SCHEMA :: phucvu to db_QuanTri
- db_NV
grant select on SCHEMA :: phucvu to db_NV
grant select on SCHEMA :: letan to db_NV
grant select on SCHEMA :: quanlyphong to db_NV
grant select on SCHEMA :: quantri to db_NV
- db_KH
grant select on quanlyphong phong to db_KH
grant select on quanlyphong giaphong to db_KH
grant select on phucvu dichvu to db_KH
grant select,insert on letan datphong to db_KH
b) Cấp phát quyền cho user
grant select on letan v_ThongKe to userGD
VI Mã nguồn một số thủ tục, hàm, trigger.
DECLARE @Tien money
SET @Tien = ( @ThoiGian * @Gia )
INSERT INTO [LeTan] [CTHD]
values ( @mahd , @SoPhong , @ThoiGian , @Gia , @Tien )
Trang 20if exists ( select * from [LeTan] [MUONTRAPHONG]
where SoPhong = @phong and NgayTra is null)
BEGIN
UPDATE [LeTan] [MUONTRAPHONG] SET NgayTra = getdate ()
WHERE SoPhong = @phong
declare @tien money
declare @gia money
select @gia = GiaDV from phucvu dichvu where MaDV = @madv set @tien = @gia * @sl
insert into phucvu sudungdv values ( @makh , @madv , @sl , @tien ) END
else
BEGIN
print 'KHACH HANG K TON TAI!!!!!!!'
END
e) Thủ tục in hóa đơn thanh toán
CREATE PROC LeTan proc_INHD ( @makh MA )
WITH EXECUTE AS CALLER
Trang 21print ' =================='
declare @ten TEN
select @ten = HoTen from letan khachhang where MaKH = @makh
print 'Ho ten khach hang : ' + @ten
declare @mahd int
select @mahd = MaHD from letan hoadon where MaKh = @makh
declare @tienphong money
select @tienphong = SUM ( ThanhTien ) from letan CTHD
where MaHD = @mahd
print 'Tien phong : ' + cast ( @tienphong as
varchar ( 20 ))+ ' VND'
declare @tiendv money
select @tiendv = SUM ( ThanhTien ) from phucvu sudungdv
where MaKH = @makh
print 'Tien su dung dich vu : ' + cast ( @tiendv as varchar ( 20 ))
declare @tong money
set @tong = @tienphong + @tiendv
print 'Tong tien phai tra : ' + cast ( @tong as varchar ( 20 ))+ ' VND'
END
else
print 'KHACH HANG K TON TAI'
2 Hàm
Hàm tìm kiếm, thống kê trên dữ liệu có quan hệ đa cấp
CREATE FUNCTION fn_TimKiem ( @MaNV MA )
RETURNS
@Temple TABLE ( MaNV MA PRIMARY KEY ,
HoTen TEN not null,
NgaySinh datetime ,
DiaChi varchar ( 100 ),
NgayLam datetime not null,
ChucVu varchar ( 20 ) not null,
CapTren MA )
AS
BEGIN
DECLARE @RowsAdded int
DECLARE @reports TABLE ( MaNV MA PRIMARY KEY ,
HoTen TEN not null,
NgaySinh datetime ,
DiaChi varchar ( 100 ),
NgayLam datetime not null,
ChucVu varchar ( 20 ) not null,
CapTren MA ,
processed tinyint default 0 )
INSERT @reports SELECT MaNV , HoTen , NgaySinh , DiaChi ,
NgayLam , ChucVu , CapTren , 0
FROM [QuanTri] [NHANVIEN] WHERE MaNV = @MaNV
Trang 22SET @RowsAdded = @@rowcount
a) Trigger cấm không cho tạo LOGIN
CREATE TRIGGER tg_TaoLogin ON ALL SERVER
FOR CREATE_LOGIN
AS
Rollback
Begin Tran Save_to_data_log
INSERT INTO [DoAn.QLKS] [dbo] [TaoLogin] ( [LogDate] , [UserName] ) VALUES ( GetDate (), SYSTEM_USER )
Commit tran Save_to_data_log
RAISERROR ( 'Co loi: KHONG THE TAO MOI LOGIN!!!!' , 16 , 1 )
b) Trigger khi chèn dữ liệu vào bảng [LeTan].[DATPHONG]
CREATE TRIGGER tg_DATPHONG ON [LeTan] [DATPHONG]
INSTEAD OF INSERT
AS
declare @ten TEN
declare @tuoi int
declare @gioitinh varchar ( 3 )
declare @diachi varchar ( 100 )
declare @nghe varchar ( 100 )
declare @sdt varchar ( 11 )
declare @cmnd varchar ( 9 )
declare @phong MA
select @ten = HoTen , @tuoi = Tuoi , @gioitinh = GioiTinh ,
@diachi = DiaChi , @nghe = NgheNghiep , @sdt = SDT , @cmnd = CMND ,
@phong = Phong from inserted
if exists ( select * from [QuanLyPhong] [PHONG] where
SoPhong = @phong and TrangThai = 'Trong' )
BEGIN
Trang 23insert into [LeTan] [DATPHONG]
values ( @ten , @tuoi , @gioitinh , @diachi , @nghe , @sdt , @cmnd , @phong ,
update [QuanLyPhong] [PHONG] set TrangThai = 'Da Dat'
where SoPhong = @phong
c) Trigger khi chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
CREATE TRIGGER tg_MUON ON [LeTan] [MUONTRAPHONG]
select @cmnd = CMND from [LeTan] [KHACHHANG] where MaKH = @ma
if exists ( select * from [QuanLyPhong] [PHONG]
where SoPhong = @phong and TrangThai = 'Trong' )
BEGIN
insert into [LeTan] [MUONTRAPHONG]
values ( @ma , @phong , getdate (),null)
update [QuanLyPhong] [PHONG] set TrangThai = 'full'
where SoPhong = @phong
END
else if exists ( select * from [LeTan] [DATPHONG]
where CMND = @cmnd )
BEGIN
insert into [LeTan] [MUONTRAPHONG]
values ( @ma , @phong , getdate (),null)
update [QuanLyPhong] [PHONG] set TrangThai = 'full'
where SoPhong = @phong
delete from [LeTan] [DATPHONG]
where CMND = @cmnd and Phong = @phong
d) Trigger khi thực hiện trả phòng
CREATE TRIGGER tg_TRA ON [LeTan] [MUONTRAPHONG]
Trang 24INSTEAD OF UPDATE
AS
declare @ma MA
declare @phong MA
declare @ngaymuon datetime
declare @ngaytra datetime
select @ma = MaKH , @phong = SoPhong , @ngaymuon = NgayMuon from inserted
if exists ( select * from deleted where NgayTra is null) AND
exists ( select * from inserted where NgayTra is not null)
BEGIN
update [LeTan] [MUONTRAPHONG] set NgayTra = getdate ()
where SoPhong = @phong
update [QuanLyPhong] [PHONG] set TrangThai = default
where SoPhong = @phong
declare @mahd int
declare @thoigian int
declare @gia money
declare @loaiphong varchar ( 20 )
select @ngaytra = NgayTra from letan muontraphong
where SoPhong = @phong
if not exists ( select MaKH from letan HOADON where MaKH = @ma ) BEGIN
insert into [LeTan] [HOADON] values ( @ma , getdate ())
select @mahd = MaHD from letan hoadon where MaKH = @ma select @loaiphong = LoaiPhong from [QuanLyPhong] [PHONG] where SoPhong = @phong
select @gia = Gia from [QuanLyPhong] [GIAPHONG]
where LoaiPhong = @loaiphong
select @thoigian = DATEDIFF ( day , @ngaymuon , @ngaytra )
select @gia = Gia from [QuanLyPhong] [GIAPHONG]
where LoaiPhong = @loaiphong
select @thoigian = DATEDIFF ( day , @ngaymuon , @ngaytra )
if ( @thoigian > 0 )
BEGIN
exec proc_NhapCTHD @mahd , @phong , @thoigian , @gia END
Trang 25else BEGIN
set @thoigian = @thoigian + 1 exec proc_NhapCTHD @mahd , @phong , @thoigian , @gia END
END
END
else
BEGIN
update [LeTan] [MUONTRAPHONG]
set MaKH = @ma , SoPhong = @phong , NgayMuon = @ngaymuon
where SoPhong = @phong
END
e) Trigger nhập bảng [QuanTri].[NHANVIEN]
CREATE TRIGGER tg_NV ON [QuanTri] [NHANVIEN]
FOR INSERT , UPDATE
AS
declare @ns datetime
declare @ngaylam datetime
declare @tuoi int
select @ns = NgaySinh , @ngaylam = NgayLam from inserted
select @tuoi = DATEDIFF ( year , @ns , @ngaylam )
Đăng nhập với userQuanTri
execute as user = 'userQuanTri'
Nhân viên quản trị cập nhật thêm danh sách nhân viên mới
insert quantri nhanvien values ( 'NV4' , 'Nguyen Van
update quantri nhanvien set HoTen = 'Tran Trung B' where MaNV
delete from quantri nhanvien where MaNV = 'NV4'
Nhân viên quản tri cấp quyền cho người sử dụng
grant select on phucvu DICHVU to userKhachHang
Đăng nhập với userLeTan
revert
execute as user = 'userLeTan'
Nhân viên lễ tân nhập các thông tin về khách hàng khi khách hàng có nhu cầu thuê phòng
Trang 26insert letan khachhang values ( 'KH4' , 'Nguyen Van
update letan khachhang set HoTen = 'Tran Trung B' where MaKH
delete from letan khachhang where MaKH = 'KH4'
Nhân viên lễ tân tiếp nhận yêu cầu thuê phòng và trả phòng của khách hàng
execute as user = 'userPhucVu'
Nhân viên phục vu cập nhật thông tin về các dịch vụ và việc sử dụng các dịch vụ của khách hàng
insert into phucvu dichvu values ( 'DT' , 'Dien
update phucvu dichvu set GiaDV = 1800 where MaDV = 'DT'
delete from phucvu dichvu where MaDV = 'DT'
exec proc_DV 'KH1' , 'DT' , 5
Đăng nhập với userQuanLyPhong
revert
execute as user = 'userQuanLyPhong'
Nhân viên quản lý phòng cập nhật thông tin về phòng và giá phòng
insert into quanlyphong phong values ( '0910' , 30 , 'N5' , 2 , 'Loai
update quanlyphong phong set LoaiPhong = 'Loai 2' where
SoPhong = '0910'
delete from quanlyphong phong where SoPhong = '0910'
insert into quanlyphong giaphong values ( 'Loai 1' , 100000 ) update quanlyphong giaphong set Gia = 120000 where
LoaiPhong = 'Loai 1'
delete from quanlyphong giaphong where LoaiPhong = 'Loai 1'
select * from QuanLyPhong v_timphongtrong
Đăng nhập với userGD
revert
execute as user = 'userGD'
Giám đốc được quyền xem tất cả các hoạt động của khách sạn
select * from quantri nhanvien
select * from letan khachhang
select * from letan datphong
select * from letan muontraphong
select * from letan hoadon