Mục lụcLỜI NÓI ĐẦU3PHẦN 1: THỰC HIỆN ĐỀ TÀI3CHƯƠNG I: PHÂN TÍCH VÀ THIẾT KẾ BÀI TOÁN4CHƯƠNG II: CÀI ĐẶT TRUY XUẤT CƠ SỞ DỮ LIỆU TRONG SQL SERVER 20085I.Tạo cơ sở dữ liệu51.Tạo database52.Nhập dữ liệu vào bảng (dùng lệnh INSERT INTO)93.Mô hình quan hệ cơ sở dữ liệu12II.Các lệnh, thủ tục truy xuất dữ liệu131.Xây dựng khung nhìn VIEW132.Thủ tục lưu trữ163.Trigger194.Giao tác205.Phân quyền22PHẦN 2: BÀI TẬP BẮT BUỘC24KẾT LUẬN57Tài liệu tham khảo57
Trang 1Hà Nội 12-2012
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
Trang 2Mục lụ
LỜI NÓI ĐẦU 3
PHẦN 1: THỰC HIỆN ĐỀ TÀI 3
CHƯƠNG I: PHÂN TÍCH VÀ THIẾT KẾ BÀI TOÁN 4
CHƯƠNG II: CÀI ĐẶT TRUY XUẤT CƠ SỞ DỮ LIỆU TRONG SQL SERVER 2008 5
I Tạo cơ sở dữ liệu 5
1 Tạo database 5
2 Nhập dữ liệu vào bảng (dùng lệnh INSERT INTO) 9
3 Mô hình quan hệ cơ sở dữ liệu 12
II Các lệnh, thủ tục truy xuất dữ liệu 13
1 Xây dựng khung nhìn VIEW 13
2 Thủ tục lưu trữ 16
3 Trigger 19
4 Giao tác 20
5 Phân quyền 22
PHẦN 2: BÀI TẬP BẮT BUỘC 24
KẾT LUẬN 57
Tài liệu tham khảo 57
Trang 3LỜI NÓI ĐẦU
Quản lý một cửa hàng, một công ty, hay một siêu thị là một trong những công việc hết sức phức tạp và khó khăn nếu quản lý bằng tay Chính vì vậy, công nghệ thông tin với những công cụ thích hợp, được phát triển, xây dựng để hỗ trợ cho công tác quản
lý này.
Các công cụ được phát triển để hỗ trợ quản lý hiện nay như về phía cơ sở dữ liệu
có SQL Server 2008, My SQL, Access, Từ các cơ sở dữ liệu xây dựng bằng các hệ quản trị cơ sở dữ liệu trên, ta có thể dễ dàng quản lý các vấn đề đặt ra cho kế toán, quản lý một cửa hàng một doanh nghiệp dựa trên các công cụ có sẵn của hệ quản trị cơ sở dữ liệu, hoặc là sử dụng các ngôn ngữ lập trình khác như VB, C#, VB.NET,… để sử dụng cơ
sở dữ liệu đó.
Hệ quản trị cơ sở dữ liệu SQL Server 2008 là một hệ quản trị cơ sở dữ liệu của hãng Microsoft phát triển Phiên bản này là một trong những phiên bản phổ biến, và được sử dụng nhiều nhất trong các hệ thống quản lý Chính vì vậy, với đề tài được giao,
hệ quản trị cơ sở dữ liệu SQL Server là một trong những công cụ thích hợp và hợp lý.
Đề tài quản lí của chúng em là : “Quản lí hệ thống bán hàng ở siêu thị bán lẻ” Với đề tài này nhóm 13 chúng em chủ yếu nghiên cứu việc bán hàng trong một siêu thị bán lẻ kết hợp với các hàm thủ tục, trigger, phân quyền cho người dùng để tiến hành quản lí siêu thị hợp lí hơn.
Trang 4PHẦN 1: THỰC HIỆN ĐỀ TÀI
CHƯƠNG I: PHÂN TÍCH VÀ THIẾT KẾ BÀI TOÁN
Hiện nay có rất nhiều các hệ thống siêu thị vừa và nhỏ, với rất nhiều các loại mặt hàng trong đó siêu thị Thành là một trong các siêu thị bán lẻ các loại mặt hàng dân dụng Vấn đề đặt ra đổi với các nhà quản lí của siêu thị đó là làm sao để quản
lí được hệ thống bán hàng trong siêu thị một cách tốt nhất Người ta xây dựng, tổ chức hệ thống thông tin để theo dõi, quản lí hàng hóa và phục vụ việc mua hàng của khách hàng (ở đây chỉ xét bài toán quản lí hàng hóa và bán hàng).
Qua việc tìm hiểu các tài liệu và thông tin trên mạng chúng ta thấy có rất nhiều cách để quản lí việc mua bán trong siêu thị bán lẻ, nhưng với công cụ đắc lực
là SQL SERVER 2008 được sử dụng rất phổ biến và sẽ giúp cho chúng ta quản lí được công việc bán hàng một cách có hệ thống, bảo mật và chặt chẽ nhất
Trong bài toán xây dựng và thiết kế phần mềm quản lý hệ thống bán hàng trong siêu thị bán lẻ này, chúng em xây dựng mô hình cơ sở dữ liệu Quản lý Siêu thị (QLST) quản lý các thông tin về khách hàng, nhân viên, các mặt hàng và các hóa đơn hàng của khách hàng Cơ sở dữ liệu QLST gồm 8 bảng đưa ra thông tin về các mặt hàng, nhà cung cấp, khách hàng, nhân viên, hóa đơn hàng, và thông tin về các mặt hàng được nhập
Trang 5CHƯƠNG II: CÀI ĐẶT TRUY XUẤT CƠ SỞ DỮ LIỆU
tạo bảng nhà cung cấp
(nhacc) create table nhacc(
manhacc nvarchar(5) PRIMARY KEY,tennhacc nvarchar(100) NOT NULL,
Trang 6diachi nvarchar(200) NOT NULL,dienthoai nvarchar(20) NOT NULL)
tạo bảng hàng hóa
(hanghoa) create table hanghoa(
mahang nvarchar(5) PRIMARY KEY,tenhang nvarchar(100) NOT NULL,manhacc nvarchar(5) not null,dvtinh nvarchar(10) NOT NULL,giahang money not null,
khuyenmai real not null,
foreign key(manhacc)
references nhacc(manhacc) )
tạo bảng khách
hàng(khachhang) create table khachhang(
makh nvarchar(5) primary key,tenkh nvarchar(50) not null,diachi nvarchar(100) not null,dienthoai nvarchar(20) not null)
tạo bảng nhân viên
(nhanvien) create table nhanvien(
manv nvarchar(5) primary key,tennv nvarchar(50) not null,ngaysinh datetime not null,diachi nvarchar(100) not null,dienthoai nvarchar(20) not null,luong money not null
tạo bảng hóa đơn
(hoadon) create table hoadon(
mahd nvarchar(5) PRIMARY KEY,ngayhd datetime NOT NULL,makh nvarchar(5) NOT NULL,manv nvarchar(5) NOT NULL,
foreign key(makh)
references khachhang(makh),
foreign key(manv)
references nhanvien(manv))
Trang 7tạo bảng chi tiết hóa đơn
(cthoadon) create table cthoadon(
mahd nvarchar(5),mahang nvarchar(5),soluong smallint NOT NULL,dongia money not null,
primary key(mahd,mahang),
foreign key (mahd)
references hoadon(mahd),
foreign key(mahang)
references hanghoa(mahang))
tạo bảng phiếu nhập
(pnhap) create table pnhap(
mapn nvarchar(5) PRIMARY KEY,ngaynhap datetime NOT NULL,mahd nvarchar(5),
foreign key(mahd)
references hoadon(mahd))
tạo bảng chi tiết phiếu nhập
(ctpnhap) create table ctpnhap(
mapn nvarchar(5),mahang nvarchar(5),slnhap smallint NOT NULL,dgnhap money not null,
PRIMARY KEY (mapn,mahang),
foreign key (mapn)
references pnhap(mapn),
foreign key(mahang)
references hanghoa(mahang))
GO
Sau khi chạy các câu lệnh, ta được 8 bảng như sau:
a) Bảng nhà cung cấp (nhacc):
Trang 8b) Bảng hànghóa (hanghoa):
c) Bảng khách hàng (khachhang):
d) Bảng nhân viên (nhanvien):
e) Bảng hóa đơn (hoadon):
f) Bảng chi tiết hóa đơn (cthoadon):
Trang 9g) Bảng phiếu nhập (pnhap):
h) Bảng chi tiết phiếu nhập (ctpnhap):
2 Nhập dữ liệu vào bảng (dùng lệnh INSERT INTO):
USE QLST
GO
INSERT INTO nhacc VALUES
('CC01','Pham Nguyen','Quan 12 - HCM','0835926885'),
('CC02','Trang Tien','Đong Đa - Ha Noi','0436462740'),
('CC03','Ngoi Sao','Tu Liem - Ha Noi','0462656566'),
('CC04','MASAN Group','Tan Phu - HCM','0438247773')
INSERT INTO hanghoa VALUES
('TL100','Tra lai Tam Chau 100g','CC01','Hop','26900','0'),('KS150','Keo sua Caramen 150g','CC02','Goi','29500','0'),('BG195','Banh gau Koala 195g','CC03','Hop','50200','0'),
Trang 10INSERT INTO khachhang VALUES
('KH01','Tran Van An','Go Vap - HCM','92857295'),
('KH02','Le My Le','Cau Giay - Ha Noi','57395799'),
('KH03','Nguyen Nhu Ngoc','Tay Ho - Ha Noi','29572935'),('KH04','Hoang Quoc Dat','Quan 1 - HCM','94728947')
INSERT INTO nhanvien VALUES
('NV01','Nguyen Thi Nga','1989-02-18','Binh Thanh -
Sau khi chạy các cậu lệnh chúng ta có thông tin chi tiết trong các bảng như sau:
Các thông tin trong bảng nhà cung cấp:
Trang 11Các thông tin trong bảng hàng hóa:
Các thông tin trong bảng khách hàng:
Các thông tin trong bảng nhân viên:
Các thông tin trong bảng hóa đơn:
Trang 12Các thông tin trong bảng chi tiết hóa đơn:
Các thông tin trong bảng phiếu nhập:
Các thông tin trong bảng chi tiết phiếu nhập:
3 Mô hình quan hệ cơ sở dữ liệu
Hình 1: Mô hình quan hệ cơ sở dữ liệu QLSieuThi
Trang 13II Các lệnh, thủ tục truy xuất dữ liệu
1 Xây dựng khung nhìn VIEW
Một khung nhìn (View) là một tập gồm các dòng và các cột, và có thể được xemnhư là một bảng ảo trong cơ sở dữ liệu có nội dung được định nghĩa thông qua một truyvấn (câu lệnh SELECT)
Dưới đây là một số cậu lệnh minh họa cho view:
a) Tạo view vw_hanghoa gồm mã hàng, tên hàng liệt kê danh sách các mặt hàng trong bảng hanghoa
Sau khi chạy view ta dc bảng sau:
b) Tạo view vw_tt_hanghoa thống kê những mặt hàng nào chưa được mua
GO
Trang 14Những mặt hàng chưa được mua:
c) Tạo view vw_thongke thống kê trong năm 2000, mỗi mặt hàng trong mỗi tháng vàtrong cả năm bán được với số lượng bao nhiêu
USE QLST
GO
create view vw_thongke
as
select b.mahang, tenhang,
SUM(case MONTH(ngayhd) when 1 then b.soluong else
where YEAR(ngayhd)=2000
GROUP BY b.mahang, tenhang
Trang 15Thống kê hàng hóa:
d) Tạo view vw_thongke_nhanvien cho biết nhân viên nào của công ty bán được số
lượng hàng nhiều nhất và số lượng hàng bán được của những nhân viên này là baonhiêu
USE QLST
GO
create view vw_thongke_nhanvien
as
select nhanvien.manv, tennv, SUM(soluong) as tonghang
from (nhanvien inner join hoadon
on nhanvien.manv=hoadon.manv)inner join cthoadon
on hoadon.mahd=cthoadon.mahdgroup by nhanvien.manv, tennv
having SUM(soluong)>=ALL(select SUM(soluong)
from (nhanvien inner join hoadon onnhanvien.manv=hoadon.manv)
inner join cthoadon
on hoadon.mahd=cthoadon.mahdgroup by nhanvien.manv, tennv)
GO
Thống kê nhân viên: (nhân viên bán được nhiều hàng nhất)
e) Xóa view vw_hanghoa
DROP view vw_hanghoa
f) Cập nhật dữ liệu vào view vw_bosung_hanghoa
USE QLST
GO
create view vw_bosung_hanghoa
as
Trang 16select mahang, tenhang, hanghoa.manhacc, dvtinh,giahang, khuyenmai
from hanghoa full outer join nhacc onhanghoa.manhacc=nhacc.manhacc
GO
bổ sung thêm thông tin vào bảng hanghoa
insert into vw_bosung_hanghoa(mahang, tenhang, manhacc,
dvtinh, giahang, khuyenmai)
values ('DBS1', 'Duong sieu sach Bonsu 1kg', 'CC02', 'Goi','21300', '0')
Bảng hàng hóa sau khi cập nhật thông tin:
declare @serrsmg nvarchar(200)
if exists (select mahang from hanghoa where mahang=@smahang)
Trang 17b) Xây dựng thủ tục nội tại tính số lượng đơn hàng với tên spud_nhap_tongslnhap với hai tham số vào là tenhang, slhoadon, 1 tham số ra là tổng số lượng đã nhập trong
select cthoadon.mahang,tenhang from cthoadon
inner join hanghoa on cthoadon.mahang=hanghoa.mahangorder by cthoadon.mahang
declare @serrsmg varchar(200)
if exists (select tenhang,soluong from hanghoa.cthoadon
where tenhang=@stenhang and soluong=@nsoluong)
begin
set @serrsmg ='tên hàng,tổng số lượng nhập
['+@stenhang+@nsoluong+'] đã có,xin cấp một tên khác,số lượng nhập khác'
raiserror (@serrsmg ,16,2)
return
end
insert cthoadon.hanghoa(mahang,tenhang,soluong)
values(@smahang,@stenhang,@nsoluong)
go
GO
c) Xây dựng thủ tục nội tại thêm mới dữ liệu vào bảng nhacc Trong đó phải kiểm tra các ràng buộc trước khi thực hiện lệnh insert into manhacc phải có trong bảng nhacc
create proc spud_nhacc_insert
select nhacc.manhacc,tennhacc,mahang from hanghoa hh
inner join nhacc on hh.manhacc=nhacc.manhaccorder by nhacc.manhacc
declare @serrsmg varchar(200)
if exists (select tennhacc, manhacc from nhacc.hh
where tennhacc=@stennhacc and manhacc=@smanhacc)
begin
Trang 18set @serrsmg='tên nhacc, mã
nhacc['+@stennhacc+@smanhacc+']đã có ,xin cấp thêm một tên khác, một mã nhacc khác'
raiserror(@serrsmg,16,2)
return
end
insert into nhacc.hanghoa(manhacc,tennhacc,diachi,dienthoai)
values(@smanhacc,@stennhacc,@sdiachi,@sdienthoai)
go
d) Xây dựng thủ tục sửa đổi hàng hóa trong bảng hanghoa với tên spud_hanghoa_sua
gồm có 4 tham số vào chính là giá trị cần thay đổi Trong thủ tục chỉ thực hiện UPDATE SET để cập nhật dữ liệu
create proc spud_hanghoa_sua
declare @serrsmg nvarchar(200)
if exists (select mahang from hanghoa
where mahang=@smahang)
e) Xây dựng thủ tục hiển thị dữ liệu cho báo cáo hóa đơn Các thông tin trên báo cáo
bao gồm các cột trong bảng hoadon, cthoadon, hanghoa, nhacc Thủ tục có các
tham số để lọc dữ liệu báo cáo theo đúng mã hóa đơn nhập vào, tuy nhiên nếu khigọi thủ tục mà không truyền vào thì xem như hiển thị tất cả các số đặt hàng có trong
hoadon
create proc spud_hoadon_baocaohoadon
@smahd char(4)=null,
@smahang varchar(4),
@stenhang varchar(50)
as
set nocount on
Trang 19if @smahd is null
select hd.*,ct.mahang,soluong,tennhacc from hoadon hd
inner join cthoadon ct on ct.mahd=hd.mahdinner join hanghoa hh on hh.mahang=ct.mahanginner join nhacc ncc on ncc.manhacc=hh.manhaccorder by ct.mahd, ct.mahang
else
select hd.*,ct.mahang,tenhang,soluong,tennhacc from hoadon hd
inner join cthoadon ct on ct.mahd=hd.mahdinner join hanghoa hh on hh.mahang=ct.mahanginner join nhacc ncc on ncc.manhacc=hh.manhacc where ct.mahd=@smahd
select @mahang=mahang from hanghoa
where mahang in(select mahang from deleted)
set @del_err = @@ERROR
Trang 20create trigger tg_cthoadon_update
from (deleted inner join inserted on
deleted.mahang=inserted.mahang)
if not exists(select I.mapn from inserted I, pnhap pn
where pn.mapn=I.mapn)
begin
rollback transet @serrmsg='ma phieu nhap hang khong co, nhap lai'raiserror (@serrmsg,16,1)
returnend
Trang 21raiserror (@serrmsg,16,1)
returnend
a) Giao tác không tường minh
− Cập nhật dữ liệu vào bảng nhacc, thêm nhà cung cấp mới
use QLST
go
insert into nhacc
values('CC05','Tien Phat','Go Vap - HCM','29482490')
Trang 22− Sử dụng lệnh begin tran để chỉ định bắt đầu thực hiện giao tác thêm nhà cung cấp
mới vào bảng nhacc
set ansi_warnings off
go
select COUNT(*) as 'tong nha cung cap truoc khi them' fromnhacc
begin tran
insert into nhacc(manhacc,tennhacc,diachi,dienthoai)
values('CC06','Phu Dat','Ba Dinh - Ha Noi','95825689')
select COUNT (*) as 'tong nha cung cap sau khi them trong giaotac' from nhacc
a) Tạo tên đăng nhập (login) và người dùng (user)
− Tạo tên đăng nhập:
CREATE login [nhom13]
with password='1234'
− Tạo tên người dùng:
CREATE user [QLST]
for login [nhom13]
b) Phân quyền cho user 'QLST' thao tác dữ liệu với các bảng
grant all on nhacc to QLST with grant option
grant all on hanghoa to QLST with grant option
grant all on dondh to QLST with grant option
grant all on ctdondh to QLST with grant option
grant all on pnhap to QLST with grant option
grant all on ctpnhap to QLST with grant option
grant all on ctpxuat to QLST with grant option
grant all on pxuat to QLST with grant option
− Thao tác trên cho phép user 'QLST' có thể thực hiện các thao tác như INSERT,UPDATE, trên các bảng thuộc CSDL và được phép phân quyền cho các user khác(phân các quyền được cho)
Trang 23c) Tạo tài khoản truy nhập(login) và khách hàng(user)
− Tạo tài khoản truy nhập cho khách
CREATE login [khach hang1]
with password='1122'CREATE login [khach hang2]
with password ='3344'
− Tạo một user tương ứng với tài khoản khách
CREATE user [KH01] for login [khach hang1]
CREATE user [KH02] for login [khach hang2]
d) Phân quyền cho khách hàng
− Phân quyền cho user KH01
grant select on hoadon to KH01
grant select on hanghoa to KH01 with grant option
− Người dùng KH01 chuyển tiếp cấp phát quyền cho KH02
grant select on hanghoa to KH02
− Thu hồi quyền đối với khách1
revoke select on hanghoa from KH01 CASCADE
Trang 24PHẦN 2: BÀI TẬP BẮT BUỘC
Bài 2: Các đối tượng trong cơ sở dữ liệu
Bài 2.1: Tạo database
USE master
GO
IF exists (select * from sysdatabases where name='QLBanHang')
drop database QLBanHangGO
create database QLBanHang
create table vattu(
mavtu nvarchar(4) primary key,
tenvtu nvarchar(100),
dvtinh nvarchar(10),
phantram real,)
create table nhacc(
manhacc nvarchar(3) primary key,
tennhacc nvarchar(100),
diachi nvarchar(200),
dienthoai nvarchar(20),
Trang 25primary key(sodh),
foreign key(manhacc) references nhacc(manhacc))
create table ctdondh(
sodh nvarchar(4),
mavtu nvarchar(4),
sldat smallint,
primary key(sodh, mavtu),
foreign key (sodh) references dondh(sodh),
foreign key(mavtu) references vattu(mavtu))
create table pnhap(
primary key(sopn,mavtu),
foreign key (sopn) references pnhap(sopn),
foreign key(mavtu)references vattu(mavtu))
create table pxuat(
Trang 26create table ctpxuat(
sopx nvarchar(4),
mavtu nvarchar(4),
slxuat smallint,
dgxuat money,
primary key(sopx, mavtu),
foreign key(sopx) references pxuat(sopx),
foreign key(mavtu) references vattu(mavtu))
create table tonkho(
primary key(namthang, mavtu),
foreign key(mavtu) references vattu(mavtu))
Trang 28Bài 2.3: Thêm dữ liệu vào bảng (dùng lệnh insert into)
USE QLBanHang
GO
insert into nhacc
values ('C01','Lê Minh Trí','54 Hậu Giang Q6 HCM','8781024'),
insert into vattu
values ('DD01','Đầu DVD Hitachi 1 đĩa','Bộ','40'),
('TL15','Tủ lạnh Sanio 150 lit','Cái','25'),('TL90','Tủ lạnh Sanio 90 lit','Cái','20'),
insert into dondh