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...
I Mô tả chức hệ thống Phân quyền cho đối tượng sử dụng - Nhân viên lễ tân : nhập thông tin khách hàng tiếp đón khách, thơng tin giao dịch với khách hàng, toán cho khách hàng họ trả phòng - Nhân viên phục vụ : nhập thông tin sử dụng dịch vụ khách hàng, cập nhật 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ị phòng, phân hạng phòng, giá thuê loại phịng, thơng tin thay đổi 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 cấp quyền sử dụng cho người có nhiệm vụ - Giám đốc khách sạn : xem thông tin tổng hợp công việc kinh doanh khách sạn Chức hệ thống - Quản lý danh sách phòng, tiện nghi phòng, số giường trạng thái phòng - Quản lý yêu cầu đặt phòng, thuê phòng khách hàng - Quản lý thông tin khách hàng, ghi nhận khách hàng đặc biệt có sách ưu tiên khách hàng quen - Theo dõi thống kê việc sử dụng dịch vụ khách hàng (điện thoại, ăn uống, giặt là…) - Cho phép in hóa đơn tốn khách hàng trả phịng - Hệ thống in báo cáo thống kê tình hình kinh doanh khách sạn II Thiết kế CSDL Cấu trúc bảng a) [QuanLyPhong].[GIAPHONG] Column Name LoaiPho ng Giá Description Datatype Lengt h Loại phòng Varchar Giá Money b) [QuanLyPhong].[PHONG] Allow Null 20 Column Name SoPhong Description Datatyp e Số phịng Khóa Lengt h MA:var char Int 10 15 Allow Null DienTich Diện tích ViTri Vị trí Varchar SoGiuon Số giường Int LoaiPho Loại phịng Khóa ngoại Varchar 20 g GIAPHONG.GiaPhong ng TienNghi Tiện nghi Varchar 200 TrangTh Trạng thái Varchar 10 c) [LeTan].[KHACHHANG] Column Name MaKH HoTen Tuoi Description Datatype Lengt h Mã khách hàng Khóa MA:varc har Họ tên TEN:var char Tuổi Int Allow Null 10 50 GioiTinh Giới tính Varchar DiaChi Địa Varchar 100 NgheNgh Nghề nghiệp Varchar 100 SDT Số điện thoại Varchar 11 CMND Chứng minh nhân dân Varchar iep d) [QuanTri].[NHANVIEN] Column Name MaNV HoTen NgaySin Description Datatype Lengt h Mã nhân viên Khóa MA:varc har Họ tên TEN:var char Ngày sinh Datetime Allow Null 10 50 h DiaChi Địa Varchar 100 NgayLa Ngày làm việc Datetime ChucVu Chức vụ Varchar 20 MA:varc 10 m CapTren Cập trực tiếp quản lý Khóa ngoại NHANVIEN.MaNV har e) [LeTan].[MUONTRAPHONG] Column Name MaKH SoPhong NgayMu on NgayTra Description Datatyp e Mã khách hàng Khóa Khóa ngoại KHACHHANG.MaKH Lengt h MA:var char 10 Số phịng Khóa MA:var Khóa ngoại char PHONG.SoPhong Ngày mượn phịng Datetim e Allow Null 10 Ngày trả phòng Datetim e f) [LeTan].[HOADON] Column Name MaHD MaKH NgayHD Description Datatyp e Lengt h Mã hóa đơn Khóa MA:var char Mã khách hàng Khóa MA:var ngoại char KHACHHANG.MaKH Ngày hóa đơn Datetim e Allow Null 10 10 g) [LeTan].[CTHD] Column Name MaHD SoPhong ThoiGia n(ngay) Description Datatyp e Lengt h Mã hóa đơn Khóa MA:var Khóa ngoại char HOADON.MaHD Số phịng Khóa MA:var Khóa ngoại char PHONG.SoPhong Thời gian Int Allow Null 10 10 Gia Giá Money DichVu Tiền sử dụng dịch vụ Money ThanhTi Thành tiền Money en h) [PhucVu].[DICHVU] Column Name Description Datatyp e Lengt h Allow Null MaDV Mã dich vụ Khóa 10 Tên dịch vụ MA:var char Varchar TenDV GiaDV Giá dịch vụ Varchar 20 DonViTi Đơn vị tính Varchar 40 nh i) [LeTan].[DATPHONG] Column Name HoTen Description Datatype Lengt h Họ tên TEN:var char Int Allow Null 50 Tuoi Tuổi GioiTinh Giới tính Varchar DiaChi Địa Varchar 100 NgheNgh Nghề nghiệp Varchar 100 SDT Số điện thoại Varchar 11 CMND Chứng minh nhân dân Varchar iep Phong NgayDat NgayMu Phòng cần đặt Khóa TEN:var ngoại PHONG.SoPhong char Ngày đặt phịng Datetime Ngày mượn phòng 50 Datetime on j) [PhucVu].[SUDUNGDV] Column Name Description Datatyp e Lengt h Allow Null MaKH MaDV SL(theo dvtinh) ThanhTi Mã khách hàng Khóa Khóa ngoại KHACHHANG.MaKH Mã dịch vụ Khóa Khóa ngoại DICHVU.MaDV Giá dịch vụ MA:var char 10 MA:var char 10 Money Tiền sử dụng dịch vụ Int en Sơ đồ quan hệ bảng III Mô tả thủ tục, hàm trigger Các thủ tục a) Thủ tục nhập CTHD - Tên : LeTan.proc_NhapCTHD - Kết thực : Nhập thông tin vào bảng [LeTan].[CTHD] - Các bước thực : + Nhập MaDH, SoPhong, ThoiGian, Gia + Tính TinhTien = ThoiGian * Gia + Chèn liệu vào bảng [LeTan].[CTHD] b) Thủ tục nhập MUONTRAPHONG - Tên : LeTan.proc_MUON - Kết thực : Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG] - Các bước thực : + Nhập MaKH, SoPhong + Lấy NgayMuon = ngày hệ thống + Chèn liệu vào bảng [LeTan].[MUONTRAPHONG] c) Thủ tục trả phòng - Tên : LeTan.proc_TRA - Kết thực : + Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] - Các bước thực : + Nhập SoPhong cần trả + Kiểm tra NgayTra phịng khác null hay khơng? Nếu có: + Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] ngày hệ thống Ngược lại + Thơng báo phịng trả d) Thủ tục nhập bảng SUDUNGDV - Tên : PhucVu.proc_DV - Kết thực : Nhập thông tin vào bảng [PhucVu].[SUDUNGDV] - Các bước thực : + Nhập vao MaKH, MaDV, SL + Kiểm tra khách hàng có bảng KHACHHANG hay khơng Nếu có : + Lấy giá dịch vụ từ bảng DICHVU + Tính tiền = Gia*SL + Chèn liệu vào bảng [PhucVu].[SUDUNGDV] Ngược lại : Thông báo khách hàng không tồn e) Thủ tục in hóa đơn tốn - Tên : LeTan.proc_INHD - Kết thực : In hóa đơn cho khách hàng - Các bước thực : + Nhập MaKH + Kiểm tra khách hàng 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 khách hàng từ bảng HOADON CTHD +Tính tiền sử dụng dịch vụ khách hàng + Tính tổng tiền phải trả = tiền th 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 Các hàm Hàm tìm kiếm, thống kê liệu có quan hệ đa cấp - Tên : fn_TimKiem - Kết thực : Tìm kiếm tất nhân viên cấp nhân viên - Các bước thực : + Nhập mã nhân viên cần tìm kiếm + Tạo bảng tạm có cấu trúc giống với bảng gốc ([QuanTri].[NHANVIEN]) + Chèn thơng tin nhân viên có cấp mã nhân viên nhập vào + Tìm kiếm nhân viên có cấp mã nhân viên vừa chèn vào + SELECT bảng tạm Các trigger a) Trigger cấm không cho tạo LOGIN - Tên : tg_TaoLogin - Kết thực : không cho người dung tạo login - Các bước thực : + Khi có người dùng tạo login hệ thống lưu lại user_name tạo login ngày tạo + Thơng báo khơng thể tạo login b) Trigger chèn liệu vào bảng [LeTan].[DATPHONG] - Tên : tg_DATPHONG - Kết thực : + Nhập thông tin vào bảng [LeTan].[DATPHONG] + Cập nhật TrangThai phòng bảng [QuanLyPhong].[PHONG] - Các bước thực : + Lấy giá trị HoTen,Tuoi, GioiTinh, DiaChi, NgheNghiep, SDT, CMND, SoPhong từ liệu nhập vào + Kiểm tra TrangThai phòng ứng với giá trị SoPhong nhập vào bảng [QuanLyPhong].[PHONG] có cịn trống khơng Nếu có : + Chèn liệu vào bảng [LeTan].[DATPHONG] + Cập nhật TrangThai phòng bảng [QuanLyPhong] [PHONG] ‘Da Dat’ Ngược lại : + Thơng báo phịng có người c) Trigger chèn liệu vào bảng [LeTan].[MUONTRAPHONG] - Tên : tg_MUON - Kết thực : + Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG] + Cập nhật TrangThai phòng bảng [QuanLyPhong].[PHONG] + Xóa liệu bảng [LeTan].[DATPHONG] - Các bước thực : + Lấy giá trị MaKH, SoPhong, NgayMuon từ liệu nhập vào + Nếu phòng trống : Chèn liệu vào bảng [LeTan].[MUONTRAPHONG] Cập nhật trạng thái phòng = full + Nếu khách hàng đặt phịng trước : Chèn liệu vào bảng [LeTan].[MUONTRAPHONG] Cập nhật trạng thái phòng = full Xóa liệu bảng [LeTan].[DATPHONG] d) Trigger thực trả phòng - Tên : tg_TRA - Kết thực : + Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] + Cập nhật lại TrangThai cua phong = Trong + Chèn liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD] - Các bước thực : + Nếu NgayTra có thay đổi từ NULL sang NOT NULL : Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] = ngày hệ thống Cập nhật lại TrangThai cua phong = Trong Chèn liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD] + Ngược lại : Cập nhật lại thông tin bảng LeTan].[MUONTRAPHONG] e) Trigger nhập bảng [QuanTri].[NHANVIEN] - Tên : tg_NV - Kết thực : Kiểm tra nhân viên đến tuổi lao động chưa - Các bước thực : + Lấy giá trị NgaySinh, NgayLam từ liệu nhập vào + Tính tuổi nhân viên đến thời điểm làm việc Nếu tuổi < 18 thơng báo người chưa đủ tuổi làm việc IV Mơ tả View VIEW tìm phịng trống - Tên : QuanLyPhong.v_TimPhongTrong - Kết thực : Hiển thị danh sách phòng trống VIEW thống kê hóa đơn - Tên : LeTan.v_ThongKe - Kết thực : Hiển thị tổng hóa đơn lập tổng doanh thu khách sạn V Quản trị CSDL Tạo login STT Tên Login loginQuanTri loginLeTan loginPhucVu loginQuanLyPhong loginKhachHang loginGD Quyền ANY PERMISSION CONNECT SQL, VIEW ANY DATABASE CONNECT SQL, VIEW ANY DATABASE CONNECT SQL, VIEW ANY DATABASE CONNECT SQL, VIEW ANY DATABASE CONNECT SQL, VIEW ANY DATABASE 10 13 - db_NV 14 15 - db_KH 16 17 b) Cấp phát quyền cho user - userLeTan 18 - userKhachHang - userGD 19 Cấp phát quyền cho role user sử dụng câu lệnh T-SQL a) Cấp phát quyền cho role - db_QuanTri grant insert,update,delete on SCHEMA:: quantri deny insert,update,delete on SCHEMA:: quanlyphong deny insert,update,delete on SCHEMA:: letan deny insert,update,delete on SCHEMA:: phucvu to to to to db_QuanTri db_QuanTri db_QuanTri db_QuanTri - db_NV grant grant grant grant select select select select on on on on SCHEMA:: SCHEMA:: SCHEMA:: SCHEMA:: phucvu letan quanlyphong quantri to to to to db_NV db_NV db_NV db_NV - db_KH grant grant grant grant select on quanlyphong.phong select on quanlyphong.giaphong select on phucvu.dichvu select,insert on letan.datphong to to to to db_KH db_KH db_KH db_KH b) Cấp phát quyền cho user - userLeTan grant select on quanlyphong.v_TimPhongTrong to userKhachHang - userKhachHang grant select on quanlyphong.v_TimPhongTrong to userKhachHang - userGD grant select on letan.v_ThongKe to userGD VI Mã nguồn số thủ tục, hàm, trigger Thủ tục a) Thủ tục nhập CTHD CREATE PROC LeTan.proc_NhapCTHD ( @mahd int, @SoPhong MA, @ThoiGian int, @Gia money ) WITH EXECUTE AS OWNER AS DECLARE @Tien money SET @Tien = (@ThoiGian*@Gia) INSERT INTO [LeTan].[CTHD] values(@mahd,@SoPhong,@ThoiGian,@Gia,@Tien) 20 b) Thủ tục nhập MUONTRAPHONG CREATE PROC LeTan.proc_MUON ( @MaKH MA, @SoPhong MA ) AS INSERT INTO [LeTan].[MUONTRAPHONG] (MaKH,SoPhong,NgayMuon) values (@MaKH,@SoPhong,getdate()) c) Thủ tục trả phòng CREATE PROC LeTan.proc_TRA ( @phong MA) AS if exists (select * from [LeTan].[MUONTRAPHONG] where SoPhong=@phong and NgayTra is null) BEGIN UPDATE [LeTan].[MUONTRAPHONG] SET NgayTra=getdate() WHERE SoPhong=@phong END else BEGIN print'PHONG DA TRA!!!!!!!' END d) Thủ tục nhập bảng SUDUNGDV CREATE PROC PhucVu.proc_DV (@makh MA,@madv MA, @sl int) AS if exists (select * from [LeTan].[KHACHHANG] where MaKH=@makh) BEGIN 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 toán CREATE PROC LeTan.proc_INHD (@makh MA) WITH EXECUTE AS CALLER AS if exists(select * from letan.hoadon where MaKH = @makh) BEGIN print ' HOA DON THANH TOAN' 21 print ' ==================' 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)) +' VND' 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' Hàm Hàm tìm kiếm, thống kê 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, FROM [QuanTri].[NHANVIEN] WHERE MaNV = @MaNV 22 SET @RowsAdded = @@rowcount WHILE @RowsAdded > BEGIN UPDATE @reports SET processed = WHERE processed = INSERT @reports SELECT NV.MaNV, NV.HoTen, NV.NgaySinh, NV.DiaChi, NV.NgayLam, NV.ChucVu, NV.CapTren, FROM [QuanTri].[NHANVIEN] NV, @reports r WHERE NV.CapTren = r.MaNV and r.processed = UPDATE @reports SET processed = WHERE processed = SET @RowsAdded = @@rowcount END INSERT @Temple SELECT MaNV, HoTen, NgaySinh, DiaChi, NgayLam, ChucVu, CapTren FROM @reports RETURN END Trigger 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 chèn 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 23 insert into [LeTan].[DATPHONG] values(@ten,@tuoi,@gioitinh,@diachi,@nghe,@sdt,@cmnd,@phong, getdate()) update [QuanLyPhong].[PHONG] set TrangThai='Da Dat' where SoPhong=@phong END else BEGIN ROLLBACK TRANSACTION RAISERROR('PHONG NAY DA CO NGUOI O!!!!!!!!!!!',16,1) RETURN END c) Trigger chèn liệu vào bảng [LeTan].[MUONTRAPHONG] CREATE TRIGGER tg_MUON ON [LeTan].[MUONTRAPHONG] INSTEAD OF INSERT AS declare @ma MA declare @phong MA select @ma=MaKH,@phong=SoPhong from inserted declare @cmnd varchar(9) 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 END else BEGIN ROLLBACK TRANSACTION print 'PHONG DA CO NGUOI O!!!!!!' RETURN END d) Trigger thực trả phòng CREATE TRIGGER tg_TRA ON [LeTan].[MUONTRAPHONG] 24 INSTEAD 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) if(@thoigian>0) BEGIN exec proc_NhapCTHD @mahd,@phong,@thoigian,@gia END else BEGIN set @thoigian = @thoigian + exec proc_NhapCTHD @mahd,@phong,@thoigian,@gia END END else BEGIN 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) if(@thoigian>0) BEGIN exec proc_NhapCTHD @mahd,@phong,@thoigian,@gia END 25 else BEGIN set @thoigian = @thoigian + 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) if(@tuoi