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.