1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo bài tập lớn hệ quản trị cơ sở dữ liệu đề tài quản lý thư viện

63 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 63
Dung lượng 1,45 MB

Cấu trúc

  • PHẦN 1: THIẾT KẾ CƠ SỞ DỮ LIỆU (7)
    • 1.1 Cơ sở dữ liệu (7)
      • 1.1.1. Giới thiệu chung (7)
      • 1.1.2. Yêu cầu chung (7)
      • 1.1.3. Phương pháp giải quyết bài toán (7)
    • 1.2. Mô hình quan hệ (Diagram) (8)
      • 1.2.1. Xác định các thực thể (8)
      • 1.2.2. Mô hình E-R (8)
      • 1.2.3. Mô hình quan hệ (9)
  • PHẦN 2. THỰC NGHIỆM (9)
    • 2.1. Con trỏ (Cursor) (9)
      • 2.1.1. Con trỏ in ra thông tin của sách theo tên sách tác giả thể loại (5)
      • 2.1.2. Con trỏ xem chi tiết độc giả và tên sách đã mượn (10)
      • 2.1.3. Con trỏ hiển thị tên độc giả, số điện thoai và số lần mượn sách (5)
      • 2.1.4. Con trỏ hiển thị tên độc giả, số điện thoai và tổng số tiền cọc (5)
      • 2.1.5. Con trỏ hiển thị tên thủ thư, số điện thoại thủ thư và số lần cho mượn sách (14)
      • 2.1.6. Con trỏ hiển thị tên thủ thư, tuổi, địa chỉ và số điện thoại của thủ thư (5)
      • 2.1.7. Con trỏ lấy tên đầu tiên của tác giả (17)
      • 2.1.8. Con trỏ lấy tên sách và tên tác giả của các sách trong thể loại 'cong nghe-kinh te'. .18 2.2. Thủ tục (Proc) (6)
      • 2.2.1. Thủ tục thêm phiếu mượn sách mới (5)
      • 2.2.2. Thủ tục xóa phiếu mượn sách và chi tiết phiếu mượn (5)
      • 2.2.3. Thủ tục tính tuổi hiện tại của một độc giả bất kỳ với tên độc giả được nhập từ bàn phím (5)
      • 2.2.4. Thủ tục hiển thị tổng số lượng sách đã mượn với tên sách được nhập từ bàn phím (24)
      • 2.2.5. Thủ tục lấy danh sách các sách đã được mượn bởi 1 độc giả với mã độc giả được nhập từ bàn phím (5)
      • 2.2.6. Thủ tục tính tổng tiền sách 1 độc giả đã mượn với mã độc giả nhập từ bàn phím (5)
      • 2.2.7. Thủ tục lấy danh sách các độc giả có số điện thoại kết thúc bằng '1234' (6)
      • 2.2.8. Thủ tục lấy tổng số lượng sách trong bảng SACH (6)
    • 2.3. Hàm (Function) (28)
      • 2.3.1. Hàm xem tổng số lượng sách theo từng thể loại (5)
      • 2.3.2. Hàm in ra danh sách sách đã mượn của độc giả (5)
      • 2.3.3. Hàm xem tổng số lượng sách theo mã nhà xuất bản (30)
      • 2.3.4. Hàm xem chi tiết các sách theo mã nhà xuất bản (30)
      • 2.3.5. Hàm trả về thông tin cuốn sách được mượn nhiều nhất (5)
      • 2.3.6. Hàm trả về thông tin độc giả bao gồm mã độc giả, tên, ngày sinh, địa chỉ, số điện thoại đã thực hiện trả sách trong tháng 2 năm 2024 (5)
      • 2.3.7. Hàm tính số lượng sách theo thể loại (6)
      • 2.3.8. Hàm tính tổng tiền cọc của độc giả (6)
    • 2.4. Khung nhìn (View) (34)
      • 2.4.1. View xem số lượng sách còn lại (5)
      • 2.4.2. View xem chi tiết thông tin phiếu mượn (5)
      • 2.4.3. View xem các sách ở tủ sách A (37)
      • 2.4.4. View với mã tác giả, tên tác giả, tên tác phẩm, thể loại mà tác giả có quê quán ở Hải Phòng (5)
      • 2.4.5. View hiển thị thông tin những độc giả dưới 25 tuổi (6)
      • 2.4.6. View hiển thị độc giả và thể loại sách đã mượn (6)
      • 2.4.7. View hiển thị sách của mỗi tác giả (6)
      • 2.4.8. View hiển thị độc giả và số cuốn sách đã mượn (6)
    • 2.5. Trigger (41)
      • 2.5.1. Trigger tự động cập nhật sách khi thêm phiếu mượn (5)
      • 2.5.2. Trigger tự động cập nhật sách khi xóa phiếu mượn (5)
      • 2.5.3. Trigger khi thêm một sách thì thông báo thêm thành công (46)
      • 2.5.4. Trigger khi sửa một độc giả thì thông báo sửa thành công (5)
      • 2.5.5. Trigger tự động xóa tác giả khi xóa mã tác giả từ bàn phím (6)
      • 2.5.6. Trigger kiểm tra thủ thư đã tồn tại chưa (6)
      • 2.5.7. Trigger cập nhật số điện thoại của tác giả (6)
      • 2.5.8. Trigger xóa tác giả (6)
    • 2.6. Phân quyền cho user (52)
      • 2.6.1. Cấp quyền cho một user (TungAnh176) (5)
      • 2.6.2. Cấp quyền cho một user (CHINH0705) (5)
      • 2.6.3. Cấp quyền cho một user (QUY0211) (6)
      • 2.6.4. Cấp quyền cho một user (MANH69) (6)
    • 2.7. Isolation level cho transanction (57)
      • 2.7.1. Read Uncommitted (Chưa cô lập đọc) (5)
      • 2.7.2. Read Committed (Đã cô lập đọc) (5)
      • 2.7.3. Repeatable Read (Lặp lại đọc) (6)
      • 2.7.4. Serializable (Khóa toàn bộ) (6)
  • PHẦN 3: KẾT LUẬN (63)

Nội dung

Con trỏ lấy tên sách và tên tác giả của các sách trong thể loại ''''cong nghe-kinh te''''.. Thủ tục lấy danh sách các sách đã được mượn bởi 1 độc giả với mã độc giả được nhập từ bàn phím2.2.6.

THIẾT KẾ CƠ SỞ DỮ LIỆU

Cơ sở dữ liệu

Thư viện cần xây dựng một cơ sở dữ liệu để quản lý việc mượn và quản lý sách trong thư viện Hệ thống cần ghi nhận các hoạt động mượn/trả sách và quản lý việc thanh toán với độc giả Ngoài ra, cơ sở dữ liệu cũng có người thủ thư nắm bắt được tình hình mượn và quản lý sách Đồng thời, hệ thống cũng giúp thủ thư nắm bắt được sách trong thư viện, kiểm kê sách trong thư viện cũng như việc thanh toán, lập phiếu mượn cho độc giả.

Yêu cầu của cơ sở dữ liệu quản lý thư viện:

Hệ thống quản lý thư viện rất quan trọng trong việc lưu trữ dữ liệu thông tin độc giả mượn sách Dữ liệu độc giả thuê và mượn sách không thể bị nhầm lẫn không sẽ dẫn đến hậu quả nghiêm trọng như phải đền tiền sách Chính vì vậy, hệ thống sẽ có phân quyền riêng cho từng đối tượng sử dụng đối với một số chức năng nào đó trong hệ thống Xây dựng và Quản lý Phần mềm Thư Viện Quản lý sẽ có các đối tượng sử dụng sau: Ban quản lý được toàn quyền sử dụng các chức năng của hệ thống; thủ thư sẽ quản lý thông tin sách (trả sách, mượn sách, thuê sách)

- Yêu cầu về chương trình:

+ Đảm bảo tính bảo mật của dữ liệu

+ Hỗ trợ người cập nhật sửa đổi, tìm kiếm thông tin… thông qua các form và tính toán các thông số

+ Quản lý các phiếu mượn.

1.1.3 Phương pháp giải quyết bài toán Đọc, tìm tài liệu trên word, internet

Trao đổi với giáo viên hướng dẫn

Sử dụng các công cụ: SQL Server, Chat GPT

Mô hình quan hệ (Diagram)

1.2.1 Xác định các thực thể

THỰC THỂ "DOCGIA" (Độc giả):MADG (Mã độc giả), TENDG (Tên độc giả),

NGAYSINH (Ngày sinh), DIACHI (Địa chỉ), SODT (Số điện thoại)

THỰC THỂ "THUTHU" (Thủ thư):MATT (Mã thủ thư), TENTT (Tên thủ thư),

NGAYSINH (Ngày sinh), DIACHI (Địa chỉ), SODT (Số điện thoại)

THỰC THỂ "THELOAI" (Thể loại sách):MATL (Mã thể loại), TENTL (Tên thể loại)

THỰC THỂ "NHAXUATBAN" (Nhà xuất bản):MANXB (Mã nhà xuất bản), TENNXB (Tên nhà xuất bản), DIACHI (Địa chỉ), SODT (Số điện thoại), EMAIL (Địa chỉ email)

THỰC THỂ "TACGIA" (Tác giả):MATG (Mã tác giả), TENTG (Tên tác giả), QUEQUAN (Quê quán)

THỰC THỂ "SACH" (Sách):MASACH (Mã sách), TENSACH (Tên sách), MATL (Mã thể loại) - Khóa ngoại, MANXB (Mã nhà xuất bản) - Khóa ngoại, MATG (Mã tác giả) - Khóa ngoại, TUSACH (Tủ sách), NGANSACH (Ngăn sách), SOLUONG (Số lượng), GIATHUE (Giá thuê),

THỰC THỂ "PHIEUMUONSACH" (Phiếu mượn sách):MAPM (Mã phiếu mượn sách), MADG (Mã độc giả) - Khóa ngoại, MATT (Mã thủ thư) - Khóa ngoại, NGAYMUON (Ngày mượn), NGAYTRA (Ngày trả), TIENCOC (Tiền cọc)

THỰC THỂ "CHITIETPM" (Chi tiết phiếu mượn):MAPM (Mã phiếu mượn sách) - Khóa ngoại, MASACH (Mã sách) - Khóa ngoại, SOLUONG (Số lượng)

THỰC NGHIỆM

Con trỏ (Cursor)

2.1.1 Con trỏ in ra thông tin của sách theo tên sách tác giả thể loại a Câu lệnh

DECLARE @ten_tac_gia NVARCHAR(100);

DECLARE @ten_the_loai NVARCHAR(100);

DECLARE book_info_cursor CURSOR FOR

SELECT SACH.TENSACH, TACGIA.TENTG, THELOAI.TENTL FROM SACH

INNER JOIN TACGIA ON SACH MATG TACGIA = MATG

INNER JOIN THELOAI ON SACH MATL THELOAI = MATL;

FETCH NEXT FROM book_info_cursor INTO @ten_sach, @ten_tac_gia ,

PRINTN'Tên Sách: ' @ten_sach + +N', Tác Giả: ' @ten_tac_gia + +N', Thể Loại: ' @ten_the_loai+ ;

FETCH NEXT FROM book_info_cursor INTO @ten_sach @ten_tac_gia , ,

DEALLOCATE book_info_cursor; b.Kết quả

2.1.2 Con trỏ xem chi tiết độc giả và tên sách đã mượn a Câu lệnh

DECLARE @ten_doc_gia NVARCHAR(100);

DECLARE @ten_sach_muon NVARCHAR(100);

DECLARE doc_gia_sach_muon_cursor CURSOR FOR

SELECT DOCGIA.TENDG, SACH.TENSACH

INNER JOIN PHIEUMUONSACH ON DOCGIA MADG PHIEUMUONSACH MADG.

INNER JOIN CHITIETPM ON PHIEUMUONSACH MAPM CHITIETPM MAPM.

INNER JOIN SACH ON CHITIETPM MASACH SACH = MASACH; OPEN doc_gia_sach_muon_cursor;

FETCH NEXT FROM doc_gia_sach_muon_cursor INTO @ten_doc_gia,

PRINTN'Tên Độc Giả: ' @ten_doc_gia + +N', Sách Đã Mượn: ' +

FETCH NEXT FROM doc_gia_sach_muon_cursor INTO

@ten_doc_gia, @ten_sach_muon;

CLOSE doc_gia_sach_muon_cursor;

DEALLOCATE doc_gia_sach_muon_cursor; b Kết quả

2.1.3 Con trỏ hiển thị tên độc giả, số điện thoai và số lần mượn sách a Câu lênh

DECLARE DOCGIA_SOLANMUON CURSOR FOR

SELECT DOCGIA.TENDG, DOCGIA.SODT,

COUNT(PHIEUMUONSACH.MAPM) AS SOLANMUON

LEFT JOIN PHIEUMUONSACH ON DOCGIA MADG PHIEUMUONSACH MADG.

GROUP BY DOCGIA.TENDG, DOCGIA.SODT;

Khai báo biến để lưu trữ dữ liệu từ con trỏ

DECLARE @TENDG NVARCHAR(100 @SODT ), NVARCHAR(100 ),

Lấy dữ liệu từ con trỏ và hiển thị

FETCH NEXT FROM DOCGIA_SOLANMUON INTO @TENDG, @SODT,

PRINT N'Tên độc giả: ' @TENDG + +N', Số điện thoại: ' @SODT + +N', Số lần mượn sách: ' +CAST(@SOLANMUON AS NVARCHAR(10));

FETCH NEXT FROM DOCGIA_SOLANMUON INTO @TENDG @SODT , ,

DEALLOCATE DOCGIA_SOLANMUON; b Kết quả

2.1.4 Con trỏ hiển thị tên độc giả, số điện thoai và tổng số tiền cọc a Câu lênh

DECLARE DOCGIA_TONGTIENCOC CURSOR FOR

SELECT DOCGIA.TENDG, DOCGIA.SODT,SUM(CHITIETPM.SOLUONG * SACH GIATHUE ) AS TONGTIENCOC

JOIN PHIEUMUONSACH ON DOCGIA MADG PHIEUMUONSACH = MADG JOIN CHITIETPM ON PHIEUMUONSACH MAPM CHITIETPM = MAPM JOIN SACH ON CHITIETPM MASACH SACH = MASACH

GROUP BY DOCGIA.TENDG, DOCGIA.SODT;

Khai báo biến để lưu trữ dữ liệu từ con trỏ

DECLARE @TENDG NVARCHAR(100 @SODT ), NVARCHAR(100 ),

Lấy dữ liệu từ con trỏ và hiển thị

FETCH NEXT FROM DOCGIA_TONGTIENCOC INTO @TENDG, @SODT,

PRINT N'Tên độc giả: ' @TENDG + +N', Số điện thoại: ' @SODT + +N', Tổng tiền cọc: ' + CAST(@TONGTIENCOC AS NVARCHAR( ));20

FETCH NEXT FROM DOCGIA_TONGTIENCOC INTO @TENDG @SODT , ,

DEALLOCATE DOCGIA_TONGTIENCOC; b Kết quả

2.1.5 Con trỏ hiển thị tên thủ thư, số điện thoại thủ thư và số lần cho mượn sách a Câu lênh

DECLARE thuthu_cursor CURSOR FOR

Lặp qua từng dòng dữ liệu của con trỏ

FETCH NEXT FROM thuthu_cursor INTO @TenThuThu @SoDienThoai, ;

Tính số lần cho mượn sách

ON THUTHU.MATT = PHIEUMUONSACH.MATT

PRINT N'Tên Thủ Thư: ' @TenThuThu+ ;

PRINT N'Số Điện Thoại: ' + @SoDienThoai;

PRINT N'Số Lần Cho Mượn Sách: ' +CAST(@SoLanMuon AS NVARCHAR( ));10 PRINT ' -';

Lấy dòng tiếp theo của con trỏ

FETCH NEXT FROM thuthu_cursor INTO @TenThuThu @SoDienThoai, ; END

DEALLOCATE thuthu_cursor; b Kết quả

2.1.6 Con trỏ hiển thị tên thủ thư, tuổi, địa chỉ và số điện thoại của thủ thư a Câu lênh

DECLARE thongtin_thuthu_cursor CURSOR FOR

SELECT TENTT, DATEDIFF(YEAR, NGAYSINH GETDATE, ())AS Tuoi DIACHI , , SODT

Lặp qua từng dòng dữ liệu của con trỏ

FETCH NEXT FROM thongtin_thuthu_cursor INTO @TenThuThu @Tuoi, , @DiaChi,

PRINT N'Tên Thủ Thư: ' @TenThuThu+ ;

PRINT N'Tuổi: ' +CAST(@Tuoi AS NVARCHAR(10));

PRINT N'Số Điện Thoại: ' + @SoDienThoai;

Lấy dòng tiếp theo của con trỏ

FETCH NEXT FROM thongtin_thuthu_cursor INTO @TenThuThu @Tuoi , ,

DEALLOCATE thongtin_thuthu_cursor; b Kết quả

2.1.7 Con trỏ lấy tên đầu tiên của tác giả a Câu lênh

FETCH NEXT FROM authorCursor INTO @TENTG;

PRINT 'Tên tác giả: ' + @TENTG;

FETCH NEXT FROM authorCursor INTO @TENTG;

2.1.8 Con trỏ lấy tên sách và tên tác giả của các sách trong thể loại 'cong nghe-kinh te' a Câu lênh

DECLARE @tensach NVARCHAR(100), @tentacgia NVARCHAR(100); DECLARE contro2 CURSOR FOR

JOIN TACGIA TG ON S.MATG = TG.MATG

JOIN THELOAI TL ON S.MATL = TL.MATL

WHERE TL.TENTL = N'Sách Khoa học công nghệ – Kinh tế';

FETCH NEXT FROM contro2 INTO @tensach, @tentacgia;

PRINT 'Tên sách: ' + @tensach + ', Tác giả: ' + @tentacgia;

FETCH NEXT FROM contro2 INTO @tensach, @tentacgia;

2.2.1 Thủ tục thêm phiếu mượn sách mới a Câu lệnh

IF NOT EXISTS (SELECT 1 FROM PHIEUMUONSACH WHERE MAPM @MAPM)

INSERT INTO PHIEUMUONSACH (MAPM, MADG, MATT, NGAYMUON, NGAYTRA, TIENCOC)

VALUES (@MAPM, @MADG, @MATT, @NGAYMUON, @NGAYTRA,

INSERT INTO CHITIETPM (MAPM, MASACH, SOLUONG) VALUES (@MAPM, @MASACH, @SOLUONG)

PRINT N'Phiếu mượn sách và chi tiết phiếu mượn đã được thêm thành công!' END

PRINT N'Mã phiếu mượn đã tồn tại Vui lòng chọn mã phiếu mượn khác.' END

2.2.2 Thủ tục xóa phiếu mượn sách và chi tiết phiếu mượn a Câu lệnh

IF EXISTS (SELECT 1 FROM PHIEUMUONSACH WHERE MAPM = @MAPM) BEGIN

DELETE FROM CHITIETPM WHERE MAPM = @MAPM

DELETE FROM PHIEUMUONSACH WHERE MAPM = @MAPM

PRINT N'Phiếu mượn sách đã được xóa thành công!'

PRINT N'Không tìm thấy phiếu mượn với mã ' + @MAPM + '.' END

EXEC XoaPhieuMuonSach N'PM033'; b Kết quả

2.2.3 Thủ tục tính tuổi hiện tại của một độc giả bất kỳ với tên độc giả được nhập từ bàn phím. a Câu lệnh:

CREATE PROCEDURE sp_tinhtuoi_tendg

Khai báo biến để lưu trữ ngày sinh của độc giả

Lấy ngày sinh của độc giả từ bảng DOCGIA dựa trên TENDG

SELECT @NGAYSINH NGAYSINH FROM DOCGIA

Nếu không tìm thấy độc giả, in ra thông báo

PRINT N'Không tìm thấy độc giả với tên ' @TENDG+ ;

SET @TUOI EDIFF YEAR( , @NGAYSINH ,GETDATE());

PRINT N'Tuổi của độc giả ' @TENDG + +N' là ' +CAST(@TUOI AS NVARCHAR) + N' năm.';

EXEC sp_tinhtuoi_tendg @TENDG = N'Nguyễn Văn A'; b Kết quả

2.2.4 Thủ tục hiển thị tổng số lượng sách đã mượn với tên sách được nhập từ bàn phím. a Câu lệnh:

Tính tổng số lượng sách đã mượn

SELECT @TongSoLuong = SUM CONVERT( (INT, CTP.SOLUONG)) FROM CHITIETPM CTP

INNER JOIN SACH S ON CTP MASACH S = MASACH

PRINT N'Tổng số lượng sách "' @TenSach + +N'" đã mượn là: ' +

CAST ISNULL( (@TongSoLuong, 0) AS NVARCHAR( ));10

Thực hiện thủ tục để hiển thị tổng số lượng sách đã mượn

EXEC sp_TinhTongSoLuongSachMuon @TenSach; b Kết quả

2.2.5 Thủ tục lấy danh sách các sách đã được mượn bởi 1 độc giả với mã độc giả được nhập từ bàn phím a Câu lệnh:

Lấy thông tin về sách đã được mượn bởi độc giả

CHITIETPM CT ON PM MAPM CT = MAPM

SACH S ON CT MASACH S = MASACH

SET @MASACH = 'DG001'; Thay đổi mã độc giả

EXEC DG_MuonSach @MADG = @MASACH; b Kết quả

2.2.6 Thủ tục tính tổng tiền sách 1 độc giả đã mượn với mã độc giả nhập từ bàn phím a Câu lệnh:

Tính tổng tiền sách mà độc giả đã mượn

SUM(S.GIATHUE CT* SOLUONG)AS TongTien

CHITIETPM CT ON PM MAPM CT = MAPM

SACH S ON CT MASACH S = MASACH

SET @MASACH = 'DG001'; Thay đổi mã độc giả

EXEC TongTien @MADG @MASACH= ; b Kết quả

2.2.7 Thủ tục lấy danh sách các độc giả có số điện thoại kết thúc bằng '1234' a Câu lệnh:

2.2.8 Thủ tục lấy tổng số lượng sách trong bảng SACH a Câu lệnh:

SELECT SUM(SOLUONG) AS TongSoLuongSach

Hàm (Function)

2.3.1 Hàm xem tổng số lượng sách theo từng thể loại a Câu lệnh

CREATE FUNCTION SoLuongSach(@MATL NVARCHAR(100))

Chạy hàm in ra số lượng sách

SELECT @SoLuongSach = dbo.SoLuongSach(@MATL)

PRINT N'Số lượng sách theo thể loại ' + @MATL + N' là: ' + CAST(@SoLuongSach AS NVARCHAR(10)) b Kết quả

2.3.2 Hàm in ra danh sách sách đã mượn của độc giả a Câu lệnh

CREATE FUNCTION DanhSachMuonSach (@MADG NVARCHAR(100)) RETURNS TABLE

CHITIETPM CPM ON PM.MAPM = CPM.MAPM

SACH S ON CPM.MASACH = S.MASACH

Chạy hàm in ra danh sách phiếu mượn của độc giả

SELECT * FROM dbo.DanhSachMuonSach(N'DG001'); b Kết quả

2.3.3 Hàm xem tổng số lượng sách theo mã nhà xuất bản a Câu lệnh

CREATE FUNCTION dbo.TongSoLuongSachTheoNXB(@MaNXB

2.3.4 Hàm xem chi tiết các sách theo mã nhà xuất bản a Câu lệnh

ALTER FUNCTION dbo.Chitietsachtheonhaxb(@MaNXB NVARCHAR(100)) RETURNS TABLE

SELECT SACH.MASACH, TENSACH, TENTL, TENNXB, SOLUONG, GIATHUE

INNER JOIN NHAXUATBAN ON SACH.MANXB = NHAXUATBAN.MANXB INNER JOIN THELOAI ON SACH.MATL = THELOAI.MATL

Sử dụng hàm để lấy thông tin sách của một nhà xuất bản cụ thể

SELECT * FROM dbo.Chitietsachtheonhaxb('NXB003'); b Kết quả

2.3.5 Hàm trả về thông tin cuốn sách được mượn nhiều nhất a Câu lệnh

SACH TENSACH AS'Tên sách',

SACH TUSACH AS'Tủ sách',

SACH NGANSACH AS'Ngăn sách',

COUNT(CHITIETPM MASACH AS 'Số lần mượn' )

CHITIETPM ON SACH MASACH CHITIETPM = MASACH

SACH.TENSACH, SACH.TUSACH, SACH.NGANSACH

SELECT FROM * SachMuonNN(); b Kết quả

2.3.6 Hàm trả về thông tin độc giả bao gồm mã độc giả, tên, ngày sinh, địa chỉ, số điện thoại đã thực hiện trả sách trong tháng 2 năm 2024 a Câu lệnh

PHIEUMUONSACH ON DOCGIA MADG PHIEUMUONSACH = MADG WHERE

SELECT FROM * DGTraSach_T2(); b Kết quả

2.3.7 Hàm tính số lượng sách theo thể loại a Câu lệnh

CREATE FUNCTION ham1 (@theloai NVARCHAR(100))

JOIN THELOAI b ON a.MATL = b.MATL

DECLARE @theloai NVARCHAR(100) =N'Sách Chính trị – pháp luật'; Thay đổi thể loại sách tại đây

SELECT dbo.ham1(@theloai)as SoLuongSachTheoTheLoai; b Kết quả

2.3.8 Hàm tính tổng tiền cọc của độc giả a Câu lệnh

CREATE FUNCTION ham2 (@madg NVARCHAR(100))

DECLARE @madg NVARCHAR(100) = N'DG001'; Thay đổi mã độc giả tại đây SELECT dbo.ham2(@madg) AS TongTienCoc; b Kết quả

Khung nhìn (View)

2.4.1 View xem số lượng sách còn lại a Câu lệnh

CREATE VIEW View_SoLuongSachConLai AS

ISNULL(SUM(CAST(ISNULL(CPM.SOLUONG, 0) AS INT)), 0) AS SOLUONGDAMUON

CHITIETPM CPM ON S.MASACH = CPM.MASACH

SELECT * FROM View_SoLuongSachConLai; b Kết quả

2.4.2 View xem chi tiết thông tin phiếu mượn a Câu lệnh

CREATE VIEW View_ThongTinPhieuMuon AS SELECT

DOCGIA DG ON PM.MADG = DG.MADG INNER JOIN

THUTHU TT ON PM.MATT = TT.MATT INNER JOIN

CHITIETPM CPM ON PM.MAPM = CPM.MAPM INNER JOIN

SACH S ON CPM.MASACH = S.MASACH; Chạy view trên

SELECT * FROM View_ThongTinPhieuMuon; b Kết quả

2.4.3 View xem các sách ở tủ sách A. a Câu lệnh

CREATE VIEW View_SachTheoKe AS SELECT

Xem nội dung của View

SELECT * FROM View_SachTheoKe; b Kết quả

2.4.4 View với mã tác giả, tên tác giả, tên tác phẩm, thể loại mà tác giả có quê quán ở Hải Phòng a Câu lệnh

SACH ON TACGIA.MATG = SACH.MATG

THELOAI ON SACH.MATL = THELOAI.MATL

SELECT * FROM View_2_4_4 b Kết quả

2.4.5 View hiển thị thông tin những độc giả dưới 25 tuổi a Câu lệnh

CREATE VIEW DG_TreTuoi AS

WHERE DATEDIFF YEAR( , NGAYSINH ,GETDATE()) < 25;

SELECT FROM * DG_TreTuoi b Kết quả

2.4.6 View hiển thị độc giả và thể loại sách đã mượn a Câu lệnh

CREATE VIEW DocGia_TheLoai AS

DOCGIA NGAYSINH AS NGAYSINH_DOCGIA,

DOCGIA DIACHI AS DIACHI_DOCGIA,

DOCGIA SODT AS SODT_DOCGIA,

INNER JOIN DOCGIA ON PHIEUMUONSACH MADG DOCGIA = MADG INNER JOIN CHITIETPM ON PHIEUMUONSACH MAPM CHITIETPM = MAPM INNER JOIN SACH ON CHITIETPM MASACH SACH = MASACH

INNER JOIN THELOAI ON SACH MATL THELOAI = MATL;

SELECT FROM * DocGia_TheLoai; b Kết quả

2.4.7 View hiển thị sách của mỗi tác giả a Câu lệnh

JOIN SACH S ON TG.MATG = S.MATG; SELECT TENTG, TENSACH

2.4.8 View hiển thị độc giả và số cuốn sách đã mượn a Câu lệnh

SELECT DG.TENDG, COUNT(CTPM.MASACH) AS SoCuonSachMuon FROM DOCGIA DG

LEFT JOIN PHIEUMUONSACH PMS ON DG.MADG = PMS.MADG LEFT JOIN CHITIETPM CTPM ON PMS.MAPM = CTPM.MAPM GROUP BY DG.TENDG;

Trigger

2.5.1 Trigger tự động cập nhật sách khi thêm phiếu mượn a Câu lệnh

PRINT N'Trigger đang thực thi MAPM: ' + @MAPM;

SET SOLUONG = SOLUONG - ISNULL((SELECT

SUM(CAST(ISNULL(CPM.SOLUONG, 0) AS INT))

WHERE MASACH = (SELECT MASACH FROM CHITIETPM WHERE MAPM @MAPM)

PRINT N'Trigger thực thi thành công!';

Số lượng sách ban đầu :

Thêm phiếu mượn thông qua thủ tục thành công

Số lượng sách được cập nhật

2.5.2 Trigger tự động cập nhật sách khi xóa phiếu mượn a Câu lệnh

PRINT N'Trigger đang thực thi MAPM: ' + @MAPM;

SET SOLUONG = SOLUONG + ISNULL((SELECT

SUM(CAST(ISNULL(CPM.SOLUONG, 0) AS INT))

WHERE MASACH = (SELECT MASACH FROM deleted WHERE MAPM @MAPM);

PRINT N'Trigger thực thi thành công!';

Số lượng sách lúc đầu

Sau khi xóa phiếu mượn thông qua thủ tục

Số lượng sách được cập nhật

2.5.3 Trigger khi thêm một sách thì thông báo thêm thành công a Câu lệnh

IF EXISTS (SELECT FROM 1 SACH s JOIN INSERTED i ON s MASACH i MASACH )

PRINT N'Mã sách đã tồn tại! Không thể thêm.';

INSERT INTO SACH (MASACH, TENSACH MATL MANXB MATG , , , , TUSACH, NGANSACH, SOLUONG GIATHUE, )

SELECT MASACH TENSACH MATL MANXB MATG TUSACH , , , , , ,

PRINT N'Thêm sách thành công!';

Thêm sách với mã sách tồn tại

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

(N'S030', N'Sách 31',N'TL001', N'NXB001',N'TG001',N'Tu sach A',N'Ngan sach 1',

Thêm sách với mã sách chưa tồn tại

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

(N'S031', N'Sách 31',N'TL001', N'NXB001',N'TG001',N'Tu sach A',N'Ngan sach 1',

2.5.4 Trigger khi sửa một độc giả thì thông báo sửa thành công a Câu lệnh

IF (SELECT COUNT(*) FROM INSERTED 0) >

Thông báo khi sửa độc giả

PRINT N'Sửa độc giả thành công!';

Thay đổi thông tin của độc giả có MADG là 'DG001'

SET TENDG ='Người Đọc Mới', SODT ='0987654321'

WHERE MADG ='DG001'; b Kết quả

2.5.5 Trigger tự động xóa tác giả khi xóa mã tác giả từ bàn phím a Câu lệnh

Xóa thông tin tác giả từ bảng TACGIA

WHERE MATG IN (SELECT MATG FROM DELETED);

Xóa các sách liên quan đến tác giả bị xóa

WHERE MATG IN (SELECT MATG FROM DELETED); END;

INSERT INTO TACGIA (MATG, TENTG, QUEQUAN) VALUES

(N'TG123', N'Nguyễn Nhật Ánh',N'Hà Nội')

Xem dữ liệu trước khi xóa

Xóa thông tin tác giả với mã 'TG001'

DELETE FROM TACGIA WHERE MATG = 'TG123';

Xem dữ liệu sau khi xóa

SELECT FROM * TACGIA; b Kết quả

2.5.6 Trigger kiểm tra thủ thư đã tồn tại chưa a Câu lệnh

Kiểm tra và thực hiện thêm thủ thư nếu không tồn tại

JOIN THUTHU tt ON i MATT tt = MATT

INSERT INTO THUTHU (MATT, TENTT NGAYSINH DIACHI SODT, , , ) SELECT MATT TENTT NGAYSINH DIACHI SODT, , , ,

PRINT N'Không thể thêm thủ thư đã tồn tại.';

Chạy câu lệnh INSERT INTO để thêm thủ thư

INSERT INTO THUTHU (MATT, TENTT, NGAYSINH DIACHI SODT, , ) VALUES ('TT001', 'Nguyen Van A','1990-01-01', 'Hanoi','1234567890'); b Kết quả

2.5.7 Trigger cập nhật số điện thoại của tác giả a Câu lệnh

PRINT 'Cập nhật số điện thoại của tác giả đã được thực hiện.';

2.5.8 Trigger xóa tác giả a Câu lệnh

PRINT 'Một tác giả đã bị xóa khỏi bảng "TACGIA".';

Phân quyền cho user

2.6.1 Cấp quyền cho một user (TungAnh176)

CREATE LOGIN TungAnh176 WITH PASSWORD ='123'; CREATE USER TungAnh176 FOR LOGIN TungAnh176; GRANT INSERT ON SACH TO TungAnh176;

SELECT princ.name AS TungAnh176, perm.state_desc, perm.permission_name, obj.name AS BTL_QLTV, obj.type_desc

FROM sys database_principals princ

JOIN sys database_permissions perm ON princ principal_id perm grantee_principal_id.

JOIN sys objects obj ON perm major_id obj = object_id WHERE princ.name ='TungAnh176'

AND perm.permission_name ='INSERT';

REVOKE INSERT ON OBJECT::SACH FROM TungAnh176;

SELECT princ.name AS TungAnh176, perm.state_desc, perm.permission_name, obj.name AS BTL_QLTV, obj.type_desc

FROM sys database_principals princ

JOIN sys database_permissions perm ON princ principal_id perm grantee_principal_id.

JOIN sys objects obj ON perm major_id obj = object_id

AND perm.permission_name ='INSERT';

2.6.2 Cấp quyền cho một user (CHINH0705)

CREATE LOGIN CHINH0705 WITH PASSWORD = '000'; CREATE USER CHINH0705 FOR LOGIN CHINH0705; GRANT INSERT ON DOCGIA TO CHINH0705;

OBJ.NAME AS BTL_QLTV,

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND PERM.PERMISSION_NAME = 'INSERT';

REVOKE INSERT ON OBJECT::DOCGIA FROM CHINH0705;

SELECT princ.name AS CHINH0705, perm.state_desc, perm.permission_name, obj.name AS BTL_QLTV, obj.type_desc

FROM sys database_principals princ

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND perm.permission_name ='INSERT';

2.6.3 Cấp quyền cho một user (QUY0211)

CREATE LOGIN QUY0211 WITH PASSWORD = '111';

CREATE USER QUY0211 FOR LOGIN QUY0211;

GRANT INSERT ON THUTHU TO QUY0211;

OBJ.NAME AS BTL_QLTV,

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND PERM.PERMISSION_NAME = 'INSERT';

REVOKE INSERT ON OBJECT::THUTHU FROM QUY0211;

SELECT princ.name AS QUY0211, perm.state_desc, perm.permission_name, obj.name AS BTL_QLTV, obj.type_desc

FROM sys database_principals princ

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND perm.permission_name ='INSERT';

2.6.4 Cấp quyền cho một user (MANH69)

CREATE LOGIN MANH69 WITH PASSWORD ='ABC';

CREATE USER MANH69 FOR LOGIN MANH69;

GRANT INSERT ON TACGIA TO MANH69;

OBJ.NAME AS BTL_QLTV,

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND PERM.PERMISSION_NAME = 'INSERT';

REVOKE INSERT ON OBJECT::TACGIA FROM MANH69;

SELECT princ.name AS MANH69, perm.state_desc, perm.permission_name, obj.name AS BTL_QLTV, obj.type_desc

FROM sys database_principals princ

JOIN sys database_permissions perm ON princ principal_id perm = grantee_principal_id JOIN sys objects obj ON perm major_id obj = object_id

AND perm.permission_name ='INSERT';

Isolation level cho transanction

2.7.1 Read Uncommitted (Chưa cô lập đọc)

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

VALUES ('S032', N'Sách 32', 'TL001', 'NXB001', 'TG001', 'Tu Sach 1' 'Ngon ngu tieng , Viet', 10 15.99, );

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Trong giao diện 2, cấp độ cô lập READ UNCOMMITTED được sử dụng Cấp độ này cho phép giao dịch đọc dữ liệu mà không phải chờ đến khi giao dịch khác kết thúc Điều này có thể dẫn đến đọc dữ liệu không đồng nhất, do đó cần cân nhắc cẩn thận khi sử dụng cấp độ này để tránh các vấn đề đồng thời.

2.7.2 Read Committed (Đã cô lập đọc)

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

VALUES ('S032', N'Sách 32', 'TL001', 'NXB001', 'TG001', 'Tu Sach 1' 'Ngon ngu tieng , Viet', 10 15.99, );

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

Trong giao diện 2, cấp độ cô lập READ COMMITTED được sử dụng Cấp độ này đảm bảo rằng mọi SELECT chỉ đọc các dữ liệu đã được commit, giảm rủi ro đọc dữ liệu chưa commit Sau khi thực hiện SELECT, giao dịch được commit.

2.7.3 Repeatable Read (Lặp lại đọc)

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

VALUES ('S033', N'Sách 33', 'TL001', 'NXB001', 'TG001', 'Tu Sach 1' 'Ngon ngu tieng , Viet', 10 15.99, );

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Trong giao diện 2, cấp độ cô lập REPEATABLE READ được sử dụng Cấp độ này đảm bảo rằng mọi SELECT chỉ đọc các dữ liệu đã được commit và không bị phép đọc các dữ liệu mới được thêm vào trong quá trình giao dịch đang chạy Sau khi thực hiện SELECT, giao dịch vẫn giữ nguyên và không commit.

INSERT INTO SACH (MASACH TENSACH, MATL MANXB MATG TUSACH, , , , , NGANSACH, SOLUONG, GIATHUE)

VALUES ('S034', N'Sách 34', 'TL001', 'NXB001', 'TG001', 'Tu Sach 1' 'Ngon ngu tieng , Viet', 10 15.99, );

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

Trong giao diện 2, cấp độ cô lập SERIALIZABLE được sử dụng Cấp độ này đảm bảo rằng không có các giao dịch khác có thể thực hiện đồng thời trên dữ liệu được chọn Nó tạo ra khóa toàn bộ, giữ nguyên cho đến khi giao dịch kết thúc, tránh tình trạng xung đột và giữ cho dữ liệu được cô lập khỏi các giao dịch khác.

Ngày đăng: 16/05/2024, 16:22

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w