Đối mặt với môi trường kinh doanh ngàynay, nơi mà ngành dược phẩm đang trở nên ngày càng quan trọng trong chăm sóc sứckhỏe, việc có một cơ sở dữ liệu chặt chẽ và hiệu quả trở thành chìa
TỔNG QUAN VỀ ĐỀ TÀI
Tính cấp thiết của đề tài
Trong ngữ cảnh ngày nay, khi ngành dược phẩm phát triển mạnh mẽ và sự quan tâm của cộng đồng đối với sức khỏe gia tăng Đối mặt với môi trường kinh doanh ngày nay, nơi mà ngành dược phẩm đang trở nên ngày càng quan trọng trong chăm sóc sức khỏe, việc có một cơ sở dữ liệu chặt chẽ và hiệu quả trở thành chìa khóa để thành công.
Thiết kế cơ sở dữ liệu không chỉ giúp quản lý hiệu quả thông tin về hàng nghìn sản phẩm thuốc, thông tin khách hàng và các giao dịch mua bán hàng ngày mà còn tối ưu hóa quy trình kinh doanh từ quản lý tồn kho đến quản lý khách hàng Sự liên kết chặt chẽ giữa các bảng dữ liệu đảm bảo khả năng thu thập và xử lý thông tin nhanh chóng và chính xác. Đồng thời, tính an toàn và bảo mật của dữ liệu là một yếu tố không thể phủ nhận, đặc biệt khi thông tin về sức khỏe và cá nhân khách hàng đang được lưu trữ Cơ sở dữ liệu cần tích hợp các biện pháp bảo mật mạnh mẽ để ngăn chặn sự truy cập trái phép và bảo vệ tính bí mật của thông tin. Điều quan trọng khác là khả năng phục hồi dữ liệu sau sự cố Cơ sở dữ liệu cần được thiết kế để hỗ trợ quy trình phục hồi nhanh chóng và mô phỏng lại trạng thái ổn định của hệ thống, đặc biệt là khi thông tin về sức khỏe đòi hỏi tính chính xác và không bị mất mát.
Thiết kế cơ sở dữ liệu cho quản lý hệ thống bán thuốc Pharmacity đóng vai trò quan trọng trong sự phát triển của doanh nghiệp Dữ liệu truy xuất linh hoạt giúp doanh nghiệp nhanh chóng điều chỉnh theo nhu cầu thị trường, sở thích khách hàng và hiệu suất kinh doanh Điều này tạo điều kiện cho Pharmacity chủ động thích ứng và vượt trội trong bối cảnh thị trường biến động.
Thiết kế cơ sở dữ liệu “Quản lý hệ thống bán thuốc Pharmacity” đóng vai trò quan trọng không chỉ về mặt kỹ thuật, mà còn là chìa khóa quyết định đến thành công và phát triển bền vững của doanh nghiệp trong ngành dược hiện nay.
Lý do chọn đề tài
Trước hết, ngành dược phẩm đang trở thành một phần quan trọng trong việc chăm sóc sức khỏe cộng đồng, nơi mà yêu cầu về chất lượng và hiệu suất là điều không thể phủ nhận Việc xây dựng một cơ sở dữ liệu hiệu quả giúp Pharmacity quản lý và kiểm soát thông tin về hàng loạt sản phẩm thuốc, thông tin khách hàng, và các giao dịch mua bán một cách chặt chẽ, đảm bảo sự chính xác và tính toàn vẹn của dữ liệu. Đồng thời, trong môi trường kinh doanh ngày nay, tính cạnh tranh cao đặt ra yêu cầu về tối ưu hóa quy trình kinh doanh Thiết kế cơ sở dữ liệu không chỉ giúp Pharmacity tổ chức thông tin một cách logic mà còn tối ưu hóa quy trình từ quản lý tồn kho cho đến quản lý khách hàng, từ đó giúp doanh nghiệp nhanh chóng thích ứng với sự biến động của thị trường.
Với những thông tin nhạy cảm như thông tin y tế và cá nhân khách hàng, việc xây dựng một hệ thống bảo mật mạnh mẽ là không thể phải được ưu tiên hàng đầu Cơ sở dữ liệu được thiết kế với các biện pháp an toàn như mật khẩu, mã hóa và kiểm soát truy cập để bảo vệ thông tin quan trọng và duy trì uy tín của Pharmacity.
Ngoài ra, sự mở rộng linh hoạt giúp Pharmacity đáp ứng nhanh chóng với sự phát triển của doanh nghiệp và ngành công nghiệp dược phẩm, trong khi khả năng phục hồi nhanh chóng giúp duy trì tính ổn định của hệ thống, đặc biệt trong trường hợp sự cố.
Việc lựa chọn đề tài “ Quản lý hệ thống bán thuốc Pharmacity ” không chỉ đơn thuần là một sự chọn lựa, mà còn là kết quả của sự xác định rõ ràng về sự quan trọng và tính thiết yếu của việc ứng dụng công nghệ thông tin trong quản lý doanh nghiệp, đặc biệt là trong ngành dược phẩm ngày nay.
MÔ TẢ BÀI TOÁN
Phát biểu bài toán
Nhà thuốc Pharmacity là một trong những chuỗi cửa hàng bán lẻ dược phẩm đầu tiên tại Việt Nam với mục tiêu nâng cao chất lượng chăm sóc sức khỏe cho từng khách hàng, chuyên cung cấp sản phẩm điều trị bệnh, thực phẩm chức năng
Hệ thống lưu thông tin của các Cửa Hàng trong chuỗi nhà thuốc bao gồm: Mã cửa hàng, Địa chỉ cửa hàng, SĐT cửa hàng duy nhất
Nhà thuốc có nhiều Nhân Viên, mỗi nhân viên cần được lưu thông tin cá nhân về: mã nhân viên, họ tên, SĐT, địa chỉ, giới tính, chức vụ
Khi khách hàng đến mua hàng tại cửa hàng, hệ thống lưu các thông tin của Khách Hàng như: Mã KH, Tên KH, SĐT KH, Địa chỉ KH, giới tính, ngày sinh
Mỗi loại thuốc chỉ được cung cấp bởi một Nhà cung cấp và một Nhà cung cấp sẽ cung cấp nhiều loại thuốc, thông tin của nhà cung cấp bao gồm: mã nhà cung cấp, tên nhà cung cấp, số điện thoại duy nhất, địa chỉ
Thông tin về những loại thuốc hiện tại đang lưu ở file NhomThuoc gồm: mã nhóm, tên nhóm, mô tả
Thuốc được nhập vào các kho đặt tại các tỉnh khác nhau, hệ thống lưu thông tin các Kho bao gồm: Mã kho, Tên kho, Địa chỉ kho, số loại thuốc
Thông tin chi tiết về từng sản phẩm thuốc được lưu ở file dữ liệu Thuoc gồm: mã thuốc, tên thuốc, đơn vị tính, mô tả chi tiết về thuốc, hạn sử dụng, giá bán, tình trạng (còn hay hết/ còn bao nhiêu), đơn giá và số lượng tồn
Mỗi khi có nhu cầu nhập hàng, nhân viên phải lập một Hóa đơn nhập bao gồm: mã hóa đơn nhập, mã thuốc, mã nhà cung cấp, tên NCC, mã nhân viên, ngày đặt hàng, số lượng đặt, thành tiền, VAT, chiết khấu Mỗi lần nhập hàng có thể đặt nhiều thuốc Khi khách hàng đến mua thuốc, nhân viên cần in Hóa đơn bán cho khách hàng bao gồm: mã hóa đơn bán, mã nhân viên, mã khách hàng, mã thuốc, số lượng, thành tiền, ngày giao dịch, VAT, chiết khấu, tổng tiền
Việc quản lý thông tin chi tiết này sẽ giúp Pharmacity tổ chức và theo dõi mọi hoạt động mua bán hàng hóa và chăm sóc khách hàng một cách hiệu quả và chính xác
Các yêu cầu nghiệp vụ
Bài toán có nhiệm vụ xây dựng một hệ thống lưu trữ và quản lý thông tin liên quan đến các loại thuốc, khách hàng, nhân viên, nhà cung cấp, kho và các giao dịch mua bán trong cửa hàng.
Quản lý thông tin chung gồm cửa hàng, nhân viên, khách hàng nhà cung cấp, nhóm thuốc, thuốc, kho.
Theo dõi tình hình hàng tồn đọng của từng loại mặt hàng
Tính toán tiền thu, tiền thực thu với khách hàng; chi phí với các nhà cung cấp
In các báo cáo hàng ngày đối việc bán, nhập hàng theo yêu cầu của nhà quản lý Tiếp nhận và lưu lại các hóa đơn bán hàng, đơn đặt hàng
Phân quyền cho nhân viên: Những người được phân quyền sẽ đảm nhiệm các nhiệm vụ được giao và thực hiện chúng một cách tốt nhất Với cách này, ban lãnh đạo có thể dễ dàng quản lý hệ thống thông qua báo cáo của cấp dưới.
Các nhà quản lý sẽ tổng hợp doanh số bán hàng của toàn bộ hệ thống cửa hàng để đánh giá hiệu quả hoạt động Sau đó, họ xem xét các nguyên nhân dẫn đến doanh thu của một số cửa hàng giảm sút hoặc biến động bất thường trong một số thời điểm cụ thể.
THIẾT KẾ CƠ SỞ DỮ LIỆU MỨC KHÁI NIỆM
Thực thể và thuộc tính
Phân tích mô tả nghiệp vụ của bài toán, xác định bài toán gồm 12 thực thể, chi tiết bao gồm như sau:
Mỗi thực thể bao gồm thuộc tính như sau:
CUAHANG (Mã cửa hàng, địa chỉ cửa hàng, SĐT cửa hàng)
NHANVIEN (Mã nhân viên, họ tên, SĐT, địa chỉ, giới tính, chức vụ)
KHACHHANG (Mã KH, Tên KH, SĐT KH, Địa chỉ KH)
NHACUNGCAP (Mã nhà cung cấp, tên nhà cung cấp, số điện thoại, địa chỉ) NHOMTHUOC (Mã nhóm, tên nhóm, mô tả)
KHO (Mã kho, Tên kho, Địa chỉ kho, Số lượng)
THUOC (Mã thuốc, tên thuốc, đơn vị tính, mô tả, hạn sử dụng, giá bán, tình trạng, số lượng tồn)
Mối quan hệ
(MãHĐN, Ngày đặt, Số lượng, Chiết khấu, VAT, Thành tiền, Tổng tiền) Nhà cung cấp Thuốc (1:M)
(MãHĐN, Ngày đặt, Số lượng, Chiết khấu, VAT, Thành tiền, Tổng tiền) Khách hàng Thuốc (1:M)
(MãHĐB, Ngày giao dịch, Số lượng, Chiết khấu, VAT, Thành tiền, Tổng tiền) Nhân viên Thuốc (1:M)
(MãHĐB, Ngày giao dịch, Số lượng, Chiết khấu, VAT, Thành tiền, Tổng tiền)
Sơ đồ thực thể liên kết (ERD)
Hình 1: Sơ đồ thực thể liên kết ERD
THIẾT KẾ CƠ SỞ DỮ LIỆU MỨC LOGIC
Các quan hệ
Từ sơ đồ thực thể liên kết ERD, bài toán xây dựng cơ sở dữ liệu quản lý nhân sự bao gồm các quan hệ sau:
CUA_HANG (Mã cửa hàng, SĐT, địa chỉ)
NHAN_VIEN (MãNV, Họ tên, giới tính, chức vụ, địa chỉ, SĐT, Mã cửa hàng) 3NF KHACH_HANG (MaKH, TenKH, sđt, địa chỉ)
NHA_CUNG_CAP (MaNCC, Tên, SĐT, địa chỉ)
NHOM_THUOC (Mã nhóm, Tên nhóm, Mô tả)
KHO (Ma kho, Tenkho, địa chỉ, Số lượng)
THUOC (Mã thuốc, tên thuốc, mô tả, tình trạng, HSD, đơn giá, đơn vị tính, Mã nhóm,
HOA_DON_NHAP (Mã thuốc, MaHDN, ngày đặt, số lượng, chiết khấu, VAT, tổng tiền, thành tiền, MãNV, Mã NCC)
HOA_DON_BAN (Mã thuốc, MaHDB, ngày giao dịch, số lượng, chiết khấu, VAT, tổng tiền, thành tiền, MãNV, MãKH)
HOA_DON_NHAP HOA_DON_BAN và chưa đạt chuẩn dạng chuẩn 2NF cần đưa về dạng 2NF:
HANG_NHAP (Mathuoc, MaHDN, số lượng, thành tiền, chiết khấu, VAT)
HOA_DON_NHAP (MaHDN, ngày đặt, tổng tiền, MaNV, MaNCC)
HANG_MUA (Mathuoc, MaHDB, số lượng, chiết khấu, VAT, thành tiền)
HOA_DON_BAN (MaHDB, ngày giao dịch, tổng tiền, MaNV, MaKH)
Cuối cùng ta đưa về dạng 3NF:
CHI_TIET_NHAP (Mathuoc, MaHDN, số lượng, chiết khấu, VAT)
CHI_TIET_BAN (Mathuoc, MaHDB, số lượng, chiết khấu, VAT)
(Vì Thành tiền là thuộc tính dẫn xuất có thể tính được từ số lượng*đơn giá nên t có thể bỏ nó để bảng trở thành dạng 3NF)
CUA_HANG (Mã cửa hàng, SĐT, địa chỉ)
NHAN_VIEN (MãNV, Họ tên, giới tính, chức vụ, địa chỉ, SĐT, Mã cửa hàng) 3NF KHACH_HANG (MaKH, TenKH, SĐT, địa chỉ)
NHA_CUNG_CAP (MaNCC, tên, SĐT, địa chỉ)
NHOM_THUOC (Mã nhóm, Tên nhóm, Mô tả)
KHO (Mã kho, Tên kho, Địa chỉ, Số lượng)
THUOC (Mathuoc, tên thuốc, mô tả, tình trạng, HSD, đơn giá, đơn vị tính, mã nhóm, Makho)
HOA_DON_NHAP (MaHDN, ngày đặt, tổng tiền, MãNV, MaNCC)
HOA_DON_BAN (MaHDB, ngày giao dịch, tổng tiền, MãNV, MãKH)
CHI_TIET_NHAP (Mathuoc, MaHDN, số lượng, chiết khấu, VAT)
CHI_TIET_BAN (Mathuoc, MaHDB, số lượng, chiết khấu, VAT)
Sơ đồ cơ sở dữ liệu mức logic
Hình 2: Sơ đồ cơ sở dữ liệu mức logic
TẠO CƠ SỞ DỮ LIỆU
Tạo Tablespace
Ý nghĩa của việc tạo tablespace là để phân chia dữ liệu của các bảng trong cơ sở dữ liệu thành các khu vực riêng biệt Điều này giúp quản lý dữ liệu hiệu quả hơn, đồng thời cải thiện hiệu suất của cơ sở dữ liệu.
Quản lý dữ liệu hiệu quả hơn: Tablespace cho phép phân chia dữ liệu của các bảng thành các khu vực riêng biệt Ví dụ có thể tạo một tablespace riêng cho dữ liệu người dùng, một tablespace riêng cho dữ liệu hệ thống, v.v
Cải thiện hiệu suất của cơ sở dữ liệu: Tablespace cho phép lưu trữ dữ liệu trên các ổ đĩa khác nhau Ví dụ, có thể lưu trữ dữ liệu thường xuyên truy cập trên ổ đĩa nhanh, trong khi lưu trữ dữ liệu ít truy cập hơn trên ổ đĩa chậm hơn.
B1: Tạo 1 cơ sở dữ liệu mới có tên là: Quản lý hiệu thuốc
Hình 3: Tạo cơ sở dữ liệu mới: Quản lý hiệu thuốc
B2: Tạo Tablespace bằng câu lệnh
CREATE TABLESPACE TBS01 DATAFILE 'TBS01.dbf' SIZE 100M AUTOEXTEND
CREATE TABLESPACE TBS02 DATAFILE 'TBS02.dbf' SIZE 200M AUTOEXTEND
Sau khi tạo thành công Tablespace:
Hình 4: Kết quả hiện thị tạo thành công Tablespace 1 và Tablespace 2
Tạo bảng
Tạo CSDL Quanlyhieuthuoc trên Oracle
CONSTRAINT NHAN_VIEN CHECK (GioiTinh = 1 or GioiTinh = 0),
CONSTRAINT nvch_fk FOREIGN KEY (MaCH) REFERENCES CUA_HANG(MaCH));
CONSTRAINT KHACH_HANG CHECK (GioiTinh = 1 or GioiTinh = 0);
Tạo bảng Nhà Cung Cấp
CREATE TABLE NHA_CUNG_CAP (
CONSTRAINT THUOC CHECK (Tinhtrang = 1 or Tinhtrang = 0),
CONSTRAINT nhomthuoc_fk FOREIGN KEY (Manhom) REFERENCES NHOM_THUOC(MaNhom),
CONSTRAINT Khothuoc_fk FOREIGN KEY (Makho) REFERENCES Kho(MaKHo));
Tạo bảng Hóa Đơn Nhập
CREATE TABLE HOA_DON_NHAP (
CONSTRAINT hdnnv_fk FOREIGN KEY (MaNV) REFERENCES NHAN_VIEN(MaNV),
CONSTRAINT hdnncc_fk FOREIGN KEY (MaNCC) REFERENCES NHA_CUNG_CAP(MaNCC));
Tạo bảng Hóa Đơn Bán
CREATE TABLE HOA_DON_BAN (
CONSTRAINT nvm_fk FOREIGN KEY (MaNV) REFERENCES NHAxN_VIEN (MaNV),
CONSTRAINT khm_fk FOREIGN KEY (MaKH) REFERENCES KHACH_HANG (MaKH));
Tạo bảng Chi Tiết Nhập
CREATE TABLE CHI_TIET_NHAP (
CONSTRAINT nctn_fk FOREIGN KEY (MaHDN) REFERENCES HOA_DON_NHAP(MaHDN),
CONSTRAINT thuocctn_fk FOREIGN KEY (Mathuoc) REFERENCES Thuoc(Mathuoc));
Tạo bảng Chi Tiết Bán
CREATE TABLE CHI_TIET_BAN (
CONSTRAINT ctbt_fk FOREIGN KEY (MaThuoc) REFERENCES THUOC(MaThuoc),
CONSTRAINT ctbhdb_fk FOREIGN KEY (MaHDB) REFERENCESHOA_DON_BAN(MaHDB));
Nhập dữ liệu
Câu lệnh SQL trên thêm 7 hàng vào bảng CUA_HANG, mỗi hàng chứa thông tin cửa hàng bao gồm mã cửa hàng (MaCH), số điện thoại (SDTCH) và địa chỉ (DiaChiCH) Bảy cửa hàng này có mã lần lượt là PMC01, PMC02, PMC03, PMC04, PMC05, PMC06 và PMC07 Mỗi cửa hàng có số điện thoại và địa chỉ cụ thể, ví dụ cửa hàng PMC01 có số điện thoại '0126549863' và địa chỉ 'Thai Thinh, Dong Da, Ha Noi'.
Bảng Nhân Viên insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV01', 'Nguyen Huu Khanh', '0', 'Quan ly', 'Ha Noi', '0398462627', 'PMC01'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV02', 'Tran Quang Thang', '0', 'Nhan vien ban hang', 'Ha Noi', '0378345279', 'PMC02'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV03', 'Tran Thu Trang', '1', 'Thu kho', 'Hai Phong', '0354462627', 'PMC03'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV04', 'Tran Thi Thanh Thao', '1', 'Nhan vien ban hang', 'Bac Ninh', '0368462527', 'PMC04'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV05', 'Nguyen Thi Thao', '1', 'Nhan vien ban hang', 'Quang Ninh', '0684646227', 'PMC05'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH)
16 values ('NV06', 'Bui Phuong Vi', '1', 'Nhan vien ban hang', 'Thai Binh', '0123456789', 'PMC06'); insert into NHAN_VIEN (MaNV, TenNV, GioiTinh, ChucVu, DiaChiNV, SDTNV, MaCH) values ('NV07', 'Vu Thi Thanh Tam', '1', 'Nhan vien ban hang', 'Ninh Binh', '0981268911', 'PMC07');
Bảng Khách Hàng insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtKh) values('KH01','Tran Quang Dieu', to_date('09/06/1998','dd/mm/yyyy'), 0, 'Dong Da,
Ha Noi', '098735627'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH02','Ly Thu Anh', to_date('18/01/1994','dd/mm/yyyy'), 1, 'Hai Ba Trung, Ha Noi', '098735678'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH03','Tran Lan Anh', to_date('10/03/2000','dd/mm/yyyy'), 1, 'Dong Da, Ha Noi', '096935627'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH04','Nguyen Manh Tien', to_date('09/6/1997','dd/mm/yyyy'), 0, 'Ha Dong,
Ha Noi', '0356839987'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH05','Nguyen Viet Minh', to_date('13/11/1998','dd/mm/yyyy'), 0, 'Dong Da,
Ha Noi', '0958394911'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH06','Pham Thai Bao', to_date('09/02/1989','dd/mm/yyyy'), 0, 'Nam Tu Liem,
Ha Noi', '0958357829'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH07','Ta Quang Dong', to_date('03/05/1994','dd/mm/yyyy'), 0, 'Hoang Mai,
- Thêm dữ liệu khách hàng Nguyễn Mạnh Cường vào bảng KHACH_HANG với mã khách hàng KH08, tên khách hàng "Nguyễn Mạnh Cường", ngày sinh 13/06/1992, giới tính nam, địa chỉ tại Thanh Xuân, Hà Nội và số điện thoại 0375030953.- Thêm dữ liệu khách hàng Phan Huy Chú vào bảng KHACH_HANG với mã khách hàng KH09, tên khách hàng "Phan Huy Chú", ngày sinh 15/07/1977, giới tính nam, địa chỉ tại Đống Đa, Hà Nội và số điện thoại 0395937904.- Thêm dữ liệu khách hàng Nguyễn Văn Luân vào bảng KHACH_HANG với mã khách hàng KH10, tên khách hàng "Nguyễn Văn Luân", ngày sinh 09/09/2001, giới tính nam, địa chỉ tại Ba Đình, Hà Nội và số điện thoại 0475893385.
Ha Noi', '0987940024'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH11','Duong Hoai Nam', to_date('19/06/1978','dd/mm/yyyy'), 0, 'Dong Da,
Ha Noi', '0337585942'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH12','Do Quynh Huong', to_date('09/04/2006','dd/mm/yyyy'), 1, 'Long Bien,
Ha Noi', '0284958035'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH13','Minh Van Huyen', to_date('23/08/2003','dd/mm/yyyy'), 0, 'Bac Tu Liem, Ha Noi', '0775638969'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH14','Le Thuy Dung', to_date('22/02/2004','dd/mm/yyyy'), 1, 'Me Linh, Ha Noi', '0978573849'); insert into KHACH_HANG(makh, tenkh, ngaysinh, gioitinh, diachikh, sdtkh) values('KH15','Dinh Viet Hieu', to_date('06/03/2009','dd/mm/yyyy'), 0, 'Thanh Oai, Ha Noi', '0385929599');
18 insert into NHA_CUNG_CAP (MaNCC, TenNCC, SDTNCC, DiaChiNCC) values ('NCC01', 'Cong ty duoc pham Bao Minh', '082707203', 'Thai Ha, Dong Da, Ha Noi'); insert into NHA_CUNG_CAP (MaNCC, TenNCC, SDTNCC, DiaChiNCC) values ('NCC02', 'Cong ty duoc pham Thien Phu', '0910293088', 'Tay Son, Dong Da,
Ha Noi'); insert into NHA_CUNG_CAP (MaNCC, TenNCC, SDTNCC, DiaChiNCC) values ('NCC03', 'Cong ty duoc pham Bao Khang', '0912872893', 'Giai Phong, Hai Ba Trung, Ha Noi'); insert into NHA_CUNG_CAP (MaNCC, TenNCC, SDTNCC, DiaChiNCC) values ('NCC04', 'Cong ty duoc pham Khanh Hoa', '0193230298', 'My Dinh, Nam Tu Liem, Ha Noi');
Bảng Nhóm Thuốc insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N001', 'Thuoc cap cuu va giai doc', 'Dieu tri ngo doc'); insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N002', 'Thuoc tac dong tren mau', 'Dieu tri mau'); insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N003', 'Thuoc chong di ung', 'Dieu tri di ung'); insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N004', 'Thuoc da day', 'Dieu tri da day'); insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N005', 'Thuoc khang sinh', 'Khang vi sinh vat'); insert into NHOM_THUOC( MaNhom, TenNhom, Mota) values('N006', 'Thuoc tim mach', 'Dieu tri tim mach');
Bảng Kho insert into KHO( MaKho, TenKho, DiaChiKho, SoLoaiThuoc) values('K1001', 'Kho Dong Da', 'Dong Da, Ha Noi', '999'); insert into KHO( MaKho, TenKho, DiaChiKho, SoLoaiThuoc) values('K1002', 'Kho Thanh Xuan', 'Thanh Xuan, Ha Noi', '888'); insert into KHO( MaKho, TenKho, DiaChiKho, SoLoaiThuoc) values('K1003', 'Kho Nam Tu Liem', 'Nam Tu Liem, Ha Noi', '1000'); insert into KHO( MaKho, TenKho, DiaChiKho, SoLoaiThuoc) values('K1004', 'Kho Ha Dong', 'Ha Dong, Ha Noi', '444'); insert into KHO( MaKho, TenKho, DiaChiKho, SoLoaiThuoc) values('K1005', 'Kho Ba Dinh', 'Ba Dinh, Ha Noi', '777');
Bảng Thuốc insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('001', 'N001', 'K1001', 'Atropin Sulfat', 'Dieu tri ngo doc', '1',to_date('01/01/2025','dd/mm/yyyy'), 'Hop', 50000, 120); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('002', 'N002', 'K1002', 'Erythropoietin', 'Kich thich hong cau', '1',to_date('12/9/2026','dd/mm/yyyy'),'Hop', 150000, 80); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('003', 'N003', 'K1003', 'Fexodenadin', 'Dieu tri di ung', '1',to_date('20/10/2028','dd/mm/yyyy'), 'Hop', 90000, 220); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('004', 'N004', 'K1004', 'Natri Hydrocarbona', 'Giam do acid o da day', '1',to_date('8/5/2025','dd/mm/yyyy'), 'Vi', 100000, 110);
20 insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('005', 'N005', 'K1005', 'Amoxicillin', 'Dieu tri benh nhiem khuan', '1',to_date('11/3/2027','dd/mm/yyyy'), 'Vi', 180000, 99); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('006', 'N003', 'K1002', 'Cefuroxim ', 'Dieu tri benh nhiem khuan', '1',to_date('9/10/2026','dd/mm/yyyy'), 'Hop', 115000, 85); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('007', 'N005', 'K1001', 'Meropenem ', 'Dieu tri benh nhiem khuan', '1',to_date('3/2/2028','dd/mm/yyyy'), 'Goi', 95000, 65); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('008', 'N001', 'K1004', 'Ciprofloxacin ', 'Dieu tri benh nhiem khuan', '1',to_date('5/5/2027','dd/mm/yyyy'), 'Hop', 75000, 55); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('009', 'N003', 'K1001', 'Clevofloxacin ', 'Dieu tri benh nhiem khuan', '1',to_date('15/8/2024','dd/mm/yyyy'), 'Vi', 125000, 95); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('010', 'N002', 'K1003', 'Cilostazol ', 'Cai thien tuan hoan mau', '1',to_date('21/9/2028','dd/mm/yyyy'), 'Hop', 155000, 90); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('011', 'N002', 'K1001', 'Heparin', 'Dieu tri cuc mau dong','1',to_date('20/12/2025','dd/mm/yyyy'), 'Hop', 150000, 80); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('012', 'N002', 'K1005', 'Albumin', 'Tang the tich mau', '1',to_date('9/9/2025','dd/mm/yyyy'), 'Hop', 100000, 90); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('013', 'N006', 'K1002', 'Trinitrat', 'Han che gian tinh mach', '1',to_date('21/05/2029','dd/mm/yyyy'), 'Hop', 440000, 555); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('014', 'N006', 'K1003', 'Nicorandil', 'Dieu tri trieu chung dau that nguc', '1',to_date('27/07/2027','dd/mm/yyyy'), 'Hop', 600000, 254); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('015', 'N006', 'K1005', 'Amiodarone', 'Dieu tri roi loan nhip tim', '1',to_date('08/04/2028','dd/mm/yyyy'), 'Vi', 220000, 277); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('016', 'N006', 'K1001', 'Ivabradin', 'Dieu tri trieu chung dau that nguc', '1',to_date('15/08/2025','dd/mm/yyyy'), 'Hop', 300000, 153); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('017', 'N006', 'K1002', 'Propranolol', 'Dieu tri cao huyet ap', '1',to_date('05/12/2027','dd/mm/yyyy'), 'Hop', 550000, 70); insert into THUOC (MaThuoc, MaNhom, MaKho, TenThuoc, MoTa, Tinhtrang, HSD, DVT, DonGia, Soluongton) values ('018', 'N006', 'K1005', 'Amlodipin', 'Dieu tri cao huyet ap', '1',to_date('01/07/2026','dd/mm/yyyy'), 'Vi', 250000, 270);
Bảng Hóa Đơn Nhập insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD01', 'NV01', 'NCC01',to_date('15/08/2023','dd/mm/yyyy'), 5000000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD02', 'NV02', 'NCC01',to_date('15/10/2021','dd/mm/yyyy'), 8000000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD03', 'NV03', 'NCC02',to_date('8/11/2022','dd/mm/yyyy'), 3800000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD04', 'NV04', 'NCC03',to_date('2/2/2022','dd/mm/yyyy'), 4200000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD05', 'NV05', 'NCC03',to_date('11/05/2023','dd/mm/yyyy'), 5500000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD06', 'NV06', 'NCC01',to_date('20/08/2023','dd/mm/yyyy'), 8100000);insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD07', 'NV03', 'NCC02', to_date('20/12/2023', 'dd/mm/yyyy'), 4250000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD08', 'NV02', 'NCC01', to_date('13/10/2023', 'dd/mm/yyyy'), 10500000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD09', 'NV01', 'NCC03', to_date('20/12/2023', 'dd/mm/yyyy'), 11000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD10', 'NV01', 'NCC01', to_date('11/11/2023', 'dd/mm/yyyy'), 2000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD11', 'NV02', 'NCC03', to_date('10/11/2023', 'dd/mm/yyyy'), 3420000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD12', 'NV03', 'NCC02', to_date('25/10/2023', 'dd/mm/yyyy'), 12000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD13', 'NV01', 'NCC01', to_date('29/09/2023', 'dd/mm/yyyy'), 9800000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD14', 'NV03', 'NCC03', to_date('20/11/2023', 'dd/mm/yyyy'), 35000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD15', 'NV02', 'NCC02', to_date('12/09/2023', 'dd/mm/yyyy'), 40000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD16', 'NV03', 'NCC01', to_date('09/11/2023', 'dd/mm/yyyy'), 25000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD17', 'NV01', 'NCC03', to_date('12/07/2022', 'dd/mm/yyyy'), 15000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD18', 'NV02', 'NCC02', to_date('30/06/2023', 'dd/mm/yyyy'), 18000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD19', 'NV03', 'NCC01', to_date('05/09/2023', 'dd/mm/yyyy'), 30000000); insert into HOA_DON_NHAP(MaHDN, MaNV, MaNCC, Ngaydat, TongTien) values ('HD20', 'NV01', 'NCC02', to_date('18/11/2022', 'dd/mm/yyyy'), 22000000);
Four records have been inserted into the HOA_DON_BAN table in the database The first record with MaHDB 'HD01' has MaNV 'NV01', MaKH 'KH01', Ngaygiaodich '15/08/2023', and Tongtien 300000 The second record with MaHDB 'HD02' has MaNV 'NV01', MaKH 'KH02', Ngaygiaodich '15/09/2023', and Tongtien 277000 The third record with MaHDB 'HD03' has MaNV 'NV02', MaKH 'KH03', Ngaygiaodich '01/10/2023', and Tongtien 740000 The fourth record with MaHDB 'HD04' has MaNV 'NV03', MaKH 'KH04', Ngaygiaodich '02/10/2023', and Tongtien 39000.
24 values ('HD05', 'NV03', 'KH05',to_date('19/10/2023','dd/mm/yyyy'), 10000); insert into HOA_DON_BAN(MaHDB, MaNV, MaKH, Ngaygiaodich, Tongtien) values ('HD06', 'NV04', 'KH01',to_date('20/10/2023','dd/mm/yyyy'), 99000); insert into HOA_DON_BAN(MaHDB, MaNV, MaKH, Ngaygiaodich, Tongtien) values ('HD07', 'NV01', 'KH06',to_date('23/08/2023','dd/mm/yyyy'), 870000); insert into HOA_DON_BAN(MaHDB, MaNV, MaKH, Ngaygiaodich, Tongtien) values ('HD08', 'NV05', 'KH07',to_date('30/09/2023','dd/mm/yyyy'), 65500); insert into HOA_DON_BAN(MaHDB, MaNV, MaKH, Ngaygiaodich, Tongtien) values ('HD09', 'NV02', 'KH08',to_date('1/11/2023','dd/mm/yyyy'), 153000); insert into HOA_DON_BAN(MaHDB, MaNV, MaKH, Ngaygiaodich, Tongtien) values ('HD10', 'NV04', 'KH01',to_date('15/08/2022','dd/mm/yyyy'), 370000); Bảng Chi Tiết Nhập insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD01', '001', 400, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD02', '002', 200, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD03', '004', 150, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD04', '005', 230, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD05', '006', 138, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD05', '007', 200, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD05', '008', 250, 0, 0); insert into CHI_TIET_NHAP(MaHDN, MaThuoc, SoLuong, Chietkhau, VAT) values('HD06', '014', 150, 0, 0);
CÁC THAO TÁC TRUY VẤN TRÊN CƠ SỞ DỮ LIỆU
Các câu lệnh truy vấn SQL
1 Hiển thị TenKH, SDT của những khách hàng mua hàng vào tháng 10/2023 với hóa đơn trên 20.000vnd được thực hiện bởi nhân viên có MaNV là NV03. select KHACH_HANG.TenKH, KHACH_HANG.SDTKH from KHACH_HANG join HOA_DON_BAN on KHACH_HANG.MaKH = HOA_DON_BAN.MaKH join NHAN_VIEN on HOA_DON_BAN.MaNV = NHAN_VIEN.MaNV where extract (year from to_date(HOA_DON_BAN.Ngaygiaodich, 'dd/mm/yyyy')) = 23 and extract (month from to_date(HOA_DON_BAN.Ngaygiaodich, 'dd/mm/yyyy')) = 10 and HOA_DON_BAN.Tongtien > 20000 and NHAN_VIEN.MaNV = 'NV03';
Hình 5: Kết quả hiển thị khách hàng mua hàng vào tháng 10/2023 có hóa đơn trên
20.000VNĐ được thực hiện bởi nhân viên NV03 2 Hiển thị số hóa đơn bán được của mỗi nhân viên
SELECT NHAN_VIEN.MANV, TENNV, COUNT(MAHDB) AS SOHOADON FROM NHAN_VIEN JOIN HOA_DON_BAN
ON NHAN_VIEN.MANV = HOA_DON_BAN.MANV
GROUP BY NHAN_VIEN.MANV,TENNV;
Hình 6: Kết quả hiển thị mỗi nhân viên có bao nhiêu hóa đơn bán
3 Hiển thị thông tin thuốc được bán trong tháng 10/2023.
SELECT THUOC.MATHUOC, THUOC.TENTHUOC
FROM THUOC JOIN CHI_TIET_BAN ON THUOC.MATHUOC CHI_TIET_BAN.MATHUOC
JOIN HOA_DON_BAN ON CHI_TIET_BAN.MAHDB = HOA_DON_BAN.MAHDB
WHERE EXTRACT(MONTH FROM NGAYGIAODICH) = 10 AND EXTRACT(YEAR FROM NGAYGIAODICH) = 2023;
Hiển thị thông tin thuốc có tên nhóm là "thuốc kháng sinh" và hết hạn vào năm 2027.
FROM THUOC JOIN NHOM_THUOC
ON THUOC.MANHOM = NHOM_THUOC.MANHOM
WHERE TENNHOM = 'Thuoc khang sinh'
AND EXTRACT(YEAR FROM HSD) = 2027;
Hình 8: Kết quả hiển thị thông tin thuốc trong nhóm "thuốc kháng sinh" và hết hạn năm 2027 5 Hiển thị mã thuốc thuộc tên kho nào
SELECT THUOC.MATHUOC, THUOC.TENTHUOC, KHO.TENKHO
ON THUOC.MAKHO = KHO.MAKHO
Hình 9: Kết quả hiển thị thuốc đang ở kho nào 6 Hiển thị số lượng thuốc mà loại thuốc đó được bán nhiều nhất trong năm 2023 SELECT MAX(SOLUONG) AS SLTHUOCBANMAX
FROM CHI_TIET_BAN JOIN HOA_DON_BAN
ON CHI_TIET_BAN.MAHDB = HOA_DON_BAN.MAHDB
WHERE EXTRACT(YEAR FROM NGAYGIAODICH) = 2023;
Hình 10: Kết quả hiển thị số lượng thuốc mà loại thuốc đó được bán nhiều nhất năm
2023 7 Hiển thị số lượng hóa đơn và tổng tiền của những khách hàng có giới tính là Nam (0).
SELECT KH.MAKH, KH.TENKH, COUNT(HDB.MAHDB) AS
SO_LUONG_HOA_DON, HDB.TONGTIEN
LEFT JOIN HOA_DON_BAN HDB ON KH.MAKH = HDB.MAKH
GROUP BY KH.MAKH, KH.TENKH, HDB.TONGTIEN
Hình 11: Kết quả hiển thị số lượng hóa đơn và tổng tiền của những khách hàng nam giới 8 Đưa ra makh, tongtien của hóa đơn mà NV01 thực hiện select HOA_DON_BAN.MaKH, HOA_DON_BAN.MaKH, HOA_DON_BAN.Tongtien from NHAN_VIEN join HOA_DON_BAN on HOA_DON_BAN.MaNV = NHAN_VIEN.MaNV join CHI_TIET_BAN on HOA_DON_BAN.MaHDB = CHI_TIET_BAN.MaHDB where NHAN_VIEN.MaNV = 'NV01';
Hình 12: Kết quả hiển thị mã KH và tổng tiền của hóa đơn do nhân viên NV01 thực hiện 9 Hiển thị danh sách kho cung cấp nhiều thuốc nhất theo thứ tự giảm dần
SELECT K.MAKHO, K.TENKHO, COUNT(T.MATHUOC) AS SO_LUONG_THUOC FROM KHO K
JOIN THUOC T ON K.MAKHO = T.MAKHO
ORDER BY SO_LUONG_THUOC DESC
Hình 13: Kết quả hiển thị danh sách kho cung cấp nhiều thuốc nhất theo thứ tự giảm dần 10 Hiển thị nhà cung cấp có ngày nhập vào tháng 8/2023 với tongtien lớn hơn 51.500vnd
SELECT DISTINCT NHA_CUNG_CAP.TENNCC
ON NHA_CUNG_CAP.MANCC = HOA_DON_NHAP.MANCC
WHERE EXTRACT (YEAR FROM TO_DATE(HOA_DON_NHAP.NGAYDAT, 'DD/MM/YYYY')) = 23
AND EXTRACT (MONTH FROM TO_DATE(HOA_DON_NHAP.NGAYDAT, 'DD/MM/YYYY')) = 8
AND HOA_DON_NHAP.TONGTIEN > 51500;
Hình 14: Kết quả hiển thị nhà cung cấp có ngày nhập vào tháng 8/2023 và tổng tiền lớn hơn 51.500VNĐ
Tạo và sử dụng PL/SQL
Thực hiện 10 yêu cầu nghiệp vụ chức năng phù hợp
(Gồm: PL/SQL: 3 câu; Hàm: 3 câu; Thủ tục: 3 câu; Trigger: 2 câu)
1 Hiển thị mã hóa đơn bán và tổng tiền của hóa đơn đó do nhân viên có mã NV02 thực hiện Đoạn mã PL/SQL
MHDB HOA_DON_BAN.MAHDB%TYPE;
TT HOA_DON_BAN.TONGTIEN%TYPE;
MNV NHAN_VIEN.MANV%TYPE := 'NV02';
DBMS_OUTPUT.PUT_LINE('NV02 CO HOA DON BAN CO MA: '||REC.MAHDB||'
CO SO TIEN LA: '||REC.TONGTIEN);
Hình 15: Kết quả hiển thị mã hóa đơn bán và tổng tiền của hóa đơn đó do nhân viên có mã NV02 thực hiện 2 Nhập vào mã thuốc và cho biết tên thuốc, mô tả, HSD, đơn giá của loại thuốc đó Đoạn mã PL/SQL
MA_THUOC THUOC.MATHUOC%TYPE;
TEN_THUOC THUOC.TENTHUOC%TYPE;
MO_TA THUOC.MOTA%TYPE;
HAN_SD THUOC.HSD%TYPE;
DON_GIA THUOC.DONGIA%TYPE;
SELECT TENTHUOC, MOTA, HSD, DONGIA
INTO TEN_THUOC, MO_TA, HAN_SD, DON_GIA
DBMS_OUTPUT.PUT_LINE('TEN THUOC LA: '||TEN_THUOC);
DBMS_OUTPUT.PUT_LINE('MO TA: '||MO_TA);
DBMS_OUTPUT.PUT_LINE('HSD: '||HAN_SD);
DBMS_OUTPUT.PUT_LINE('DON GIA: '||DON_GIA);
Thao tác: Nhập mã thuốc
Hình 16: Nhập vào mã thuốc 001 Kết quả:
Hình 17: Kết quả hiển thị tên thuốc, mô tả, HSD, đơn giá của mã thuốc nhập vào 3 Nhập tên nhóm thuốc và cho biết số loại thuốc thuộc nhóm đó Đoạn mã PL/SQL
TEN_NHOM NHOM_THUOC.TENNHOM%TYPE;
SELECT COUNT(MATHUOC) AS SO_LUONG
FROM NHOM_THUOC JOIN THUOC ON NHOM_THUOC.MANHOM THUOC.MANHOM
DBMS_OUTPUT.PUT_LINE('TEN NHOM THUOC: '||TEN_NHOM||' CO SO LOAI THUOC THUOC NHOM DO LA: '||SO_LUONG);
Thao tác: Nhập tên nhóm
Hình 18: Nhập tên nhóm "thuốc kháng sinh"
Hình 19: Kết quả hiển thị số loại thuốc thuộc nhóm thuốc kháng sinh được nhập vào
4 Viết hàm trả về số hóa đơn nhập theo mã nhà cung cấp nhập vào Đoạn mã PL/SQL
CREATE OR REPLACE FUNCTION DEM_HDN (MNCC
NHA_CUNG_CAP.MANCC%TYPE)
SELECT DEM_HDN('&MNCC') FROM DUAL;
Thông báo chức năng đếm hóa đơn đã được thực hiện
Hình 20: Thông báo function Dem_HDN được thực hiện Thao tác: Nhập mã nhà cung cấp
Hình 21: Nhập mã nhà cung cấp Kết quả:
Hình 22: Kết quả hàm trả về số hóa đơn nhập theo mã NCC nhập vào 5 Viết hàm trả về thông báo thuốc còn HSD hay không Đoạn mã PL/SQL:
CREATE OR REPLACE FUNCTION ktra_HSD (ten_thuoc thuoc.tenthuoc%type)
IS ngayhethan DATE; thong_bao VARCHAR2(100);
IF ngayhethan > SYSDATE THEN thong_bao := 'Thuoc con han su dung'; ELSE thong_bao := 'thuoc da het han su dung'; END IF;
WHEN NO_DATA_FOUND THEN
RETURN 'Khong tim thay thong tin ve thuoc'; WHEN OTHERS THEN
RETURN 'Co loi xay ra';
BEGIN thong_bao := ktra_HSD('&tenthuoc');
DBMS_OUTPUT.PUT_LINE(thong_bao);
Thông báo chức năng kiểm tra HSD đã được thực hiện
Hình 23: Thông báo chức năng HSD được thực hiện
Thao tác: Nhập tên thuốc
Hình 24: Nhập tên thuốc Kết quả:
Hình 25: Kết quả hiển thị thông báo thuốc được nhập vào còn HSD hay không 6 Viết hàm trả về số thuốc theo tên thuốc nhập vào Đoạn mã PL/SQL
CREATE OR REPLACE FUNCTION dem_thuoc (ten_thuoc thuoc.tenthuoc%type) RETURN NUMBER
WHEN NO_DATA_FOUND THEN
Thực thi hàm set serveroutput on
BEGIN dem := dem_thuoc('&tenthuoc');
DBMS_OUTPUT.PUT_LINE('So luong thuoc: ' ||dem);
Thông báo chức năng đếm thuốc đã được thực hiện
Hình 26: Thông báo chức năng Đếm thuốc đã được thực hiện Thao tác: Nhập tên thuốc
Hình 27: Nhập vào tên thuốc Kết quả:
Hình 28: Kết quả hiển thị số lượng thuốc theo tên thuốc nhập vào
7 Sử dụng thủ tục trả về thông tin loại thuốc này được nhập từ kho nào đưa vào mã thuốc Đoạn mã PL/SQL
CREATE OR REPLACE PROCEDURE TTTHUOC (MT THUOC.MATHUOC
FOR REC IN(SELECT THUOC.TENTHUOC,KHO.MAKHO, KHO.TENKHO FROM KHO JOIN THUOC ON KHO.MAKHO = THUOC.MAKHO
DBMS_OUTPUT.PUT_LINE('TEN THUOC: '||REC.TENTHUOC);
DBMS_OUTPUT.PUT_LINE('MA KHO: '||REC.MAKHO);
DBMS_OUTPUT.PUT_LINE('TEN KHO: '||REC.TENKHO);
Thông báo: chức năng trả về thông tin loại thuốc đã được thực hiện
Hình 29: Thông báo chức năng trả về thông tin loại thuốc đã được thực hiện Thực thi
Thao tác: Nhập mã thuốc
Hình 30: Nhập vào mã thuốc Kết quả:
Hình 31: Kết quả hiển thị thông tin loại thuốc được nhập từ kho nào nhập vào mã thuốc 8 Nhập vào maKH và cho biết thông tin chi tiết hoá đơn của khách hàng đó Đoạn mã PL/SQL
CREATE OR REPLACE PROCEDURE TTHD (MKH KHACH_HANG.MAKH
FOR REC IN(SELECT HOA_DON_BAN.MAHDB,
HOA_DON_BAN.NGAYGIAODICH, HOA_DON_BAN.TONGTIEN,
CHI_TIET_BAN.MATHUOC, CHI_TIET_BAN.SOLUONG
FROM KHACH_HANG JOIN HOA_DON_BAN ON KHACH_HANG.MAKH
JOIN CHI_TIET_BAN ON HOA_DON_BAN.MAHDB CHI_TIET_BAN.MAHDB
WHERE KHACH_HANG.MAKH = MKH)
DBMS_OUTPUT.PUT_LINE('MA HDB: '||REC.MAHDB);
DBMS_OUTPUT.PUT_LINE('NGAY GIAO DICH: '||REC.NGAYGIAODICH); DBMS_OUTPUT.PUT_LINE('TONG TIEN: '||REC.TONGTIEN);
DBMS_OUTPUT.PUT_LINE('MA THUOC: '||REC.MATHUOC);
DBMS_OUTPUT.PUT_LINE('SO LUONG: '||REC.SOLUONG);
Thông báo chức năng thông tin chi tiết hóa đơn đã được thực hiện
Hình 32: Thông báo chức năng thông tin chi tiết hóa đơn được thực hiện EXECUTE TTHD ('&MKH');
Thao tác: nhập mã khách hàng
Hình 33: Nhập vào mã khách hàng Kết quả:
Hình 34: Kết quả hiển thị thông tin chi tiết hóa đơn của khách hàng nhập vào mã khách hàng
9 Trigger tu đong giam so luong ton trong bang thuoc khi thuoc duoc ban di. CREATE OR REPLACE TRIGGER TRIGGER_BAN_THUOC
AFTER INSERT ON CHI_TIET_BAN
SET Soluongton = Soluongton - :NEW.SoLuong
DBMS_OUTPUT.PUT_LINE('THUOC '|| :NEW.Mathuoc|| ' DA DUOC BAN VOI
SO LUONG LA: '|| :NEW.SoLuong);
Số lượng tồn ban đầu của loại thuốc có mã 001
Hình 35: Bảng Thuốc Khi hóa đơn bán mới được tạo với chi tiết bán ra mã thuốc 001 số lượng thuốc 20
Hình 36: Thêm mới chi tiết bán
Số lượng tồn tự động giảm theo số lượng được bán ra
Tạo bảng LOG_THAYDOI_THUOC
CREATE TABLE LOG_THAYDOI_THUOC (
Trigger khi co su thay doi trong bang thuoc thi du lieu truoc va sau khi thay doi duoc ghi vao log_thaydoi_thuoc.
CREATE OR REPLACE TRIGGER TRIG_LOG_THAYDOI_THUOC
AFTER INSERT OR UPDATE OR DELETE ON THUOC
INSERT INTO LOG_THAYDOI_THUOC (MaThuoc, ThayDoi, ThoiGian)
VALUES (:NEW.MaThuoc, 'Thêm mới', SYSTIMESTAMP);
INSERT INTO LOG_THAYDOI_THUOC (MaThuoc, ThayDoi, ThoiGian)
VALUES (:NEW.MaThuoc, 'Cập nhật', SYSTIMESTAMP);
INSERT INTO LOG_THAYDOI_THUOC (MaThuoc, ThayDoi, ThoiGian)
VALUES (:OLD.MaThuoc, 'Xóa', SYSTIMESTAMP);
Hình 38: Bảng LOG_THAYDOI_THUOC
QUẢN LÝ NGƯỜI DÙNG
Tính tất yếu của việc quản lý người dùng
6.1.1 Khái niệm về quản lý người dùng
Phân quyền trong cơ sở dữ liệu là việc phân bổ quyền hạn cho một thành viên được làm gì và không làm gì đối với dữ liệu Phân quyền có tính năng phân quyền chuyên sâu sẽ cho phép các nhà quản lý duy trì được sự cân bằng giữa việc giúp nhân viên cộng tác dễ dàng, đồng thời bảo vệ dữ liệu của công ty.
Nhóm quyền (Privileges) là quyền được thực hiện một loạt các câu lệnh SQL cụ thể hoặc truy cập vào các dối tượng của người dùng khác.
Quyền trong Oracle Database chia làm 2 loại:
⮚ Quyền hệ thống (System privileges): Mỗi quyền hệ thống cho phép hoạt động trên cơ sở dữ liệu cụ thể hoạc một lớp hoạt động cơ sở dữ liệu.
Quyền đối tượng cấp phép cho người dùng thực hiện các thao tác cụ thể trên các đối tượng cụ thể trong hệ thống, chẳng hạn như bảng, chế độ xem, chuỗi, quy trình và hàm.
Phân quyền trong cơ sở dữ liệu quản lý hệ thống bán thuốc Pharmacity
Tạo và quản lý người dùng (tạo người dùng, quyền, nhóm quyền và phân quyền) phù hợp.
6.2.1 Người quản trị hệ thống
Quản lý toàn bộ hệ thống và tất cả các người dùng.
Thêm, sửa, xoá người dùng và quyền hạn của họ.
Thực hiện sao lưu và phục hồi dữ liệu.
Quyền/Nhóm quyền : loại quyền system, nhóm quyền DBA
Tên USER: QUAN_TRI_VIEN
USER SQL: tạo người dùng mới trong CSDL có tên Quản trị viên với mật khẩu là qtv123; người dùng có bảng không gian mặc định là "USERS" và bảng không gian tạm thời là "TEMP".
CREATE USER "QUAN_TRI_VIEN" IDENTIFIED BY qtv123
QUOTAS: Gán một lượng tài nguyên không giới hạn (UNLIMITED) cho người dùng
"QUAN_TRI_VIEN" trên bảng không gian "USERS"
ALTER USER "QUAN_TRI_VIEN" QUOTA UNLIMITED ON "USERS";
Cấp quyền "DBA" cho người dùng "QUAN_TRI_VIEN" Quyền "DBA" là quyền có đặc quyền cao nhất trong Oracle, cho phép người dùng thực hiện hầu hết mọi tác vụ quản trị cơ sở dữ liệu, ví dụ như: thêm, sửa, xoá người dùng và quyền hạn của họ.
GRANT "DBA" TO "QUAN_TRI_VIEN";
ALTER USER "QUAN_TRI_VIEN" DEFAULT ROLE "DBA";
Thực hiện sao lưu và phục hồi dữ liệu.
GRANT SYSBACKUP TO "QUAN_TRI_VIEN"
Ngoài quản trị viên, hệ thống cửa hàng bán thuốc còn tồn tại các người dùng được cấp quyền là quản lý cửa hàng, quản lý kho, nhân viên cửa hàng và nhân viên kho. Những người dùng này được tạo ra nhằm quản lý các thông tin liên quan tới cửa hàng, duy trì hoạt động của cửa hàng từ việc mua và bán cũng như quản lý kho hàng và các thông tin liên quan.
Mỗi người dùng sẽ được cấp một profile khác nhau nhằm giúp người quản trị có thể soát tài nguyên, quản lý phiên kết nối, đảm bảo an ninh mật khẩu, và tuân thủ các quy tắc quản lý cơ sở dữ liệu
Bên cạnh đó, việc cấp quyền cho từng người dùng cũng vô cùng quan trọng Điều này được thực hiện nhằm đảm bảo an ninh, tính toàn vẹn và hiệu suất của hệ thống Cấp
Để thực hiện nguyên tắc tối thiểu quyền hạn và quản lý hiệu quả tài nguyên, theo dõi hoạt động, tuân thủ quy định và chuẩn mực hệ thống, 48 quyền và nhóm quyền cụ thể được thiết lập dành cho các loại người dùng khác nhau Nhờ đó, việc bảo mật dữ liệu hệ thống được tăng cường, ngăn chặn truy cập trái phép và đảm bảo mỗi người dùng chỉ có quyền hạn cần thiết để hoàn thành nhiệm vụ.
Quản lý (Quản lý cửa hàng và quản lý kho)
Tạo profile cho quản lý
Tạo user quản lý cửa hàng và gán Profile
CREATE USER "C##QUAN_LY_CUA_HANG" IDENTIFIED BY qlch123
Quản lý cửa hàng sẽ có các quyền trên hệ thống như:
Xem thông tin về cửa hàng và chỉnh sửa thông tin về số điện thoại của cửa hàng nếu có thay đổi
Người quản lý cửa hàng sẽ thực hiện các tác vụ liên quan đến nhân sự, bao gồm thêm mới hoặc xóa thông tin nhân viên khi có người vào hoặc rời đi Ngoài ra, người quản lý cũng chịu trách nhiệm cập nhật thông tin nhân viên như chức vụ, địa chỉ và số điện thoại trong trường hợp có thay đổi.
Quản lý thông tin về khách hàng của cửa hàng.
Xem thông tin về các nhóm thuốc trong cửa hàng.
Theo dõi tình trạng thuốc Thực hiện việc xem, thêm, sửa, xóa thông tin về các loại thuốc để có thể thực hiện việc bán hàng
Xem các thông tin về kho thuốc
Quản lý hóa đơn bán hàng của cửa hàng
Xem các hóa đơn nhập hàng
Tạo nhóm quyền Quản lý cửa hàng
Cấp các quyền cho nhóm quyền Quản lý cửa hàng
GRANT SELECT, UPDATE (SDTCH) ON CUA_HANG TO C##ROLE_QLCH;
GRANT SELECT, INSERT, UPDATE (ChucVu, DiachiNV, SDTNV), DELETE ON NHAN_VIEN TO C##ROLE_QLCH;
GRANT SELECT ON NHA_CUNG_CAP TO C##ROLE_QLCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON KHACH_HANG TO C##ROLE_QLCH;
GRANT SELECT ON NHOM_THUOC TO C##ROLE_QLCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON THUOC TO C##ROLE_QLCH;
GRANT SELECT ON KHO TO C##ROLE_QLCH;
GRANT SELECT ON HOA_DON_NHAP TO C##ROLE_QLCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON HOA_DON_BAN TO C##ROLE_QLCH;
GRANT SELECT CHI_TIET_NHAP TO C##ROLE_QLCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON CHI_TIET_BAN TO C##ROLE_QLCH;
Gán quyền và nhóm quyền cho người dùng Quản lý cửa hàng đã tạo
GRANT CREATE SESSION TO C##QUAN_LY_CUA_HANG;
GRANT C##QLCH TO C##QUAN_LY_CUA_HANG;
Tạo người dùng và gán profile cho Quản lý kho
CREATE USER “C##QUAN_LY_KHO” IDENTIFIED BY qlk123
Quản lý kho có các quyền:
Xem thông tin về cửa hàng
Xem thông tin nhân viên, chỉnh sửa thông tin về địa chỉ và số điện thoại
Xem thông tin và thực hiện việc thêm, sửa xóa thông tin của các nhà cung cấp thuốc
Xem, thêm, chỉnh sửa thông tin về các nhóm thuốc trong cửa hàng
Thực hiện việc xem, thêm, sửa, xóa thông tin về các loại thuốc để có thể thực hiện việc nhập hàng
Thực hiện chỉnh sửa, thêm số lượng tồn trong kho khi thực hiện nhập kho.
Quản lý hóa đơn nhập
Tạo nhóm quyền Quản lý kho
Cấp các quyền cho nhóm quyền Quản lý kho
GRANT SELECT ON CUA_HANG TO C##ROLE_QLK;
GRANT SELECT, UPDATE(DiachiNV, SDTNV) ON NHAN_VIEN TO
GRANT SELECT, INSERT, UPDATE, DELETE ON NHA_CUNG_CAP TO C##ROLE_QLK;
GRANT SELECT, INSERT, UPDATE, DELETE ON NHOM_THUOC TO C##ROLE_QLK;
GRANT SELECT, INSERT, UPDATE, DELETE ON THUOC TO C##ROLE_QLK; GRANT SELECT, INSERT, UPDATE, DELETE ON KHO TO C##ROLE_QLK; GRANT SELECT, INSERT, UPDATE, DELETEON HOA_DON_NHAP TO C##ROLE_QLK;
GRANT SELECT, INSERT, UPDATE, DELETE CHI_TIET_NHAP TO
Gán quyền và nhóm quyền cho người dùng Quản lý kho đã tạo
GRANT CREATE SESSION TO C##QUAN_LY_KHO;
GRANT C##ROLE_QLK TO C##QUAN_LY_KHO;
Nhân viên (Nhân viên cửa hàng, nhân viên kho)
Tạo profile cho nhân viên
Tạo user nhân viên cửa hàng và gán Profile
CREATE USER "C##NHAN_VIEN_CH" IDENTIFIED BY nv123
Nhân viên cửa hàng sẽ có các quyền trên hệ thống như:
Xem thông tin về cửa hàng
Xem thông tin nhân viên, chỉnh sửa thông tin về địa chỉ và số điện thoại Quản lý thông tin về khách hàng của cửa hàng
Xem thông tin về các nhóm thuốc trong cửa hàng
Theo dõi tình trạng thuốc trong quá trình bán hàng
Xem thông tin về kho thuốc
Quản lý hóa đơn bán hàng
Tạo nhóm quyền cho Nhân viên cửa hàng
Gán các quyền cho nhóm quyền
GRANT SELECT ON CUA_HANG TO C##ROLE_NV;
GRANT SELECT, UPDATE (DiachiNV, SDTNV), ON NHAN_VIEN TO C##ROLE_NVCH;
GRANT SELECT ON NHA_CUNG_CAP TO C##ROLE_NVCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON KHACH_HANG TO C##ROLE_NVCH;
GRANT SELECT ON NHOM_THUOC TO C##ROLE_NVCH;
GRANT SELECT ON THUOC TO C##ROLE_NVCH;
GRANT SELECT ON KHO TO C##ROLE_NVCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON HOA_DON_BAN TO C##ROLE_NVCH;
GRANT SELECT, INSERT, UPDATE, DELETE ON CHI_TIET_BAN TO C##ROLE_NVCH;
Gán quyền và nhóm quyền cho người dùng Nhân viên đã tạo
GRANT CREATE SESSION TO C##NHAN_VIEN_CH;
GRANT C##ROLE_NVCH TO C##NHAN_VIEN_CH;
Tạo người dùng và gán profile cho Nhân viên kho
CREATE USER "C##NHAN_VIEN_KHO" IDENTIFIED BY nvk123
PROFILE C##Prf_NV;Nhân viên kho có các quyền:
Xem thông tin về cửa hàng
Xem thông tin nhân viên, chỉnh sửa thông tin về địa chỉ và số điện thoại
Xem thông tin của các nhà cung cấp thuốc
Xem thông tin về các nhóm thuốc
Thực hiện việc xem, thêm, sửa, xóa thông tin về các loại thuốc để có thể thực hiện việc nhập hàng
Thực hiện chỉnh sửa, thêm số lượng tồn trong kho khi thực hiện nhập kho. Quản lý hóa đơn nhập
Tạo nhóm quyền cho Nhân viên kho
Cấp các quyền cho nhóm quyền Nhân viên kho
GRANT SELECT ON CUA_HANG TO C##ROLE_NVK;
GRANT SELECT, UPDATE(DiachiNV, SDTNV) ON NHAN_VIEN TO
GRANT SELECT ON NHA_CUNG_CAP TO C##ROLE_NVK;
GRANT SELECT ON NHOM_THUOC TO C##ROLE_NVK;
GRANT SELECT, INSERT, UPDATE, DELETE ON THUOC TO C##ROLE_NVK; GRANT SELECT, UPDATE (Soluongthuoc) ON KHO TO C##ROLE_NVK;
GRANT SELECT, INSERT, UPDATE, DELETE ON HOA_DON_NHAP TO
GRANT SELECT, INSERT, UPDATE, DELETE CHI_TIET_NHAP TO
Gán quyền và nhóm quyền cho người dùng Nhân viên kho đã tạo
GRANT CREATE SESSION TO C##NHAN_VIEN_KHO;
GRANT C##ROLE_NVK TO C##NHAN_VIEN_KHO;
CHIẾN LƯỢC SAO LƯU VÀ PHỤC HỒI DỮ LIỆU
Sao lưu
Trong bối cảnh quản lý cửa hàng thuốc, việc sao lưu và phục hồi dữ liệu đóng vai trò cực kỳ cấp thiết Dữ liệu về hàng tồn kho, thông tin khách hàng, và giao dịch bán hàng là quan trọng để đảm bảo sự liên tục của hoạt động kinh doanh Sao lưu định kỳ giúp ngăn chặn mất mát dữ liệu do sự cố hệ thống, xóa hoặc lỗi kỹ thuật Trong khi đó, khả năng phục hồi từ bản sao lưu giúp cửa hàng nhanh chóng khôi phục dữ liệu sau các sự cố, đảm bảo tính toàn vẹn và ổn định của dữ liệu quan trọng Điều này không chỉ bảo vệ thông tin quan trọng mà còn giữ vững uy tín của cửa hàng trong mắt khách hàng và đối tác kinh doanh.
Các câu lệnh cần thiết trước khi backup:
– Tìm những tên và trạng thái của data file cần backup
SELECT FILE_NAME, STATUS FROM DBA_DATA_FILES;
– Kiểm tra trạng thái của redo log file
SELECT GROUP#, STATUS FROM V$LOG;
– Chuyển trạng thái của control file về chế độ backup
ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
– Chuyển trạng thái của tablespace về chế độ online backup
ALTER TABLESPACE THUOC BEGIN BACKUP;
ALTER TABLESPACE KHACH_HANG BEGIN BACKUP;
ALTER TABLESPACE HOA_DON BEGIN BACKUP;
– Kiêm tra trạng thái của data file đã ở chế độ online backup?
SELECT FILE_NAME, TABLESPACE_NAME, STATUS
FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'THUOC';
SELECT FILE_NAME, TABLESPACE_NAME, STATUS
FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'KHACH_HANG';SELECT FILE_NAME, TABLESPACE_NAME, STATUS
FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = 'HOA_DON'; Phương án backup: Recovery Manager (RMAN)
Recovery Manager (RMAN) là một công cụ được cung cấp bởi Oracle để quản lý và thực hiện các nhiệm vụ sao lưu, phục hồi và quản lý dữ liệu trong cơ sở dữ liệu Oracle RMAN được thiết kế để cung cấp các tính năng mạnh mẽ để bảo vệ và quản lý dữ liệu cơ sở dữ liệu Oracle một cách an toàn và hiệu quả.
RMAN có khả năng sao lưu toàn bộ cơ sở dữ liệu hoặc từng thành phần riêng biệt Ngoài ra, RMAN còn có chức năng lên lịch và thực hiện các hoạt động sao lưu một cách tự động theo chu kỳ định sẵn Tính năng quản lý thông tin về các bản sao lưu được tạo như quản lý không gian lưu trữ, kiểm tra tính toàn vẹn dữ liệu và chuẩn bị cho quá trình phục hồi cũng được RMAN tự động thực hiện Cuối cùng, RMAN có khả năng xóa tự động các file redo log đã được sao lưu khỏi cả đĩa và băng, giúp giải phóng không gian lưu trữ.
Có 2 loại backup: Full Backup (backup toàn bộ thông tin trong các data file) và Incremental Backup (chỉ backup những thông tin thay đổi kể từ lần backup trước)
Thông tin về thuốc vào mỗi cuối ngày Vì nhóm thuốc và kho là khóa ngoại của thuốc nên thực hiện sao lưu tại tablespace chứa đồng thời 3 bảng Cài đặt tự động sao lưu
Bước 1: Tạo file sao lưu trên Notepad
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'C:\Backup_hieuthuoc\ctl_%F';
ALLOCATE CHANNEL RMAN DEVICE TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0
TABLESPACE THUOC FORMAT 'C:\Backup_hieuthuoc\%T_%U';
Lưu với tên “backup_thuoc_script.bat”
Bước 2: Mở Task Scheduler trên window → Create a Basic Task Đặt tên file sao lưu “Sao luu thong tin thuoc” bấm Next đến Trigger và chọn Daily Tại đây đặt lịch backup vào cuối ngày
Hình 39: Đặt lịch sao lưu Chọn Action là Start a program, chọn file backup vừa tạo.
Hình 40: Thêm file sao lưu Nhấn Finish để hoàn thành tự động sao lưu.
Hình 41: Hoàn thành tự động sao lưu Sao lưu toàn bộ cơ sở dữ liệu vào cuối mỗi tháng Cài đặt tự động sao lưu
Bước 1: Tạo file sao lưu trên Notepad
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK
ALLOCATE CHANNEL RMAN DEVICE TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 0 DATABASE FORMAT 'C:\Backup_toanbo_%T_s%s_s%p' PLUS ARCHIVELOG DELETE INPUT; DELETE NOPROMPT OBSOLETE;
Lưu với tên “backup_script.bat”
Bước 2: Mở Task Scheduler trên Window Đặt tên file sao lưu “Sao luu toan bo” bấm Next đến Trigger và chọn monthly Tại đây đặt lịch backup vào cuối mỗi tháng
Hình 42: Đặt lịch sao lưu Chọn Action là Start a program, chọn file backup vừa tạo.
Hình 43: Thêm file sao lưu Nhấn Finish để hoàn thành tự động sao lưu.
Hình 44: Hoàn thành tự động sao lưu
Thông tin khách hàng và hóa đơn bán được sao lưu vào cuối mỗi ngày, chỉ sao lưu thông tin mới hoặc đã thay đổi từ ngày trước đó để tiết kiệm tài nguyên lưu trữ. Cài đặt tự động sao lưu
Bước 1: Tạo file sao lưu trên notepad
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK
ALLOCATE CHANNEL RMAN DEVICE TYPE DISK;
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 1
FORMAT 'C:\Backup_hieuthuoc\Khach_hang_%T_%U';
BACKUP AS COMPRESSED BACKUPSET INCREMENTAL LEVEL 1
FORMAT 'C:\Backup_hieuthuoc\Hoa_don_ban_%T_%U';
Lưu với tên “backup_khhdb_scipt.bat”
Bước 2: Mở Task Scheduler trên Window
Cài đặt sao lưu tự động vào 23:59 chủ nhật hàng tuần
Hình 45: Đặt lịch sao lưuChọn Action là Start a program, chọn file backup vừa tạo.
Hình 46: Thêm file sao lưu Nhấn Finish để hoàn thành tự động sao lưu
Hình 47: Hoàn thành tự động sao lưu
Phục hồi
Mất dữ liệu trong cơ sở dữ liệu có thể do nhiều nguyên nhân như lỗi phần cứng, phần mềm, hoặc do lỗi người dùng Virus, thiên tai, lỗi cấu hình, và các tấn công mạng cũng có thể gây mất dữ liệu Vì vậy việc có các bản sao lưu và phương thức phục hồi là vô cùng quan trọng
Các bước thực hiện phục hồi dữ liệu
Bước 1: Kiểm tra lỗi gây mất dữ liệu, các dữ liệu bị mất
Bước 2: Tiến hành phục hồi dữ liệu từ các bản sao lưu bằng RMAN
Cần tắt Database nếu đang ở chế độ Noarchivelog bằng lệnh SHUTDOWN IMMEDIATE;
Tiến hành phục hồi bằng RMAN
RMAN> RESTORE DATAFILE '/path/to/backup_hieuthuoc/datafile.bkp'; RMAN> RECOVER DATAFILE '/path/to/backup_hieuthuoc/datafile.bkp'; ALTER DATABASE OPEN RESETLOGS;
Cần tắt Database nếu đang mở bằng lệnh SHUTDOWN IMMEDIATE;
Tiến hành phục hồi bằng RMAN
'/path/to/backup_hieuthuoc/controlfile.bkp';
Cần tắt Database nếu đang ở chế độ Noarchivelog bằng lệnh SHUTDOWN IMMEDIATE;
Tiến hành phục hồi bằng RMAN
RECOVER DATABASE UNTIL TIME 'YYYY-MM-DD:HH24:MI:SS';ALTER DATABASE OPEN RESETLOGS;