You are on page 1of 27

I.

Phát biểu bài toán

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.

II. Mô hình cơ sở dữ liệu quan hệ

1. Xác định các thực thể, thuộc tính và ràng buộc

 tblBENHNHAN(sMaBN, sTenBN, sGioiTinh, dNgaySinh, sDiaChi,


iSodienthoai, sTinhtrangsuckhoe)

 tblBACSI(sMaBS, sTenBS, sChuyenNganh)

 tblTHUOC(sMaThuoc, sTenThuoc, fGiaThuoc)


 tblDONTHUOC(sMaDT, sMaBS, sMaBN)

1
 tblCT_DONTHUOC(sMaDT, sMaThuoc, iSoLuong)
 tblDICHVUKHAM( sMaDV, sTenDV, fDonGia)

 tblHOADON(sMaHD, sMaDT, sMaBN, dNgayLap, fTongtien)

 tblHOADONDV(sMaHD, sMaDV,fSoLuong)

 *tblBENHNHAN: lưu trữ thông tin BỆNH NHÂN

2. Các bảng được xác định cấu trúc như sau:

TT Tên Thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú


1 sMaBN Varchar(10) PK Mã bệnh nhân
2 sGioiTinh Bit Chỉ nhận giá Giới tính
trị ‘true’
hoặc ‘false’
3 dNgaySinh date Ngày sinh
4 sDiaChi Nvarchar(255) Địa chỉ
5 iSodienthoai Varchar(10) Số điện thoại
6 sTinhtrangsuckhoe Nvarchar(255) Tình trạng sức
khỏe

*tblBACSI: lưu trữ thông tin BÁC SĨ

TT Tên Thuộc tính Kiểu dữ Ràng buộc Ghi chú


liệu
1 sMaBS Varchar(10) PK Mã bác sĩ
2 sTenBS Bit Giới tính
3 sChuyenNganh nvarchar Chuyên ngành

*tblTHUOC: lưu trữ thông tin THUỐC

TT Tên Thuộc tính Kiểu dữ liệu Ràng buộc Ghi chú


1 sMaThuoc Varchar(10) PK Mã thuốc
2 sTenThuoc Nvarchar(25) Tên thuốc
3 fGiaThuoc float fGiaThuoc>0 Giá thuốc

*tblDONTHUOC: lưu trữ thông tin ĐƠN THUỐC

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

TT Tên Thuộc tính Kiểu dữ Ràng buộc Ghi chú


liệu
1 sMaDT Varchar(10) PK Mã đơn thuốc
2 sMaThuoc Varchar(10) Mã thuốc
3 iSoLuong int iSoLuong>0 Số lượng

*tblDICHVUKHAM( sMaDV, sTenDV, fDonGia)

TT Tên Thuộc tính Kiểu dữ Ràng buộc Ghi chú


liệu
1 sMaDV Varchar(10) PK Mã dịch vụ
2 sTenDV Varchar(10) Tên dịch vụ
3 fDonGia float Đơn giá

*tblHOADON: lưu trữ thông tin hóa đơn

TT Tên Thuộc tính Kiểu dữ Ràng buộc Ghi chú


liệu
1 sMaHD Varchar(10) PK Mã hóa đơn
2 sMaDT Varchar(10) Mã đơn thuốc
3 sMaBN Varchar(10) Mã dịch vụ
4 dNgayLap Date Ngày lập
5 fTongtien float Tổng tiền

*tblHOADONDV

TT Tên Thuộc tính Kiểu dữ Ràng buộc Ghi chú


liệu
1 sMaHD Varchar(10) PK Mã hóa đơn
2 sMaDV Varchar(10) Mã dịch vụ
3
3 fSoLuong float fSoluong>0 Số lượng

III. Tạo cơ sở dữ liệu

--Tạo database
create database qlyKhamBenh;
use qlyKhamBenh;
go

-- Tạo bảng bệnh nhân viên và ràng buộc

create table tblBenhNhan


(
sMaBN VARCHAR (10) primary key not null,
sTenBN nvarchar (30) null ,
sGioiTinh bit null,
dNgaySinh date null ,
sDiaChi nvarchar (255),
iSodienthoai varchar (10) null,
sTinhtrangsuckhoe nvarchar(255)
)
alter table tblBenhNhan
alter column sGioiTinh nvarchar(5)
-- Tạo bảng bác sĩ
create table tblBacSi(
sMaBS varchar (10) primary key not null,
sTenBS Nvarchar (30) null,
sChuyenNganh nvarchar (30) null
);
-- Tạo bảng thuốc
create table tblDichVuKham(
sMaDV varchar (10) primary key not null,
sTenDV nvarchar (30) null,
fDonGia float
);
-- Tạo bảng đơn thuốc và ràng buộc
create table tblDonThuoc(
sMaDT varchar (10) primary key not null,
sMaBS varchar (10) references tblBacSi(sMaBS),
4
sMaBN varchar(10) references tblBenhNhan(sMaBN),

);
--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
);

--Tạo bảng hoá đơn


create table tblHoaDon(
sMaHD varchar (10) primary key not null,
sMaDT varchar (10) not null references
tblDonThuoc(sMaDT),
sMaBN varchar (10) not null references
tblBenhNhan(sMaBN),
dNgayLap date null,
fTongTien float
);

--Tạo bảng hoá đơn_dịch vụ


create table tblHoaDon_DV(
sMaHD varchar (10)not null,
sMaDV varchar (10) not null,
fSoLuong float check (fSoLuong>0),
constraint PK_hoadon_DV primary key (sMaHD, sMaDV),
foreign key (sMaHD) references tblHoaDon (sMaHD),
foreign key (sMaDV) references tblDichVuKham (sMaDV)
);
5
*Chèn dữ liệu cho các bảng
-- chèn dữ liệu vào bảng tblBenhNhan
INSERT INTO
tblBenhNhan(sMaBN,sTenBN,sGioiTinh,dNgaySinh,sDiaChi,iSodienthoai,sTinhtr
angsuckhoe)
VALUES ('BN01',N'Nguyễn Ngọc',N'Nữ','06/03/1999',N'Hà Nội
','023772457',N'Sốt'),
('BN02',N'Nguyễn Lan',N'Nữ','07/05/1994',N'Quảng
Ninh','025452457',N'Ho'),
('BN03',N'Nguyễn Hoa',N'Nữ','03/03/1996',N'Hải Phòng
','023452457',N'Viêm xoang'),
('BN04',N'Nguyễn Hồng Hoa',N'Nữ','06/05/1999',N'Hà Nội
','033452457',N'Sốt'),
('BN05',N'Nguyễn Hùng',N'Nam','08/03/1989',N'Thái Bình
','093452457',N'Co giật'),
('BN06',N'Đặng Trang',N'Nữ','06/03/1977',N'Thái Bình
','093452457',N'Sốt'),
('BN07',N'Nguyễn Hiếu',N'Nam','06/03/2000',N'Hà Nội
','02332457',N'Viêm phổi'),
('BN08',N'Lê Hoàng',N'Nam','06/03/2002',N'Nam Định
','097452457',N'Ung thư phổi')

-- chèn dữ liệu vào bảng tblBacSi


INSERT INTO tblBacSi(sMaBS,sTenBS,sChuyenNganh)
VALUES ('BS01',N'Nguyễn Tuấn',N'Đa khoa'),
('BS02',N'Nguyễn Tuấn',N'Tai Mũi Họng'),
('BS03',N'Nguyễn Tuấn',N'Răng hàm mặt'),
('BS04',N'Nguyễn Tuấn',N'Nội xương cơ khớp'),

6
('BS05',N'Nguyễn Tuấn',N'Da liễu')

-- chèn dữ liệu vào bẳng tblThuoc


INSERT INTO tblThuoc(sMaThuoc,sTenThuoc,fGiaThuoc)
VALUES ('T01',N'Vitamin','43000'),
('T02',N'Kháng sinh','80000'),
('T03',N'Tiêu hóa','50000'),
('T04',N'Tim mạch','400000'),
('T05',N'Huyết áp','100000')

-- chèn dữ liệu vào bảng tblDonThuoc


INSERT INTO tblDonThuoc(sMaDT,sMaBS,sMaBN)
VALUES ('DT01','BS01','BN02'),
('DT02','BS01','BN01'),
('DT03','BS02','BN07'),
('DT04','BS04','BN05'),
('DT05','BS05','BN03')

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)

-- chèn dữ liệu vào bảng tblDichVuKham

INSERT INTO tblDichVuKham(sMaDV,sTenDV,fDonGia)


VALUES ('DV01',N'Xét nghiệm',400000),
('DV02',N'Khám lâm sàng',700000),
('DV03',N'Siêu âm',500000),
('DV04',N'X Quang',550000),
('DV05',N'cơ xương khớp',990000),
('DV06',N'Nội soi',560000)

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)

-- Chèn dữ liệu vào bảng tblCT_HD


INSERT INTO tblHoaDon_DV(sMaHD,sMaDV,fSoLuong)
VALUES ('HD01','DV01',3),
('HD02','DV02',5),
('HD03','DV03',3),
('HD04','DV04',6),
('HD05','DV05',2);

9
Sơ đồ quan hệ giữa các bảng

IV. Xây dựn các view cho CSDL

1. Tạo view cho biết hoá đơn lập năm 2020


CREATE VIEW vvHoaDon2020
AS
SELECT *FROM dbo.tblHoaDon
WHERE YEAR(dNgayLap)='2020'

SELECT *FROM vvHoaDon2020

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

SELECT * FROM vvHoaDonTongTien1000000

3. Tạo view cho biết bệnh là nữ và ở Hà Nội


SELECT * FROM dbo.tblBenhNhan

CREATE VIEW vvKhachHangNuHaNoi


AS
SELECT * FROM dbo.tblBenhNhan
WHERE sGioiTinh=N'Nữ' AND sDiaChi=N'Hà Nội'

SELECT *FROM vvKhachHangNuHaNoi

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

SELECT *FROM vvTenthuoctren6

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

SELECT *FROM vvBenNhanTongTienMax

V. Xây dựng các Procedure cho CSDL

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

EXEC prTenThuoc 023772457


SELECT *FROM dbo.tblBenhNhan

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

EXEC prTienThuocTheoNam 2020,6

SELECT *FROM dbo.tblHoaDon

VI. Xây dựng các Trigger cho CSDL

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;

VII. Phân quyền và bảo vệ cơ sở dữ liệu

1. Tạo tài khoản


CREATE LOGIN NguyenTheAnh
WITH PASSWORD ='anh123'

CREATE LOGIN NguyenTienTruong


WITH PASSWORD ='truong234'

CREATE LOGIN DOLIEN


WITH PASSWORD ='lien345'

CREATE LOGIN PHUONGTHAO


WITH PASSWORD ='thao567'

2. Tạo user cho các thành viên


CREATE USER user1
FOR LOGIN NguyenTheAnh
GO
CREATE USER user2
FOR LOGIN NguyenTienTruong
GO
CREATE USER user3
FOR LOGIN DOLIEN
GO
CREATE USER user4
FOR LOGIN PHUONGTHAO
GO

3. Cấp quyền cho các thành viên


17
 Tạo role quyền select bảng
tblBenhNhan,tblBacSi,tblDichVuKham,tblDonThuoc

CREATE ROLE role_BenhNhan


GO
GRANT SELECT
ON dbo.tblBenhNhan
TO role_BenhNhan
Go
GRANT SELECT
ON dbo.tblBacSi
TO role_BenhNhan
GO
GRANT SELECT
ON dboDichVuKham
TO role_BenhNhan
GO
GRANT SELECT
ON dbo.DonThuoc
TO role_BenhNhan

 user1 sử dung
 Quyền INSERT, UPDATE,DELETE tblBacSi
 addrolemember role_BenhNhan

GRANT INSERT,UPDATE,DELET
ON dbo.tblBacSi
TO user1

Execute sp_addrolemember role_BenhNhan,user1

 user2

 Quyền INSERT, UPDATE,DELETE tblBacSi


 addrolemember role_BenhNhan

GRANT INSERT,UPDATE,DELETE
ON dbo.tblHoaDon
TO user2
18
Execute sp_addrolemember role_BenhNhan,user2

--user3

 Quyền INSERT, UPDATE,DELETE tblBacSi


 addrolemember role_BenhNhan

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

-- user4 thu hồi quyền update


REVOKE UPDATE
ON dbo.tblDonThuoc
FROM user4

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

SELECT * FROM maytram2_benhnhan

--BẢNG dơn thuốc ở máy trạm2


CREATE SYNONYM maytram2_donthuoc
FOR LINK.qlyKhamBenh.dbo.tblDonThuoc
SELECT * FROM maytram2_donthuoc

--1 tạo thủ tục thêm 1 bệnh nhan mới

CREATE PROC pr_thembenhnhan_phantan (@mabn nvarchar(10),@tenbn nvarchar(30), @diachi


nvarchar(50),
@dienthoai
CHAR(10),@ngaysinh DATETIME,@gioitinh NVARCHAR(5),
@tinhtrang nvarchar(10)
AS
BEGIN
IF EXISTS (SELECT * FROM dbo.tblBenhNhan WHERE @mabn = sMaBN)
PRINT ('Ma benh nhan da ton tai')
ELSE
IF EXISTS (SELECT * FROM maytram2_benhnhan WHERE @mabn = sMaBN)
PRINT ('Ma benh nhan da ton tai')
ELSE
IF (@gioitinh = N'Nam')
BEGIN
INSERT INTO dbo.tblNhanVien
(
sMaBN,
sTenBN,
sDiaChi,
sDienThoai,

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

You might also like