ĐỀ TÀI :QUẢN LÝ MƯỢN SÁCH
Trang 1TRƯỜNG ĐẠI HỌC SƯ PHẠM KĨ THUẬT HƯNG YÊN
KHOA CÔNG NGHỆ THÔNG TIN
-o0o -TIỂU LUẬN
MÔN : CƠ SỞ DỮ LIỆU NÂNG CAO
ĐỀ TÀI :QUẢN LÝ MƯỢN SÁCH
Giáo viên hướng dẫn : Trịnh Thị Nhị
Sinh viên thực hiện : Lớp: TK6LC1
Hưng Yên, Tháng 4 năm 2010
Trang 2Cho CSDL của hệ thống quản lý mượn sách với các cấu trúc bảng sau: Bảng 1: Loaisach
STT Fieldname Data Type Fieldsize Note
Bảng 3: Docgiatra
STT Fieldname Data Type Fieldsize Note
Trang 31 Manxban Text 4 Khoá chính
Sử dụng ngôn ngữ T - SQL thực hiện các yêu cầu sau:
Câu 1:
1 Tạo CSDL trên với các ràng buộc toàn vẹn dựa vào thực tế
2 Nhập dữ liệu vào các bảng
Câu 2:
3 Thêm các rang buộc và xóa các rang buộc theo yêu cầu
4 Tạo một truy vấn TV1 để hiển thị danh sách độc giả mượn sách trong tháng 10 năm 98
bao gồm những thông tin: Hoten, ngaymuon, tensach, tentacgia
5 Tạo một truy vấn TV2 để hiển thị số lượng còn của mỗi loại sách của nhà xuất bản Kim đồng bao gồm những thông tin: tensach, nxban, soluongcon.
6 Tạo một truy vấn TV3 để hiển thị danh sách những độc giả mượn sách quá hạn bao
gồm những thông tin: Hoten, Ngaymuon, Ngayhen, songayqua (Số ngày quá hạn)
7 Tạo một truy vấn TV4 để hiển thị danh sách những độc giả mượn sách quá hạn bao
gồm những thông tin Hoten, sluong, mucquahan
Trong đó: Mucquahan là Mức 1 nếu songayqua<5
Mucquahan là Mức 2 nếu songayqua<10Mucquahan là Mức 3 nếu songayqua>=10
8 Tạo một truy vấn TV5 để hiển thị danh sách những độc giả trả sách đúng hạn hoặc
sớm hạn bao gồm những thông tin: Hoten, masach, tensach
9 Tạo một truy vấn TV6 để hiển thị những loại sách có số trang >100 và số lượng còn là
20 của nhà xuất bản giáo dục hoặc tên sách có chữ Tin học bao gồm Tensach, sotrang,
Trang 4Câu 4:
Thiết lập chỉ mục và chỉ mục toàn văn trên bảng Docgiamuon Ứng dụng để tìm kiếm
theo chỉ mục mà mình vừa tạo ra
Yêu cầu cơ bản:
- Trên đây là các yêu cầu bắt buộc Sinh viên tạo CSDL với các ràng buộc toàn vẹn dựa vào thực tế
Sinh viên tự đưa ra thêm các câu hỏi thuộc các dạng (thuộc tập DDL, DML), Store
procedure, Trigger và thực hiện các câu hỏi đó
BÀI LÀM
/*Câu 1:
1 Tạo Database và tạo bảng*/
Tạo Database được lưu trong ổ F:
create database QLMUONSACH
on( name='QLMUONSACH_dat',
filename='F:\CaithienCSDL\QLMUONSACH_dat.mdf' )
Trang 5log on (name='QLMUONSACH_log',
filename='F:\CaithienCSDL\QLMUONSACH_log.ldf' )
Tạo các bảng cần thiết
.Tạo bảng Nhà xuất bản
if exists (select * from sysobjects where name='Nhaxban')
drop table Nhaxban
create table Nhaxban
(Manxban char(4) primary key,Ten_xb nvarchar(30),diachi_nxb nvarchar(30)) Tạo bảng loại sach
If exists(select * from sysobjects where name=’loaisach’)
Drop table loaisach
go
create table Loaisach
(Masach char(4) primary key, Tensach nvarchar(20),Tentacgia
nvarchar(20),Namxb datetime CONSTRAINT c_nxb CHECK(Namxb
BETWEEN '01/01/1990' AND '01/01/2010'),Soluongco int constraint c_sl check(Soluongco between 0 and 999),Sotrang int constraint c_st check(Sotrang between 0 and 99999),Manxban char(4),
constraint fk_xb foreign key(Manxban) references Nhaxban(Manxban)
)
Tạo bảng Độc giả mượn
create table Docgiamuon
(
Madocgia char(4) ,
Hoten nvarchar(30), quequan nvarchar(30),Masach char(4), constraint fk_dg foreign key(Masach) references Loaisach(Masach),
Trang 6Sluong int constraint c_soluong check(Sluong between 0 and 9),ngaymuon datetime CONSTRAINT c_ngaymuon CHECK(Ngaymuon BETWEEN
'01/01/1990' AND '01/01/2010'),ngayhen datetime CONSTRAINT c_ngayhen CHECK(ngayhen BETWEEN '01/01/1990' AND '01/01/2010'),constraint
pk_docgiamuon primary key(Madocgia,Masach,Ngaymuon)
)
Tạo bảng độc giả trả
create table Docgiatra
(
Madocgia char(4),Masach char(4),constraint fk_dgt foreign key(Masach)
references Loaisach(Masach),Ngaytra datetime constraint c_trasach
check(Ngaytra BETWEEN '01/01/1990' AND '01/01/2010'),constraint
pk_docgiatra primary key(Madocgia,masach,Ngaytra)
)
2 Nhập dữ liệu vào bảng
Nhập dữ liệu bảng Nhà xuất bản
Insert into Nhaxban values('nxb1','Nha xuat ban giao duc','ha noi')
Insert into Nhaxban values('nxb2','Nha xuat ban Da Nang','Da nang')
Insert into Nhaxban values('nxb3','Nha xuat ban Thanh Pho HCM','Thanh Pho HCM')
Insert into Nhaxban values('nxb4','Nha xuat ban Can tho','Can tho')
Câu 2:
1.Tạo một truy vấn TV1 để hiển thị danh sách độc giả mượn sách trong tháng 10 năm 98
bao gồm những thông tin: Hoten, ngaymuon, tensach, tentacgia.
Select Hoten,Ngaymuon,tensach,tentacgia
from loaisach as t1,docgiamuon as t2
where t1.masach=t2.masach and month(ngaymuon)=10 and year(ngaymuon)=1998
Trang 72. Tạo một truy vấn TV2 để hiển thị số lượng còn của mỗi loại sách của nhà xuất
bản Kim đồng bao gồm những thông tin: tensach, nxban, soluongcon
Select tensach,ten_xb,sum(soluongco-sluong) as soluongcon into TV2
from Nhaxban as t1,docgiamuon as t2,loaisach as t3
where t1.manxban=t3.manxban and t2.masach=t3.masach and ten_xb = 'kim dong'group by tensach,ten_xb
3 Tạo một truy vấn TV3 để hiển thị danh sách những độc giả mượn sách quá
hạn bao gồm những thông tin: Hoten, Ngaymuon, Ngayhen, songayqua (Số ngày quá hạn)
Select hoten,Ngaymuon,Ngayhen,sluong,(year(ngayhen)-year(ngaymuon))*365+(month(ngayhen)-month(ngaymuon))*30+(day(ngayhen)-day(ngaymuon)) as Songayquahan into TV3
from Docgiamuon
4 Tạo một truy vấn TV4 để hiển thị danh sách những độc
giả mượn sách quá hạn bao gồm những thông tin Hoten, sluong, mucquahan
Trong đó: Mucquahan là Mức 1 nếu songayqua<5
Mucquahan là Mức 2 nếu songayqua<10
Mucquahan là Mức 3 nếu songayqua>=10
Select hoten,Sluong,Songayquahan,'Mucquahan'=
case
when Songayquahan<5 then 'Muc 1'
when Songayquahan<10 then 'Muc 2'
else 'Muc 3'
end
into TV4
from dbo.TV3
5 Tạo một truy vấn TV5 để hiển thị danh sách những độc giả trả sách
đúng hạn hoặc sớm hạn bao gồm những thông tin: Hoten, masach, tensach
Select hoten,t1.masach,tensach
Trang 8from loaisach as t1, docgiamuon as t2,docgiatra as t3
where t1.masach=t2.masach and t1.masach=t3.masach and
t2.madocgia=t3.madocgia and ngayhen>=(select ngaytra from docgiatra)
6 Tạo một truy vấn TV6 để hiển thị những loại sách có số trang >100 và số
lượng còn là 20 của nhà xuất bản giáo dục hoặc tên sách có chữ Tin học bao gồm
Tensach, sotrang, ten_xb, tentacgia
select Tensach,sotrang,ten_xb,tentacgia
from Nhaxban as t1,loaisach as t2
where t1.manxban=t2.manxban and sotrang>100 and(soluongco=20 or tensach like'%tin hoc%' )
7. Hiển thị thông tin của độc giả mượn nhiều sách nhất
select
t1.hoten,t1.quequan,t1.sluong,t1.ngayhen,t1.madocgia,t1.ngaymuon,count(t1.masach) as slsach
from docgiamuon as t1
group by t1.hoten,t1.quequan,t1.sluong,t1.ngayhen,t1.madocgia,t1.ngaymuonhaving count (t1.masach)>=all(select count(masach) from loaisach)
Câu 3: Tạo ra các view (tối thiểu 3 view) So sánh bảng và view
Thực hiện tất cả các thao tác có thể có trên view
-VIEW : hien thi thong tin doc gia muon sach thang 6 nam 2001
where month(ngaymuon)=6 and year(ngaymuon)=2001
select * from Docgiamuon_theongay
Trang 9View:hien thi thong tin loai sach co doc gia muon nhieu nhat
create view tt_sach
having count(t2.masach)>=all(select count(masach) from loaisach)
hien thi thong tin cua doc gia co ten la Lan muon sach cua nha xuat ban Giao duc hoac muon ngay '23/5/2002'
create view docgia_xb
as
select hoten,quequan,sluong,ten_xb,ngaymuon
from docgiamuon as t1,nhaxban as t2,loaisach as t3
where t1.masach=t3.masach and t2.manxban=t3.manxban and hoten='%lan' and
ngaymuon='23/5/2002'
So sánh bảng và View
* Định nghĩa:
- Các bảng là các đối tượng của CSDL,nó chứa tất cả các dữ liệu có mặt trong một
CSDL Một CSDL được cấu thành từ nhiều bảng, mỗi bảng chứa tập hợp các dữ liệucó liên quan với nhau
- View là một cách thức để xem các dữ liệu từ một hay nhiều bảng trong CSDL View là một bảng ảo, bảng ảo được tạo ra như một tập con của các cột hay các hàng từ một hay nhiều bảng khác nhau Đồng thời nó cũng bao gồm tất cả các hàng và các cột.Tuy nhiên, một view không tồn tại như một tập hợp của các giá trị dữ liệu lưu trữ trong cơ sở dữ liệu.Các dòng và các cột đến từ các bảng tham chiếu trong chuỗi truy vấn Dữ liệu được hiển thị trực tiếp từ bảng ngay tại thời gian thục thi
Giống nhau: Khi dữ liệu hiển thị thì đều hiển thị dạng bảng.Bảng và View đều có thể được xây dựng dựa vào các bảng,view khác
Trang 10Khác nhau:
+Bảng: Thao tác trực tiếp với cơ sở dữ liệu
+ View: Khi thao tác thì không có ảnh hưởng gì đến cơ sở dữ liệu
- View chỉ có thể được tạo trong CSDL hiện tại
- Những giá trị mặc định, những qui tắc và bẫy lỗi không thể được liên kết với view Còn bảng thì hoàn toàn có các khả năng đó
- Các bảng tạm thời không thể tham gia vào view
- Khai báo view được lưu giữ ngay cả khi các bảng liên quan bị loại bỏ
- Các câu truy vấn khai báo view không thể bao gồm các mệnh đề ORDER BY, COMPUTE, COMPUTE BY hoặc từ khoá INTO
- Khi xoá view thì không ảnh hưởng gì đến CSDL
Câu 4: Thiết lập chỉ mục và chỉ mục toàn văn trên bảng Dogiamuon Ứng dụng để tìm
kiếm theo chỉ mục mà mình vừa tạo ra
alter table Docgiamuon
drop index sinhvien.id_madocgia
create index id_docgiamuon on Docgiamuon(madocgia)
timkiem theo chi muc
select * from Docgiamuon where madocgia='dg1'
Tạo thêm một chỉ mục khac trong bảng Đocgiamuon
Create NONCLUSTERED index id_thu
ON docgiamuon(masach)
Xem bản ghi trong bảng Docgiamuon
SELECT * FROM DOCHIAMUON
Sử dụng chỉ mục toàn văn
Các câu truy vấn toàn văn có thể được đưa ra trên các bảng mà ở đó các chỉ mục toàn văn
đã được định nghĩa Các câu truy vấn toàn văn sử dụng các từ khoá CONTAINS và PREETEXT Ta thực hiện các câu truy vấn toàn văn trên bảng docgiamuon
Select madocgia,hoten,masach,sluong
From docgiamuon
Trang 11Where CONTAINS(quequan,’”hung yen” or “hai duong”’)
Câu 5:
Đề xuất các chức năng của hệ thống, viết các Store procedure đáp ứng các chức năng đó. 1 thu tuc nhap nha xuat ban
if exists(select * from sysobjects where name='p_nhapnxb')
drop proc p_nhapnxb
insert into Nhaxban values(@manxban,@ten_xb,@diachi_nxb)
print 'ma nha xuat ban:'+@manxban+'da duoc nhap thanh cong'
go
Thực thi thủ tục trên
Exec p_nhapnxb ‘nxb6’,’linh tinh’,’bat ki’
2 Nhap du lieu bang loai sach
if exists(select * from sysobjects where name='p_nhaploaisach')
drop proc p_nhaploaisach
go
create proc p_nhaploaisach
@masach char(4),@tensach nvarchar(30),@tentacgia nvarchar(30),@Namxb
datetime,@soluongco int,@Sotrang int,@manxban char(4)
end
3 Nhap du lieu bang docgiamuon
if exists(select * from sysobjects where name='p_nhapdocgiamuon')
drop proc p_nhapdocgiamuon
go
create proc p_nhapdocgiamuon
@madocgia char(4),@hoten nvarchar(30),@quequan nvarchar(30),@masach
char(4),@sluong int,@ngaymuon datetime,@ngayhen datetime
as
if exists(select masach from loaisach where masach=@masach)
begin
if (@ngaymuon<@ngayhen)
Trang 12begin
insert into docgiamuon
values(@madocgia,@hoten,@quequan,@masach,@sluong,@ngaymuon,@ngayhen) print 'nhap thanh cong'
Tao thu tuc nhap du lieu bang tra sach
if exists(select * from sysobjects where name='p_nhaptrasach')
drop proc p_nhaptrasach
go
create proc p_nhaptrasach
(@madocgia char(4),@masach char(4),@ngaytra datetime)
print 'Ma sach khong dung'
Câu 6: Đưa ra các yếu tố của RBTV, thiết lập các trigger thực hiện các ràng buộc toàn
vẹn đó
1 Thuc hien viec xoa nha xuat ban thi xoa cac thong tin lien quan
if exists(select * from sysobjects where name='tg_del_nxb')
drop trigger tg_del_nxb
Trang 13tạo thủ tục để kiểm tra trigger trên
create proc xoaxb(@manxban varchar(10))
as
alter table loaisach nocheck constraint all
delete from nhaxban where manxban=@manxban
alter table loaisach check constraint all
thực thi khi xóa sinh viên có masv 'sv21'
exec xoaxb 'xb2'
Trigger:Khi chen loai sach thi manxban phai ton tai trong bang nhaxban
if exists(select * from sysobjects where name='tg_i_loaisach')
drop trigger tg_i_loaisach
Trang 14if not exists(select t1.manxban from nhaxban as t1,inserted as t2 where t1.manxban=t2.manxban)
begin
print'ma nha xuat ban khong dung ban hay nhap lai'
rollback tran
end
Trigger:xoa loai sach thi phai xoa cac thong tin lien quan
if exists(select * from sysobjects where name='tg_del_loaisach')
drop trigger tg_del_loaisach
trigger:nhap ngay tra phai lon hon hoac bang ngay muon sach
if exists(select * from sysobjects where name='tg_iu_trasach')
drop trigger tg_iu_trasach
go
create trigger tg_iu_trasach
on docgiatra
Trang 15declare @ngaymuon datetime
declare @ngaytra datetime
select @ngaymuon=ngaymuon from docgiamuon
select @ngaytra=ngaytra from docgiatra where ngaytra in(select ngaytra from inserted)
from docgiatra as t1,inserted as t2,deleted as t3
where t1.madocgia=t3.madocgia and t1.masach=t3.masach
Trang 16print'Ma doc gia khong dung'
rollback tran
end
end
Tao trigger: khi xoa thong tin bang doc gia muon thi phai xoa cac thong tin lien quan
if exists(select * from sysobjects where name='tg_d_docgiamuon')
drop trigger tg_d_docgiamuon
Câu 7: Tạo ra các user (tối thiểu là 5 user), tạo ra các Role (tối thiểu là 3 role) Thực hiện
gán các user vào các role Sau đó , thực hiện phân quyền cho các user và các role (sử dụng tất cả các quyền)
/*Moi quan he user va role: User nam trong ROLE cho ne can phai xoa USER truoc khi xoa ROLE
nhung can kiem tra xem USER co duoc anh xa den DATABASE nao khac ngoai
DATABASE mac dinh ung
voi USER luc duoc tao hay khong, neu co thi ta cung can phai huy viec anh xa nay di sau
do neu can moi xoa
Trang 17duoc cac LOGIN*/
If exists(select name from sysobjects where name='Xemthanhviencuarole') drop proc Xemthanhviencuarole
from sysusers t1,sysusers t2,sysmembers t3
where t1.uid=t3.groupuid and t1.issqlrole=1 and t1.name=@role_name and t2.uid=t3.memberuid
order by 1
end
Goi thu tuc de xem co bao nhieu thanh vien trong ROLE
Exec Xemthanhviencuarole 'role1'
Xoa cac role cu (trong database hien hanh)
If exists(select name from sysobjects where name='Xoa_Role1')
drop proc Xoa_Role1
go
Thu tuc xoa role va cac user ben trong no
Cach 1: Dung bien dem va lay tung dong du lieu mot
create proc Xoa_Role1 @role_name sysname
Trang 18user con dang nam trong role
Declare @sothanhvien int
select @sothanhvien=COUNT(*) from sysusers t1, sysusers t2,sysmembers t3
where t1.uid=t3.groupuid and t1.issqlrole=1 and t1.name=@role_name and
Declare @value sysname
Set @value =(select top 1 t2.name
from sysusers t1,sysusers t2,sysmembers t3
where t1.uid=t3.groupuid and t1.issqlrole=1 and t1.name=@role_name and t2.uid=t3.memberuid)
Exec sp_dropprolemember @role_name,@value
Set @i=@i+1
end
end
print 'Toi se xoa'+@role_name
Sau khi Role da rong ta co the xoa role
Exec sp_dropprole @role_name
end
go
CACH 2: DUNG CURSER
Create proc Xoa_Role @role_name sysname
Trang 19where t1.uid=t3.groupuid and t1.issqlrole=1 and t1.name=@role_name and
from sysusers t1,sysusers t2,sysmembers t3
where t1.uid=t3.groupuid and t1.issqlrole=t3.memberuid
declare @value sysname
Deallocate x
end
print 'Toi se xoa' +@role_name
Sau khi role da rong ta co the xoa role
Exec sp_droprole @role_name
kiem tra xem trong role da co user nao voi bi danh tuong ung hay chua
if not exists(select name from sysusers where name=@bi_danh)