CÁC BÀI TẬP, TÀI LIỆU THAM KHẢO THI MÔN CƠ SỞ DỮ LIỆU: SỬ DUNG CƠ SỞ DỮ LIỆU THIẾT KẾ BẢNG TRONG CSDL VÀ RÀNG BUỘC TOÀN VẸN, TRUY VẤN NÂNG CAO, STORED PROCEDURE, TRIGGER, QUẢN LÍ USER VÀ SECURITY, .....
CHƯƠNG 1: THIẾT KẾ BẢNG TRONG CSDL VÀ RÀNG BUỘC TOÀN VẸN create database QLSV1 use QLSV1 create table tblKhoa ( MaKhoa nvarchar(10) not null, TenKhoa nvarchar(20), ) create table tblSinhVien ( MaSV nvarchar(10) not null, HoTen nvarchar(50), DiaChi nvarchar(100), NamSinh Datetime, MaKhoa nvarchar(10) ) create table tblMonHoc ( MaMon nvarchar(10) primary key, tenMon nvarchar(30) ) create table tblDiemThi ( MaMon nvarchar(10) not null, MaSV nvarchar(10) not null, DiemThi float ) 1.1 Tao ràng buộc khóa cột MaSV bảng tblSinhVien alter table tblSinhVien add constraint p_SV primary key(MaSV) 1.2 tạo ràng buộc khóa cột khoa bảng tblKhoa alter table tblKhoa add constraint p_Khoa primary key(MaKhoa) 1.3 Tạo ràng buộc khóa cột MaSV va MaMon bảng tblDiemThi alter table tblDiemThi add constraint p_DiemThi primary key(MaSV,MaMon) 1.4 Tạo mục cột HoTen bảng tblSinhVien(co p_SV nen k the tao duoc chi muc clustered) create nonclustered index SV_HoTen on tblSinhVien(HoTen) 1.5 Thêm cột KhoaHoc(khóa học ) bảng tblSinhVien alter table tblSinhVien add KhoaHoc nvarchar(10) 1.6 Tạo ràng buộc not null cột tên khoa alter table tblKhoa alter column TenKhoa varchar(20) not null 1.7 Tạo ràng buộc not null cột DiemThi alter table tblDiemThi alter column DiemThi float not null 1.8 Tạo ràng buộc để cột điểm thi nhận giá trị từ 0-10 alter table tblDiemThi add constraint c_DiemThi check(DiemThi>0 and DiemThi=50 and GioiTinh='False') 2.21 Thống kê sỹ số đơn vị tính đến thời điểm hiên select MaCB from QTCongTac where ToiNgayall( select count(MaChucVu) from QTCongTac group by MaCB)) 2.26 Liệt kê khoảng thời gian từ năm 2005 đến nay, phòng tạo có CB dược chuyển đến chuyển select count(MaCB) from QTCongTac where (year(TuNgay)>=2005 or year(ToiNgay)>=2005) and MaDonVi in( select MaDonVi from DMDonVi where TenDonVi='Phòng Đào Tạo' ) 2.27 Hiển thị thông tin đơn vị, CB tương ứng đơn vị thống kê số lượng NV thuộc đơn vị select * from HSCB,QTCongTac where HSCB.MaCB=QTCongTac.MaCB compute count(QTCongTac.MaDonVi) 2.28 Xếp hạng CB theo độ tuổi select * from HSCB order by year(NgaySinh )-year(getdate()) CHƯƠNG VIEW 3.0 Ứng với đề tài tạo view cho biết: tên đề tài, tên sinh ven tham gia, tên giao viên hướng dẫn create view DeTai as select TenDT, SinhVien.HoTen, GiaoVien.HoTen from SinhVien, GiaoVien,DeTai where 3.1 Ứng với mỗi giáo viên cho biết tên đề tài hướng dẫn create view view1 as select HoTen, TenDT from GiaoVien,DeTai, GiaoVien_DeTai where GiaoVien.MaGV=GiaoVien_DeTai.MaGV and DeTai.MaDT=GiaoVien_DeTai.MaDT 3.2 Cho biết sinh vên có kết bảo vệ đề tài loại create view view2 as select * from SinhVien where MaSV in(select MaSV from KetQua where Diem>=7) 3.3 Cho biết tên GV hướng dẫn đề tài có kết bảo vệ loại create view view3 as select *from GiaoVien where MaGV in( select MaGV from GiaoVien_DeTai where MaDT in( select MaDT from KetQua where Diem>=7 )) 3.4 Ứng với GV cho biết số lượng đề tài hướng dẫn create view view4 as select HoTen, count(MaDT) as SoLuongDT from GiaoVien, GiaoVien_DeTai where GiaoVien.MaGV=GiaoVien_DeTai.MaGV group by GiaoVien.MaGV, HoTen 3.5 Ứng với SV cho biết số lượng đề tài ma SV tham gia create view view5 as select HoTen, count(maDT) as SoLuongDT from SinhVien, SinhVien_DeTai where SinhVien.MaSV =SinhVien_DeTai.MaSV group by HoTen 3.6 Ứng với SV cho biết tên đề tài mà SV tham gia create view view6 as select HoTen,TenDT from SinhVien,DeTai, SinhVien_DeTai where SinhVien.MaSV =SinhVien_DeTai.MaSV and DeTai.maDT=SinhVien_DeTai.MaDT 3.7 Cho biết tên GV không tham gia hướng dẫn đề tài create view view7 as select MaGV,HoTen from GiaoVien where MaGV not in (select MaGV from GiaoVien_DeTai) 3.8 cho biết tên đề tài khơng có SV tham gia create view view8 as select * from DeTai where MaDT in(select MaDT from SinhVien_DeTai) 3.9 cho biết danh sách đề tài có số lượng SV tham gia create view view9 as select *from DeTai where MaDT in(select MaDT from SinhVien_DeTai group by MaDT having count(MaSV )> all (select count(MaSV ) from SinhVien_DeTai)) 3.10 cho biết ds giáo viên số lượng SV mà GV hướng dẫn create view view10 as select GiaoVien.HoTen, count(MaSV ) as SoLuong from GiaoVien,GiaoVien_DeTai, KetQua where GiaoVien.MaGV=GiaoVien_DeTai.MaGV and GiaoVien_DeTai.MaDT=KetQua.MaDT group by GiaoVien.HoTen CHƯƠNG 4: CHỈ MỤC I Cho bảng tblSinhVien(MaSV,HoTen,Que,NgaySinh,SoCMT) 4.1 Tạo khóa cột maSV alter table tblSinhVien_ChiMuc add constraint p_SV_CM primary key(MaSV ) 4.2 Tạo mục nonclustered cột HoTen create nonclustered index i_HoTen on tblSinhVien_ChiMuc( HoTen) 4.3 tạo mục nonclustered tren cột Que create nonclustered index i_Que on tblSinhVien_ChiMuc(Que) 4.4 Tạo mục nonclustered phức hợp cột HoTen Quê create nonclustered index i_HoTen_Que on tblSinhVien_ChiMuc(HoTen,Que) 4.5 tạo mục (unique) cột SoCMT create unique index i_SoCMT on tblSinhVien_ChiMuc(SoCMT) 4.6.xem lại tất mục bang tblSinhVien_ChiMuc exec sp_helpindex tblSinhVien_ChiMuc 4.7 Tìm tất SV có tên 'Nguyễn Văn A' cách sử dụng mục dược tạo tring câu select * from tblSinhVien_ChiMuc with (index=i_HoTen) where HoTen='Nguyễn Văn A' 4.8 Tìm tất SV có que Hưng n cách sử dụng mục tạo câu select *from tblSinhVien_ChiMuc with (index=i_Que) where Que='Hưng Yên' 4.9 tìm tất SV có tên bắt đàu 'Nguyễn Văn' có quê 'Hưng Yên' select * from tblSinhVien_ChiMuc with (index=i_HoTen_Que) where HoTen like 'Nguyễn Văn%' and Que='Hưng Yên' 4.10 xóa mục dược tạo câu 2-4 drop index i_HoTen on tblSinhVien_ChiMuc drop index i_Que on tblSinhVien_ChiMuc drop index i_HoTen_Que on tblSinhVien_ChiMuc 4.11 Xóa ràng buộc khóa bảng tblSinhVien_ChiMuc alter table tblSinhVien_ChiMuc drop constraint p_SV_CM 4.12 Tạo lại khóa bảng tblSinhVien_ChiMuc, q trình tạo khóa sử dụng tùy chọn NunClustered để SQL server, không tạo mục clustered mục khóa (vì mặc định tạo khóa SQL tự đọng tạo mục Clustered cột khóa )////////////////////// create clustered index id_SV_CM on tblSinhVien_ChiMuc with drop_existing 4.13 tạo mục clustered unique cột SoCMT với hệ số điền đầy 60 create unique clustered index id_SoCMT on tblSinhVien_ChiMuc(SoCMT) with FillFactor=60 4.14 Tạo mục fulltext cột Que ứng dụng tìm kiếm fulltext cột (sử dụng từ khóa contains freetext)??????? exec sp_help tblSinhVien exec sp_fulltext_database 'enable' create fulltext catalog catalog_Que create fulltext index on tblSinhVien(Que) key index MaSV on catalog_Que seletc * from tblSinhVien where contains (Que,'Hưng','Hải') II Cho CSDL sau: create table tblTacGia ( MaTG varchar(10) constraint p_TG primary key(MaTG), TenTG nvarchar(50), DiaChi nvarchar(100) ) create table tblSach ( MaSach varchar(10) constraint p_Sach primary key(MaSach), TuaSach nvarchar(50), SoTrang smallint, MaTG varchar(10) constraint f_MaTG foreign key(MaTG) references tblTacGia(MaTG), NamXB int, TuKhoa nvarchar(20), NXB nvarchar(40) ) create table ChiTietSach ( MaSach varchar(10) MaCaBiet nvarchar(50) constraint p_CTS primary key, TinhTrangSach tinyint, TinhTrangPhucVu tinyint, ) create table tblSachTG ( MaSach varchar(10), MaTG varchar(10) constraint p_Sach_TG primary key(MaSach,MaTG), ) create table tblDocGia ( SoThe varchar(10) constraint p_DG primary key(SoThe), HoTen nvarchar(50), DVCT nvarchar(100) ) create table tblSachMuon ( SoThe varchar(10), MaCaBiet nvarchar(50) constraint p_SachMuon primary key(SoThe,MaCaBiet ), constraint f_MaCaBiet foreign key (MaCaBiet ) references ChiTietSach(MaCaBiet ), NgayMuon datetime , NgayPhaiTra datetime, NgayTra datetime ) 4.15 tạo mục cho bảng cho thao tác tìm kiếm, cập nhật tối ưu, biết rằng: Ta thường xuyên tìm kiếm theo tựa đè sách, tên TG, từ khóa, NXB kết hợp tiêu chí Ta thường xun tìm kiếm độc giả theo: số thẻ, họ tên create nonclustered index id_TacGia on tblTacGia (TenTG) create nonclustered index id_Sach on tblSach(TuaSach ,TuKhoa, NXB) create nonclustered index id_DocGia on tblDocGia(SoThe, HoTen) 4.16 Tạo ràng buộc khóa ngoại bảng sau: alter table tblSachTG add constraint f_Sach_TG1 foreign key(maTG) references tblTacGia(MaTG) alter table tblSachTG add constraint f_SachTG_Sach foreign key(MaSach ) references tblSach(MaSach ) alter table ChiTietSach add constraint f_CTS_Sach foreign key(MaSach) references tblSach(MaSach ) alter table tblSachMuon add constraint f_SachMuon_DG foreign key (SoThe) references tblDocGia(SoThe) 4.17 tạo ràng buộc sau bảng tblSach trường SoTrang>0 alter table tblSach add constraint check_SoTrang check(SoTrang>0) - bảng tblSach trường NamXB phải nhỏ năm alter table tblSach add constraint check_NamXB check(NamXB =NgayMuon alter table tblSachMuon add constraint check_Ngay check(NgayPhaiTra>=NgayMuon) - bảng tblSachMuon trường NgayTra>=NgayMuon alter table tblSachMuon add constraint check_Muon_Tra check(NgayTra>=NgayMuon) CHƯƠNG 5: STORED PROCEDURE I Thủ tục lưu trữ với tham số đầu vào 5.1 Viết thủ tục lưu trữ có tham số đầu vào xâu kí tự, thủ tục trả đề tài có mã tương ứng, tham số thủ tục là: Tên đề tài, tên sinh viên tham gia, tên giáo viên hướng dẫn Tạo hàm: create proc Pro_5_1 @TenDeTai nvarchar(100) output, @TenSinhVien nvarchar(50)output, @TenGiaoVien nvarchar(50)output, @MaDeTai nvarchar(10) as begin if exists (select MaDT from DeTai where MaDT=@MaDeTai) begin select GiaoVien_DeTai.MaGV,SinhVien_DeTai.MaSV ,TenDT,SinhVien.HoTen,GiaoVien.HoTen from GiaoVien_DeTai,DeTai,SinhVien_DeTai,SinhVien,GiaoVien where SinhVien_DeTai.MaDT=GiaoVien_DeTai.MaDT and GiaoVien_DeTai.MaDT=DeTai.MaDT and SinhVien.MaSV=SinhVien_DeTai.MaSV and GiaoVien.MaGV=GiaoVien_DeTai.MaGV end else print 'Không tồn tại' end Thực thi: declare @TenDeTai nvarchar(100) declare @TenSinhVien nvarchar(50) declare @TenGiaoVien nvarchar(50) declare @MaDeTai nvarchar(10) exec Pro_5_1 'DT01',@TenDeTai output,@TenGiaoVien output, @TenSinhVien output if @TenDeTai='' print @TenDeTai +'do'+ @TenGiaoVien +'hướng dẫn gồm SV'+ @TenSinhVien else print 'Không tồn tai' 5.2 Viết thủ tục lưu trữ với tham số đầu vào số nguyên, thủ tuc trả SV có KQ bảo vệ đề tài nhỏ giá trị tham số thủ tục create proc Pro_5_2 @Diem float , @MaSV nvarchar(10) output, @HoTen nvarchar(50) output, @DiaChi nvarchar(100) output, @Lop nvarchar(20) output as begin if exists (select MaSV from KetQua where Diem=@Diem) begin select @MaSV =MaSV ,@HoTen=HoTen ,@DiaChi=DiaChi,@Lop=Lop from SinhVien end else print 'khơng có' end 5.3 Viết thủ tuc lưu trữ có tham số la xâu kí tự, thủ tuc trả số lượng đề tài hướng dẫn GV có mã tham số thủ tục create proc Pro_5_3 @MaGV varchar(10), @SoLuongDT int output as begin if exists (select MaGV from GiaoVien_DeTai where MaGV=@MaGV) begin select @SoLuongDT=count(MaDT) from GiaoVien_DeTai group by MaGV end else print 'Khơng có' end 5.4 Viết thủ tuc lưu trữ có tham số la xâu kí tự, thủ tuc trả số lượng SV tham gia DT có mã tham số thủ tục create proc Pro_5_4 @MaDT nvarchar(10), @SoLuongSV int output as begin if exists (select MaDT from SinhVien_DeTai where MaDT=@MaDT) begin select @SoLuongSV=count(MaSV ) from SinhVien_DeTai group by MaDT end else print ' Khơng có' end 5.5 Hãy thêm cột XepLoai vào bảng KetQua viết thủ tục lưu trữ cập nhật xếp loại cho cột xếp loại theo công thức Điểm=5 Điểm=7 va Điểm=8: Giỏi - Chèn thêm cột XepLoai vào bảng KetQua: alter table KetQua add XepLoai nvarchar(10) - Viết thủ tục: create proc Pro_5_5 as begin declare cur_XepLoai cursor scroll for select Diem, case when Diem < then 'Yếu' when Diem >= and Diem = 7and Diem = then 'Giỏi' end as XepLoai from KetQua open cur_XepLoai declare @XL nvarchar(15) declare @Diem float fetch first from cur_XepLoai into @Diem,@XL begin update KetQua set XepLoai=@XL where Diem=@Diem fetch next from cur_XepLoai into @XL end close cur_XepLoai deallocate cur_XepLoai end 5.6 bổ sung cột SoLuong vào bảng DeTai viết thủ tục lưu trữ để cập nhật cột SoLuong bảng DeTai số SV tham gia đề tài - Bổ sung cột SoLuong vào bảng DeTai: alter table DeTai add SoLuong int - Viết thủ tục create proc Pro_56 as begin declare cur_SLSV cursor scroll for select DeTai.MaDT, SoLuong=count(SinhVien_DeTai.MaSV ) from DeTai left join SinhVien_DeTai on DeTai.MaDT=SinhVien_DeTai.MaDT group by DeTai.MaDT open cur_SLSV declare @MaDT nvarchar(20) declare @SoLuong int fetch first from cur_SLSV into @MaDT, @SoLuong update DeTai set SoLuong=0 begin update DeTai set SoLuong=@SoLuong where MaDT=@MaDT fetch next from cur_SLSV into @SoLuong end close cur_SLSV deallocate cur_SLSV end II Thủ tục lưu trữ với tham số đầu 5.7 Đưa vào tên giáo viên, trả số lượng GV có tên k có GV tên trả create proc Pro_5_7 @TenGiaoVien nvarchar(50), @SoLuongGV int output as begin if exists (select HoTen from GiaoVien where HoTen=@TenGiaoVien) begin select count(MaGV) from GiaoVien where HoTen=@TenGiaoVien end else return end 5.8 Đưa vào MaDT cho biết điểm đề tài đó, k tìm thấy đề tài tương ứng trả -1 create proc Pro_5_8 @MaDT nvarchar(10), @Diem float output as begin if exists (select MaDT from KetQua where MaDT=@MaDT) begin select Diem from KetQua where MaDT=@MaDT end else return -1 end CHƯƠNG 6: TRIGGER I: Cho CSDL sau: SinhVien(MaSV,HoTen,DiaChi, Lop) HocVi(MaHV,TenHV) DeTai(MaDT,TenDT) SinhVien_DeTai(maSV,MaDT) GiaoVien_DeTai(maGV,MaDT) GiaoVien(MaGV,HoTen,DiaChi,MaHV) KetQua(MaSV ,MaDT,Diem) 6.1 Viết trigger để không cho phép xóa học vị có GV có học vị create trigger DeLeTeHocVi on HocVi for Delete as if exists (select Deleted.MaHV from Deleted where MaHV in(select MaHV from GiaoVien)) begin print 'khơng thể xóa học vị tham chiếu bảng GaaoVien' Rollback Transaction end 6.2 viết trigger để xóa SV xóa tất đè tài ma SV nghiên cứu create trigger DeleteSV on SinhVien_DeTai for Delete as if exists (select Deleted.MaSV from Deleted where MaSV in(select MaSV from SinhVien_DeTai) ) begin Delete from SinhVien_DeTai where MaSV in(select Deleted.MaSV from Deleted) print 'xóa thành cơng' end 6.3 Viết trigger thiết lập ràng buộc sau Gv có học vị tiến sĩ hướng dẫn tối đa đề tài Gv có học vị thạc sĩ hướng dẫn tối đa đề tài giáo viên có học vị kĩ sư hướng dẫn tối đa đề tài Gv có học vị khác học vị khơng hướng dẫn đề tài create trigger Insert_1 on GiaoVien_DeTai for insert as declare @MaGV varchar(10) declare @TenHV varchar(10) declare @SoLuong int set @MaGV=(select MaGV from Inserted) set @TenHV=(select TenHV from HocVi where MaHV in(select MaHV from GiaoVien where MaGV=@MaGV)) set @SoLuong =(select count(MaDT) from GiaoVien_DeTai where MaGV =@MaGV) if(@SoLuong>4 and @TenHV='Tiến Sĩ') begin print 'khơng thực Tiến sĩ hướng dẫn tối đa đề tài' rollback transaction end if(@SoLuong >3 and @TenHV='Thạc Sĩ') begin print 'Thạc sĩ hướng dẫn tối đa đề tài' rollback transaction end if(@SoLuong >2 and @TenHV='Kĩ Sư') begin print 'kĩ sư hướng dẫn tối đa đề tài' rollback transaction end if(@TenHV !='Tiến Sĩ' or @TenHV!='Thạc Sĩ'or @TenHV!='Kĩ Sư') begin print 'không thể hướng dẫn đề tài' rollback transaction end 6.4 viết trigger để thay đổi mã GV thay đổi thơng tin mã Gv bảng liên quan create trigger Trigger_6_4 on GiaoVien for update as begin update GiaoVien set MaGV=(select MaGV from inserted ) where MaGV =(select MaGV from Deleted ) print 'update thành công' end 6.5 Viết trigger để đề tài khơng có q SV tham gia nghiên cứu create trigger trigger_5 on SinhVien_DeTai for Insert as declare @MaSV nvarchar(10) declare @SoLuong int set @MaSV =(select MaSV from Inserted ) set @SoLuong =(select count (MaSV ) from SinhVien_DeTai where MaSV =@MaSV ) if(@SoLuong>3) begin print '1 DT có SV tham gia ' rollback transaction end 6.6 Viết trigger để xóa SV xóa kết bảo vệ SV create trigger Delete_KQ on KetQua for Delete as if exists (select Deleted.MaSV from Deleted where MaSV in(select MaSV from SinhVien)) begin Delete from KetQua where MaSV in(select Deleted.MaSV from Deleted) print 'xóa thành công' end II: Cho CSDL sau: KhoSach(MaKho,TenKho) Sach(MaSach ,TenSach,NhaXB,SoTrang, NamXB ) Sach_CaBiet(MaSach ,MaCB,MaKho) 6.6 Viết trigger để không cho phép xóa kho sách kho create trigger trigger_6 on KhoSach for Delete as declare @SoLuong int declare @MaKho nvarchar(50) set @MaKho=(select MaKho from Deleted) set @SoLuong=(select count(MaSach) from Sach_CaBiet where MaKho=@MaKho) if(@SoLuong>0) begin print 'không thể xóa kho kho sách' rollback transaction end 6.7 Không cho phép thêm sách hay sửa chữa sách mà namXB nhỏ năm create trigger trigger_6_7 on Sach for insert as if exists (select Inserted.NamXB from inserted where Inserted.NamXB