Tải bản đầy đủ (.doc) (27 trang)

Đồ án Quản lý khách sạn

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (764.52 KB, 27 trang )

I. 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ác
thô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ập
nhậ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ạng
phò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ấp
quyề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ủa
khá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ái
củ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, ăn
uố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ách
sạ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
LoaiPhong Loại phòng Varchar 20
Giá Giá Money 
b) [QuanLyPhong].[PHONG]
Column Name Description Datatype Length Allow Null


1
SoPhong Số phòng. Khóa chính MA:varchar 10
DienTich Diện tích Int 
ViTri Vị trí Varchar 15 
SoGiuong Số giường Int 
LoaiPhong Loại phòng. Khóa ngoại của
GIAPHONG.GiaPhong
Varchar 20
TienNghi Tiện nghi Varchar 200 
TrangThai Trạng thái Varchar 10
c) [LeTan].[KHACHHANG]
Column Name Description Datatype Length Allow Null
MaKH Mã khách hàng. Khóa chính MA:varchar 10
HoTen Họ tên TEN:varchar 50
Tuoi Tuổi Int 
GioiTinh Giới tính Varchar 3 
DiaChi Địa chỉ Varchar 100 
NgheNghiep Nghề nghiệp Varchar 100 
SDT Số điện thoại Varchar 11 
CMND Chứng minh nhân dân Varchar 9
d) [QuanTri].[NHANVIEN]
Column Name Description Datatype Length Allow Null
2
MaNV Mã nhân viên. Khóa chính MA:varchar 10
HoTen Họ tên TEN:varchar 50
NgaySinh Ngày sinh Datetime 
DiaChi Địa chỉ Varchar 100 
NgayLam Ngày làm việc Datetime
ChucVu Chức vụ Varchar 20
CapTren Cập trên trực tiếp quản lý.

Khóa ngoại của
NHANVIEN.MaNV
MA:varchar 10 
e) [LeTan].[MUONTRAPHONG]
Column Name Description Datatype Length Allow Null
MaKH Mã khách hàng. Khóa chính.
Khóa ngoại của
KHACHHANG.MaKH
MA:varchar 10
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
NgayTra Ngày trả 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
NgayHD Ngày hóa đơn Datetime 
g) [LeTan].[CTHD]
Column Name Description Datatype Length Allow Null
3
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
Gia Giá Money 
DichVu Tiền sử dụng dịch vụ Money 
ThanhTien Thành tiền Money 
h) [PhucVu].[DICHVU]
Column Name Description Datatype Length Allow Null
MaDV Mã dich vụ. Khóa chính MA:varchar 10
TenDV Tên dịch vụ Varchar 40
GiaDV Giá dịch vụ Varchar 20 
DonViTinh Đơn vị tính Varchar 5 
i) [LeTan].[DATPHONG]
Column Name Description Datatype Length Allow Null
HoTen Họ tên TEN:varchar 50
Tuoi Tuổi Int 
GioiTinh Giới tính Varchar 3 
DiaChi Địa chỉ Varchar 100 
NgheNghiep Nghề nghiệp Varchar 100 
SDT Số điện thoại Varchar 11 
CMND Chứng minh nhân dân Varchar 9
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]
4
Column Name Description Datatype Length Allow Null
MaKH Mã khách hàng. Khóa chính.
Khóa ngoại của

KHACHHANG.MaKH
MA:varchar 10
MaDV Mã dịch vụ. Khóa chính.
Khóa ngoại của
DICHVU.MaDV
MA:varchar 10
SL(theo dvtinh) Giá dịch vụ Int 
ThanhTien Tiền sử dụng dịch vụ Money 
2. Sơ đồ quan hệ giữa các bảng.
III. Mô tả các thủ tục, hàm và trigger.
1. Các thủ tục
a) Thủ tục nhập CTHD
- Tên : LeTan.proc_NhapCTHD
- Kết quả thực hiện : Nhập thông tin vào bảng [LeTan].[CTHD]
- Các bước thực hiện :
+ 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
5
- 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]
c) Thủ tục trả phòng
- Tên : LeTan.proc_TRA
- Kết quả thực hiện :
+ Cập nhật NgayTra của bảng [LeTan].[MUONTRAPHONG]

- Các bước thực hiện :
+ Nhập SoPhong cần trả.
+ Kiểm tra NgayTra của phòng khác null hay không?
Nếu có:
+ Cập nhật NgayTra trong bảng [LeTan].[MUONTRAPHONG]
bằng ngày hệ thống.
Ngược lại
+ Thông báo phòng đã được trả.
d) Thủ tục nhập bảng SUDUNGDV
- Tên : PhucVu.proc_DV
- Kết quả thực hiện : Nhập thông tin vào bảng [PhucVu].[SUDUNGDV]
- Các bước thực hiện :
+ 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
6
+ 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
2. Các hàm
Hàm tìm kiếm, thống kê trên dữ liệu có quan hệ đa cấp
- Tên : fn_TimKiem
- Kết quả thực hiện : Tìm kiếm tất cả nhân viên cấp dưới của một nhân viên
nào đó.
- Các bước thực hiện :
+ 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
+ SELECT bảng tạm
3. Các trigger
a) Trigger cấm không cho tạo LOGIN
- Tên : tg_TaoLogin
- Kết quả thực hiện : không cho người dung tạo mới login.
- Các bước thực hiện :
+ Khi có 1 người dùng tạo mới 1 login thì hệ thống sẽ lưu lại user_name tạo
login đó và ngày tạ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 :
7
+ 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 trong
bả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 = full
Xó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 :
8
+ 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ống
Cập nhật lại TrangThai cua phong = Trong.
Chèn dữ liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD]
+ Ngược lại :
Cập nhật lại thông tin trong bảng LeTan].[MUONTRAPHONG]
e) Trigger nhập bảng [QuanTri].[NHANVIEN]
- Tên : tg_NV
- Kết quả thực hiện : Kiểm tra nhân viên đã đến tuổi lao động chưa.
- Các bước thực hiện :
+ 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áo
ngườ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.
- Tên : LeTan.v_ThongKe
- Kết quả thực hiện : Hiển thị tổng hóa đơn được lập và tổng doanh thu của
khách sạn.
V. Quản trị CSDL
1. Tạo các login
STT Tên Login Quyề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
9
STT 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
2 userLeTan
- Có mọi quyền trong các bảng thuộc schema LeTan
(DATPHONG,MUONTRAPHONG,HOADON,CTHD)
- Có quyền SELECT đối với các bảng khác (DICHVU,
GIAPHONG, PHONG, NHANVIEN)
3 userPhucVu
- Có mọi quyền trong các bảng thuộc schema PhucVu
(DICHVU)
- Có quyền SELECT đối với các bảng khác
(DATPHONG,MUONTRAPHONG,HOADON,CTHD,
GIAPHONG, PHONG, NHANVIEN)
4 userQuanLyPhong
- Có mọi quyền trong các bảng thuộc schema
QuanLyPhong (GIAPHONG, PHONG)
- Có quyền SELECT đối với các bảng khác
(DATPHONG,MUONTRAPHONG,HOADON,CTHD,
DICHVU, NHANVIEN)
5 userKhachHang
- Có quyền cập nhật bảng [LeTan].[DATPHONG]
- Có quyền SELECT đối với các bảng khác
(GIAPHONG, PHONG, DICHVU)
6 userGD

Có quyền SELECT tất cả các bảng
3. Tạo các role
STT Tên db_role Quyền
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
3 db_KH
- Có quyền cập nhật bảng [LeTan].[DATPHONG]
- Có quyền SELECT đối với các bảng khác
(GIAPHONG, PHONG, DICHVU)
4. Cấp phát quyền cho role và user sử dụng giao diện MS SQL Management
Studio
a) Cấp phát quyền cho role
10
- db_QuanTri
11
12
- db_NV
13
14
- db_KH
15
16
b) Cấp phát quyền cho user
- userLeTan
17
- userKhachHang

- userGD
18
5. 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
- 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 một số thủ tục, hàm, trigger.
1. 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)
19
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 thanh 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'
20
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'
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
21
SET @RowsAdded = @@rowcount
WHILE @RowsAdded > 0
BEGIN
UPDATE @reports SET processed = 1 WHERE processed = 0
INSERT @reports SELECT NV.MaNV, NV.HoTen, NV.NgaySinh,
NV.DiaChi, NV.NgayLam, NV.ChucVu, NV.CapTren, 0
FROM [QuanTri].[NHANVIEN] NV, @reports r
WHERE NV.CapTren = r.MaNV and r.processed = 1
UPDATE @reports SET processed = 2
WHERE processed = 1
SET @RowsAdded = @@rowcount
END
INSERT @Temple
SELECT MaNV, HoTen, NgaySinh, DiaChi, NgayLam, ChucVu, CapTren

FROM @reports
RETURN
END
3. 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 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
22
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 khi chèn dữ 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 khi thực hiện trả phòng
CREATE TRIGGER tg_TRA ON [LeTan].[MUONTRAPHONG]
23
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 + 1
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
24
else
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)
if(@tuoi<18)
BEGIN
ROLLBACK TRANSACTION
RAISERROR('CHUA DEN TUOI LAM VIEC!!!!!!!!!!!',16,1)
RETURN
END
VII. Kịch bản kiểm tra các chức năng của hệ thống.
USE [DoAn.QLKS]
GO
Đă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
C','01/23/1990','Ha Noi','06/12/2012','Nhan vien phuc
vu','NV2')
update quantri.nhanvien set HoTen= 'Tran Trung B' where MaNV
= 'NV4'
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

25

×