Professional Documents
Culture Documents
Qua khảo sát hoạt động của bệnh viện ta thấy cần phải quản lý dữ liệu
thông tin của các Bác Sĩ làm việc trong bệnh, các Dịch Vụ khám được
cung cấp, các loại Thuốc, thông tin của các BệnhNhân, các Hóa Đơn
đóng tiền khi sử dụng dịch vụ và để giúp việc quản lý khám bệnh dễ dàng
hơn cũng như sau này:
Bác sĩ: mã bác sĩ , tên bác sĩ, chuyên ngành. Quy định mỗi bác sĩ chỉ có một
mã bác sĩ
Bệnh nhân: là những người đến khám bệnh và sử dụng dịch vụ.
Mỗi bệnh nhân khi đến khám bênh cần khai báo các thông tin trên để dễ dàng
hướng dẫn đến phòng khám phù hợp, lập đơn thuốc và hóa đơn. Mỗi bệnh
nhân bao gồm các thông tin: mã bệnh nhân, tên bệnh nhân, giới tính, ngày
sinh, địa chỉ, số điện thoại,tình trạng sức khỏe.
Các Dịch Vụ khám được xác định bởi: mã dịch vụ, tên dịch vụ, đơn giá.
Còn Thuốc bao gồm thông tin: mã thuốc, tên thuốc đơn giá.
Bệnh nhân cần có đơn thuốc phiếu này sẽ do bác sĩ lập gồm có: mã đơn
thuốc,mã bác sĩ, mã bệnh nhân. Từ đơn thuốc yêu cầu có một đơn thuốc chi
tiết có:mã đơn thuốc, mã thuốc, số lượng để quản lý được các loại thuốc đã
được phát cho ai, khi nào.
Bệnh nhân cần qua bộ phận thanh toán để nộp phí khám bênh Hoá Đơn bảng
có mẫu như sau: mã hóa đơn, mã đơn thuốc, mã bệnh nhân, ngày lập, tổng
tiền. Từ những hóa đơn đó chúng ta phải có một chi tiết Hóa Đơn- Dịch Vụ
gồm: mã hóa đơn, mã dịch vụ, số lượng để biết chi tiết về dịch vụ đã được sử
dụng.
1
tblCT_DONTHUOC(sMaDT, sMaThuoc, iSoLuong)
tblDICHVUKHAM( sMaDV, sTenDV, fDonGia)
tblHOADONDV(sMaHD, sMaDV,fSoLuong)
2
TT Tên Thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú
1 sMaDT Varchar(10) PK Mã đơn thuốc
2 sMaBS Nvarchar(25) Mã bác sĩ
3 sMaBN Nvarchar(25) Mã bệnh nhân
*tblCT_DONTHUOC
*tblHOADONDV
--Tạo database
create database qlyKhamBenh;
use qlyKhamBenh;
go
);
--Tạo bảng chi tiết đơn thuốc và ràng buộc
create table tblCT_DonThuoc(
sMaDT varchar (10) not null,
sMaThuoc varchar (10)not null ,
iSoLuong int check (iSoLuong>0),
constraint PK_Ma primary key (sMaDT,sMaThuoc),
foreign key (sMaThuoc) references tblThuoc(sMaThuoc),
foreign key (sMaDT) references tblDonThuoc(sMaDT)
);
--Tạo bảng dịch vụ khám
create table tblDichVuKham(
sMaDV varchar (10) primary key not null,
sTenDV nvarchar (30) null,
fDonGia float
);
6
('BS05',N'Nguyễn Tuấn',N'Da liễu')
7
-- chèn dữ liệu vào bảng tblCT_DT
INSERT INTO tblCT_DonThuoc(sMaDT,sMaThuoc,iSoLuong)
VALUES ('DT02','T01',5),
('DT01','T02',4),
('DT03','T03',7),
('DT05','T04',4),
('DT04','T05',9)
8
-- chèn dữ liệu vào bảng tblHoaDon
INSERT INTO tblHoaDon(sMaHD,sMaBN,sMaDT,dNgayLap,fTongTien)
VALUES ('HD01','BN01','DT01','06/08/2021',708000),
('HD02','BN02','DT02','06/08/2020',5550000),
('HD03','BN04','DT03','06/08/2021',7300000),
('HD04','BN05','DT04','06/08/2020',900000),
('HD05','BN03','DT05','06/08/2021',5500000)
9
Sơ đồ quan hệ giữa các bảng
10
2. Tạo view cho biết hoá đơn có tổng tiền trên 1000000
CREATE VIEW vvHoaDonTongTien1000000
AS
SELECT *FROM dbo.tblHoaDon
WHERE fTongTien>1000000
11
4. Tạo view cho biết tên thuốc có số lượng bán Lớn hơn 6
CREATE VIEW vvTenthuoctren6
AS
SELECT sTenThuoc FROM dbo.tblCT_DonThuoc,dbo.tblThuoc
WHERE iSoLuong>6 AND tblCT_DonThuoc.sMaThuoc=tblThuoc.sMaThuoc
5. Tạo view cho biết tên bệnh nhân, số điện thoại có tổng tiền lớn nhất
CREATE VIEW vvBenNhanTongTienMax
AS
SELECT sTenBN, iSodienthoai FROM dbo.tblBenhNhan,dbo.tblHoaDon
WHERE fTongTien = (SELECT MAX(fTongTien) FROM dbo.tblHoaDon)
AND tblHoaDon.sMaBN=tblBenhNhan.sMaBN
1. Tạo Proc tính tổng tiền đã mua hàng của một bệnh nào đó theo Mã bệnh
nhân
12
CREATE PROC prsumTienBenhNhanTheoMa(@maBN nchar(30))
AS
BEGIN
DECLARE @fsum FLOAT
SELECT @fsum = SUM(iSoLuong*fGiaThuoc)
FROM dbo.tblThuoc,dbo.tblCT_DonThuoc,dbo.tblDonThuoc
WHERE tblCT_DonThuoc.sMaThuoc=tblThuoc.sMaThuoc
AND dbo.tblCT_DonThuoc.sMaDT=dbo.tblDonThuoc.sMaDT AND
@maBN=sMaBN
SELECT @fsum AS[Tổng Tiên]
END
EXEC prsumTienBenhNhanTheoMa 'BN01'
SELECT *FROM dbo.tblBenhNhan
2. Tạo Proc cho biết tên thuốc đã được mua bởi một bệnh nhân nào đó (Theo
số điện thoại)
CREATE PROC prTenThuoc (@sdt int)
AS
BEGIN
SELECT sTenThuoc
FROM dbo.tblBenhNhan, dbo.tblThuoc,
dbo.tblCT_DonThuoc,dbo.tblDonThuoc
WHERE dbo.tblBenhNhan.sMaBN=dbo.tblDonThuoc.sMaBN AND
dbo.tblDonThuoc.sMaDT= dbo.tblCT_DonThuoc.sMaDT
AND dbo.tblCT_DonThuoc.sMaThuoc=dbo.tblThuoc.sMaThuoc AND @sdt
=iSodienthoai
END
13
3. Tạo Pro cho biết tổng số tiền Thuốc đã bán của một tháng, một năm nào đó
CREATE PROC prTienThuocTheoNam(@nam int, @thang int )
AS
BEGIN
DECLARE @fsumTien float
SELECT @fsumTien = fTongTien
FROM dbo.tblHoaDon
WHERE @nam = YEAR(dNgayLap) AND @thang = MONTH(dNgayLap)
SELECT @fsumTien
END
1. Trigger đảm bảo ngày xuất hóa đơn phải lớn hơn hoặc bằng ngày hiện tại.
14
CREATE TRIGGER trg_ngaylap on tblHoaDon INSTEAD OF INSERT,
UPDATE
AS
BEGIN
DECLARE @dNgayLap datetime
SELECT @dNgaylap = dNgayLap FROM inserted
BEGIN
IF(@dNgayLap <= GETDATE())
PRINT N'Cập nhật thành công'
ELSE
BEGIN
PRINT N'Ngày xuất hóa đớn phải nhỏ hơn ngày hiện tại'
ROLLBACK TRAN
END
END
END;
INSERT INTO
tblHoaDon(sMaHD,sMaBN,sMaDT,dNgayLap,fTongTien)
VALUES ('HD01','BN01','DT01','10/12/2021',708000);
2. Trigger kiểm tra tính chính xác khi nhập số điện thoại của bệnh nhân
CREATE TRIGGER trg_ktsdt on tblBenhNhan FOR INSERT,UPDATE
AS
BEGIN
DECLARE @sdt nvarchar(11)
SELECT @sdt = (SELECT iSodienthoai FROM INSERTED)
IF (LEN(@sdt) <10 or LEN (@sdt)>10)
BEGIN
PRINT N'Độ dài số điện thoại phải là 10 chữ số'
ROLLBACK TRAN
END
END;
INSERT INTO
tblBenhNhan(sMaBN,sTenBN,sGioiTinh,dNgaySinh,sDiaChi,iSodienthoai,sTinhtr
angsuckhoe)
VALUES ('BN11',N'Nguyễn Ngọc',N'Nữ','06/03/1999',N'Hà Nội
','023772457',N'Sốt');
3. Trigger đảm bảo giá nhập hàng luôn lớn hơn 0.
CREATE TRIGGER trg_gianhaplonhon0 on tblThuoc FOR INSERT,
UPDATE
AS
15
BEGIN
DECLARE @fGiaNhap float
SELECT @fGiaNhap = (SELECT fGiaThuoc FROM
INSERTED)
IF(@fGiaNhap <=0)
BEGIN
PRINT N'Giá nhập phải lớn hơn 0'
ROLLBACK TRAN
END
END;
INSERT INTO tblThuoc(sMaThuoc,sTenThuoc,fGiaThuoc)
VALUES ('T07',N'Vitamin','0');
4. Trigger đảm bảo giới tính của bệnh nhân chỉ là nam hoặc nữ.
CREATE TRIGGER trg_gtbn ON tblBenhNhan INSTEAD OF INSERT
AS
BEGIN
DECLARE @gt nvarchar(10)
SELECT @gt = sGioiTinh FROM inserted
IF(@gt not in(N'Nam',N'Nữ'))
PRINT 'Ban da nhap sai gioi tinh'
ROLLBACK TRAN
END;
INSERT INTO
tblBenhNhan(sMaBN,sTenBN,sGioiTinh,dNgaySinh,sDiaChi,iSodienthoai,sTinhtr
angsuckhoe)
VALUES ('BN09',N'Nguyễn Ngọc',N'bede','06/03/1999',N'Hà Nội
','023772457',N'Sốt');
5. Trigger đảm bảo hóa đơn DV không quá 3 dịch vụ
CREATE TRIGGER trg_hoadondv ON tblHoaDon_DV FOR INSERT
AS
BEGIN
DECLARE @sldv int
DECLARE @hd varchar(10)
SELECT @hd = sMaHD FROM inserted
SELECT @sldv = COUNT(sMaDV) FROM tblHoaDon_DV
WHERE sMaHD =@hd
IF(@sldv > 3)
BEGIN
PRINT N'Hóa đơn không được quá 3 dịch vụ'
16
ROLLBACK TRAN
END
END;
INSERT INTO tblHoaDon_DV(sMaHD,sMaDV,fSoLuong)
VALUES ('HD01','DV02',3);
select * from tblHoaDon_DV;
user1 sử dung
Quyền INSERT, UPDATE,DELETE tblBacSi
addrolemember role_BenhNhan
GRANT INSERT,UPDATE,DELET
ON dbo.tblBacSi
TO user1
user2
GRANT INSERT,UPDATE,DELETE
ON dbo.tblHoaDon
TO user2
18
Execute sp_addrolemember role_BenhNhan,user2
--user3
GRANT INSERT,UPDATE,DELETE
ON dbo.tblDichvukham
TO user3
GO
Execute sp_addrolemember role_BenhNhan,user3
GO
-- user 4
Quyền INSERT, UPDATE,DELETE tblBacSi
addrolemember role_BenhNhan
GRANT INSERT,UPDATE,DELETE
ON dbo.tblDonThuoc
TO user4
GO
Execute sp_addrolemember role_BenhNhan,user4
GO
-- thu hồi cấm sử dụng
-- user1 thu hồi quyền xoá bảng và cấm sử dụng quyền select bảng
REVOKE DELETE ON dbo.tblBacSi FROM user1
GO
DENY SELECT
ON dbo.tblBacSi
TO user1
GO
19
VIII. Phân tán CSDL
1. Phân mảnh bảng tblBenhNhan cơ sở dữ liệu với điều kiện giới tính
- MAYTRAM1 : quản lý bệnh nhân có giới tính là nam
- MAYTRAM2 : quản lý bệnh nhân có giới tính là nữ
2. Máy trạm 1 sau khi phân tán
20
3. Máy trạm 2:
21
4. Tạo linkserver từ máy trạm 1 -> máy trạm 2
22
5. Khai thác Cơ sở dữ liệu
--Tạo nhãn dữ liệu ( trong suốt dữ liệu)
--BẢNG bệnh nhân ở máy trạm2
CREATE SYNONYM maytram2_benhnhan
FOR LINK.qlyKhamBenh.dbo.tblBenhNhan
23
dNgaySinh,
sGioiTinh,
sTinhtrangsuckhoe
)
VALUES
( @mabn,
@tenbn,
@diachi,
@dienthoai,
@ngaysinh,
@gioitinh,
@tinhtrang
)
END
ELSE
IF (@gioitinh = N'Nữ')
BEGIN
INSERT INTO maytram2_nhanvien
(
sMaBN,
sTenBN,
sDiaChi,
sDienThoai,
dNgaySinh,
sGioiTinh,
sTinhtrangsuckhoe
)
VALUES
( @mabn,
@tenbn,
@diachi,
@dienthoai,
@ngaysinh,
@gioitinh,
@tinhtrang
)
END
ELSE
PRINT('Nhap Gioi tinh khong hop he Nam hoac Nu')
END
24
-- Thêm 1 đơn thuốc mới
CREATE PROC sp_themdonthuoc_phantan (@madt nvarchar,@mabs nvarchar,@mabn nvarchar)
AS
BEGIN
IF EXISTS (SELECT * FROM dbo.tblDonThuoc WHERE @madt = sMaDT)
PRINT ('Ma don thuoc da ton tai')
ELSE
IF EXISTS (SELECT * FROM maytram2_donthuoc WHERE @madt = sMaDT)
PRINT ('Ma don thuoc da ton tai')
ELSE
IF EXISTS (SELECT * FROM dbo.tblBenhNhan WHERE @mabn = sMaBN)
BEGIN
INSERT INTO dbo.tblDonThuoc
(
sMaDT,
sMaBS,
sMaBN,
)
VALUES
( @madt,
@mabs,
@mabn,
)
END
ELSE
IF EXISTS (SELECT * FROM maytram2_benhnhan WHERE @mabn =
sMaBN)
BEGIN
INSERT INTO maytram2_donthuoc
(
sMaDT,
sMaBS,
sMaBN,
)
VALUES
( @madt,
@mabs,
@mabn,
)
END
ELSE
PRINT('Ma benh nhan khong ton tai')
END
25
MỤC LUC
I. Phát biểu bài toán ............................................................................................................................... 1
II. Mô hình cơ sở dữ liệu quan hệ ....................................................................................................... 1
1. Xác định các thực thể, thuộc tính và ràng buộc ........................................................................... 1
2. Các bảng được xác định cấu trúc như sau: ..................................................................................... 2
III. Tạo cơ sở dữ liệu............................................................................................................................... 4
IV. Xây dựn các view cho CSDL .......................................................................................................... 10
1. Tạo view cho biết hoá đơn lập năm 2020 ....................................................................................... 10
2. Tạo view cho biết hoá đơn có tổng tiền trên 1000000 .................................................................... 11
3. Tạo view cho biết bệnh là nữ và ở Hà Nội...................................................................................... 11
4. Tạo view cho biết tên thuốc có số lượng bán Lớn hơn 6 ................................................................ 12
5. Tạo view cho biết tên bệnh nhân, số điện thoại có tổng tiền lớn nhất ............................................ 12
V. Xây dựng các Procedure cho CSDL ................................................................................................... 12
1. Tạo Proc tính tổng tiền đã mua hàng của một bệnh nào đó theo Mã bệnh nhân ............................ 12
2. Tạo Proc cho biết tên thuốc đã được mua bởi một bệnh nhân nào đó (Theo số điện thoại) ........... 13
3. Tạo Pro cho biết tổng số tiền Thuốc đã bán của một tháng, một năm nào đó ................................ 14
VI. Xây dựng các Trigger cho CSDL.................................................................................................... 14
1. Trigger đảm bảo ngày xuất hóa đơn phải lớn hơn hoặc bằng ngày hiện tại. .................................. 14
2. Trigger kiểm tra tính chính xác khi nhập số điện thoại của bệnh nhân........................................... 15
3. Trigger đảm bảo giá nhập hàng luôn lớn hơn 0. ............................................................................. 15
4. Trigger đảm bảo giới tính của bệnh nhân chỉ là nam hoặc nữ. ....................................................... 16
5. Trigger đảm bảo hóa đơn DV không quá 3 dịch vụ ........................................................................ 16
VII. Phân quyền và bảo vệ cơ sở dữ liệu ................................................................................................ 17
1. Tạo tài khoản................................................................................................................................... 17
2. Tạo user cho các thành viên ............................................................................................................ 17
3. Cấp quyền cho các thành viên......................................................................................................... 17
VIII. Phân tán CSDL ............................................................................................................................... 20
1. Phân mảnh bảng tblBenhNhan cơ sở dữ liệu với điều kiện giới tính.............................................. 20
2. Máy trạm 1 sau khi phân tán ........................................................................................................... 20
3. Máy trạm 2: ..................................................................................................................................... 21
4. Tạo linkserver từ máy trạm 1 -> máy trạm 2 .................................................................................. 22
5. Khai thác Cơ sở dữ liệu................................................................................................................... 23
26
27