Professional Documents
Culture Documents
Bài Giảng Hệ Quản Trị CSDL
Bài Giảng Hệ Quản Trị CSDL
BÀI GIẢNG
BÀI GIẢNG
1 CSDL Cơ sở dữ liệu
3 SQL Structured Query Language – Ngôn ngữ truy vấn có cấu trúc
2 Database (cơ sở dữ liệu) Là một tập thông tin có tổ chức, sao cho việc truy cập, quản lý
và kết xuất nó được thực hiện một cách dễ dàng. Là một tập các
bảng (table) chứa dữ liệu, có quan hệ với nhau.
3 Foreign Key (khóa khóa ngoại được sử dụng để tạo ràng buộc tham chiếu dữ liệu
ngoại) giữa hai table với nhau. Trong trường hợp này, khóa ngoại
chính là cột/các cột trong table tham chiếu, mà nó khớp với
cột/các cột khóa chính trong table được tham chiếu. Khóa ngoại
được sử dụng để liên kết dữ liệu trên nhiều table, vì thế nó
không thể chứa dữ liệu mà nó không xuất hiện trong table mà
nó tham chiếu đến. Tham chiếu được cung cấp bởi khóa ngoại
giúp tạo ra một thực tế: Nhiều row trong một table tham chiếu
có thể tham chiếu đến một row đơn trong table được tham
chiếu.
4 Hệ quản trị cơ sở dữ liệu Là hệ thống được thiết kế để quản lí một khối lượng dữ liệu
(Database Management nhất định một cách tự động và có trật tự. Các hành động quản
System) lý này bao gồm chỉnh sửa, xóa, lưu thông tin và tìm kiếm (truy
xuất thông tin) trong một nhóm dữ liệu nhất định.
5 Primary Key (khóa Một table thường có một column, hoặc nhiều column kết hợp
chính) với nhau, mà dữ liệu chứa ở đó định danh duy nhất mỗi record
trong table. Column này, hoặc các column này, được gọi là
khóa chính của table, và nó chịu trách nhiệm thực thi tính toàn
vẹn dữ liệu của table.
6 Relational database (cở Là một tập các đối tượng dữ liệu được tổ chức theo dạng thức
sở dữ liệu quan hệ) bảng (table), sao cho sau đó có thể truy cập và/hoặc kết xuất dữ
liệu theo các cách khác nhau mà không cần tổ chức lại các bảng
dữ liệu.
7 Relational database RDBMS (hệ quản trị cơ sở dữ liệu quan hệ) là một hệ chương
management system trình, hay một phần mền, quản lý cơ sở dữ liệu quan hệ. Nó cho
phép ta tạo (create), cập nhật (update) và quản trị (administer)
cơ sở dữ liệu theo mô hình quan hệ của E. F. Codd.
8 Referential Integrity Ràng buộc này đảm bảo rằng, giá trị khóa ngoại trog table tham
(toàn vẹn tham chiếu) chiếu (còn gọi là table khóa ngoại) luôn trỏ đến một row trong
table được tham chiếu (còn gọi là table khóa chính).
9 Row (dòng) Một dòng, hay còn gọi là một bản ghi (record), là một tập các
field trong một table. Dữ liệu ở đây định danh duy nhất một
thực thể cụ thể trong một table.
10 Table (bảng) Là một cấu trúc dữ liệu, được sử dụng để tổ chức lưu trữ dữ liệu
cho một chủ đề thông tin nào đó. Nó bao gồm một tập các mục
vào dữ liệu có liên quan với nhau, được tổ chức dưới dạng một
ma trận dữ liệu, với số lượng cột (column) và dòng (row/record)
xác định
MỞ ĐẦU
Từ lâu việc quản lý dữ liệu là một trong những nhu cầu rất lớn. Nhiều mô hình dữ liệu đã
nghiên cứu như mô hình phân cấp, mô hình mạng, … Nhưng cho đến khi mô hình quan hệ E.
F. Codd đề xuất vào năm 1970 thì cơ sở dữ liệu được sang trang mới. Nhiều kết quả nghiên cứu
về lý thuyết trên mô hình quan hệ đã được công bố. Nhiều hệ quản trị cơ sở dữ liệu xây dựng
trên mô hình quan hệ đã được ra đời. Cùng với sự chuẩn hóa của ngôn ngữ có cấu trúc SQL đã
làm cho các hệ quản trị cơ sở dữ liệu sử dụng mô hình quan hệ như tiếp thêm sức mạnh trong
ứng dụng. Kết quả là đến nay rất nhiều hệ quản trị cơ sở dữ liệu theo mô hình quan hệ đã ra đời
và được ứng dụng rộng rãi trên thế giới như: Foxbase, Foxpro, DB2, MySQL, Microsoft
Access, Microsoft SQL Server, Oracle,… Cho đến nay, với sự phát triển của nhu cầu lưu trữ
và xử lý dữ liệu lớn (Big Data), mô hình NoSQL ra đời với hàng loạt hệ quản trị cơ sở dữ liệu
được xây dựng nhằm đáp ứng nhu cầu lưu trữ và xử lý dữ liệu lớn. Tuy vậy, các hệ quản trị cơ
sở dữ liệu theo mô hình quan hệ vẫn còn nguyên ý nghĩa của nó trong việc ứng dụng. Hệ quản
trị cơ sở dữ liệu là môn học bắt buộc trong chương trình đào tạo ngành Công nghệ thông tin
và một số ngành khác có lưu trữ và xử lý dữ liệu. Bài giảng Hệ quản trị cơ sở dữ liệu cung cấp
cho sinh viên những kiến thức cơ bản về hệ quản trị cơ sở dữ liệu theo mô hình quan hệ và
được minh họa cụ thể trên hệ quản trị cơ sở dữ liệu Microsoft SQL Server.
Nhóm biên soạn chúng tôi chọn Microsoft SQL Server vì đây là một hệ quản trị cở sở dữ liệu
theo mô hình quan hệ được phát triển bởi Microsoft dùng để quản lý và lưu trữ dữ liệu theo mô
hình Client/Server. Đây là một trong những hệ quản trị cơ sở dữ liệu có đầy đủ các tính năng
của một hệ quản trị cơ sở dữ liệu cơ bản, được nhiều nhà phát triển ứng dụng lựa chọn như một
giải pháp lưu trữ dữ liệu cho các ứng dụng.
Bài giảng được chia thành 6 chương với nội dung như sau:
Chương 1: Giới thiệu tổng quan về sql server
Chương 2: Bảng ảo (view)
Chương 3: Thủ tục lưu trữ (stored procedure)
Chương 4: Bẫy lỗi (trigger)
Chương 5: Kiểu dữ liệu con trỏ (cursor)
Chương 6: Quản lý bảo mật
Bài giảng Hệ quản trị cơ sở dữ liệu SQL server là chọn lọc những nội dung của các giảng viên
Khoa Công nghệ thông tin – Trường Đại học Công nghệ thông tin và truyền thông giảng dạy
trong nhiều năm qua. Trong bài giảng này, chúng tôi không có tham vọng đề cập đến mọi khía
cạnh của hệ quản trị cơ sở dữ liệu nói chung và hệ quản trị Microsoft SQL Server mà chỉ đặt
mục tiêu là tài liệu cho sinh viên và những người tự học nắm được các khái niệm và ý
nghĩa của hệ quản trị cơ sở dữ liệu, làm quen và thực hành trên một hệ quản trị cơ sở dữ liệu
cụ thể là Microsoft SQL Server.
Mặc dù đã có nhiều cố gắng trong việc biên soạn và cập nhật cho phù hợp với thực tế nhưng bài
giảng chắc chắn vẫn còn những hạn chế và thiếu sót. Nhóm biên soạn mong nhận được những ý
kiến đóng góp từ đồng nghiệp và độc giả để bài giảng ngày được hoàn thiện hơn với mục tiêu
đáp ứng tốt nhất cho người học.
Hình 1.1: Cấu trúc vật lý của một SQL Server Database
Trước khi SQL Server muốn lưu data vào một table nó cần phải dành riêng một khoảng
trống trong data file cho table đó. Những khoảng trống đó chính là các extents. Có 2 loại Extents:
Mixed Extents (loại hỗn hợp) dùng để chứa data của nhiều tables trong cùng một Extent và
Uniform Extent (loại thuần nhất) dùng để chứa data của một table. Ðầu tiên SQL Server dành
các Page trong Mixed Extent để chứa data cho một table sau đó khi data tăng trưởng thì SQL
dành hẳn một Uniform Extent cho table đó.
1.4.3 Cấu trúc logic của một SQL Server Database
Mỗi Database trong SQL Server đều được tổ chức thành những objects như tables, views,
stored procedures, indexes, constraints.... Những system objects trong SQL Server thường có
bắt đầu bằng chữ sys hay sp. Các objects trên sẽ được nghiên cứu lần lượt trong các chương tiếp
theo của bài giảng.
Các từ khóa SELECT, FROM, WHERE được sử dụng để tạo nên một câu lệnh SELECT
đơn giản nhất
Truy vấn con là một câu lệnh SELECT được lồng vào bên trong một câu lệnh SELECT,
INSERT, UPDATE, DELETE hoặc bên trong một truy vấn con khác. Loại truy vấn này được
sử dụng để biểu diễn cho những truy vấn trong đó điều kiện truy vấn dữ liệu cần phải sử dụng
đến kết quả của một truy vấn khác.
SELECT TenCongTy
SELECT TenCongTy
FROM CongTy
FROM CungCap
Ví du: Câu lệnh sau liệt kê tên các công ty chưa từng cung cấp mặt hàng nào
SELECT TenCongTy
FROM CongTy
FROM CungCap)
SELECT *
FROM CongTy
Tìm những công ty cung cấp ít nhất một mặt hàng màu đỏ
SELECT TenCongTy
FROM CongTy
FROM CungCap
FROM HangHoa
Câu lệnh sau liệt kê tên các công ty chưa từng cấp mặt hàng có mã là H1.
SELECT TenCongTy
FROM CongTy
FROM CungCap CC
WHERE CC.MaCongTy=CongTy.MaCongTy
VD:
DECLARE @DEM INT
SET @DEM=1
WHILE @DEM<5
BEGIN
INSERT INTO THU1
VALUES(@DEM,'THEM DONG MOI')
SET @DEM=@DEM+1
END
3.6 Tạo thủ tục lưu trữ
Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau:
CREATE PROC[EDURE] <Tên_thủ_tục>
[<@tên_tham_biến_1> <Kiểu_dữ_liệu>[= <giá_trị_mặc_định>][Output]]
[,…]
[<@tên_tham_biến_n> <Kiểu_dữ_liệu>[= <giá_trị_mặc_định>][Output]]
[WITH ENCRYPTION]
AS
<Thân_thủ_tục>
Giải thích:
- Tên_thủ_tục: Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và không được
vượt quá 128 ký tự
- Khai báo tham số cho thủ tục. Các tham số của thủ tục được khai báo ngay sau tên thủ tục
và nếu thủ tục có nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy. Khai báo
của mỗi một tham số tối thiểu phải bao gồm hai phần
- Tên tham số được bắt đầu bởi dấu @
- Kiểu dữ liệu của tham số
- Thủ tục sẽ được mã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ định. Nếu thủ tục
đã được mã hoá, ta không thể xem được nội dung của thủ tục. Có 2 loại tham biến
- Thân_thủ_tục: Tập các câu lệnh của T-SQL để thực hiện một nhiệm vụ nào đó
3.7 Tham số trong thủ tục lưu trữ
Tham số là phần cơ bản để tạo nên sự uyển chuyển của thủ tục. Có 2 loại tham số: Tham
sô vào và tham số ra
a) Tham số vào (Input parameter): là loại tham số cho phép người dùng có thể truyền vào
các giá trị cho những xử lý bên trong một thủ tục. Các giá trị này thật cần thiết cho các hành
động tính toán bên trong thủ tục
- Khai báo tham số vào:
<@tên_tham_số> <Kiểu_dữ_liệu> [= <giá_trị_mặc_định>]
Trong đó:
Tên_tham_số: tên tham số của thủ tục phải duy nhất trong thủ tục và nên đặt tên tham số
một cách gợi nhớ.
Kiểu_dữ_liệu: kiểu dữ liệu của tham số quy định loại dữ liệu tương ứng được truyền vào
cho thủ tục.
Giá_trị_mặc_định: giá trị mặc định được gán vào tham số khi tham số không được nhận
giá trị khi thủ tục được gọi thực hiện.
Khi gọi thủ tục: Tham số vào phải được truyền với giá trị cụ thể
b) Tham số ra (Output parameter): là loại tham số cho phép nhận các kết quả xử lý mà thủ
tục trả về.
- Khai báo tham số ra:
<@tên_tham_số> <Kiểu_dữ_liệu> [= <giá_trị_mặc_định>] OUTPUT
Trong đó: Từ khóa OUTPUT dùng để chỉ định loại tham biến là tham số ra.
- Khi gọi thủ tục: Tham số ra phải là biến đã được khai báo trước và phải có từ khóa OUTPUT
đi kèm
3.8 Thực thi thủ tục lưu trữ
Cho Cơ sở dữ liệu quản lý bán hàng gồm các thuộc tính sau:
a) Tạo một thủ tục đơn giản (không sử dụng tham số)
--Tạo thủ tục để cho biết có bao nhiêu khách hàng có địa chỉ ở Thái Nguyên?
USE QLBanHang
Go
CREATE PROC SPKhach
AS
DECLARE @TongSO Int
SELECT @TongSO=Count(*)
FROM Khach
WHERE DiaChi='Thái Nguyên'
Print 'Tổng số khách hàng có địa chỉ ở Thái Nguyên là '+convert(Char(10),@TongSO)
Go
- Thực thi (Gọi thủ tục) không sử dụng tham số, sử dụng cú pháp sau:
[EXEC] <tên_thủ_tục>
Ví dụ: Gọi thực hiện thủ tục trên
USE QLBanHang
Go
EXEC SPKhach
b) Tạo thủ tục có sử dụng tham số
- Tạo thủ tục sử dụng tham số vào có giá trị mặc định
Các tham số được khai báo trong thủ tục có thể nhận các giá trị mặc định. Giá trị mặc định
sẽ được gán cho tham số trong trường hợp không truyền đối số cho tham số khi có lời gọi đến
thủ tục.
Tham số với giá trị mặc định được khai báo theo cú pháp như sau:
@tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định
Ví dụ:
-- Tạo thủ tục có tham số vào là @SoHD để đưa ra tổng tiền phải trả của hóa đơn trên
USE QLBanHang
Go
CREATE PROC SPTongTien_1
@SoHD Char(10)='1'
AS
DECLARE @TongTien Money
SELECT @TongTien=Sum(SoLuong*DonGia)
FROM ChiTietHoaDon
WHERE SoHD=@SoHD
PRINT 'Tổng tiền của hóa đơn ' +@SoHD+Convert(char(20),@TongTien)
--Thực thi thủ tục SPTongTien_1 sử dụng giá trị mặc định của tham số
EXEC SPTongTien_1
--Thực thi thủ tục SPTongTien_1 không sử dụng giá trị mặc định, tham số @SoHD nhận giá trị
bằng 2
EXEC SPTongTien_1 '2'
- Tạo thủ tục sử dụng tham số đầu vào không có giá trị mặc nhiên
USE QLBanHang
Go
CREATE PROC SPTongTien_2
@SoHD Char(1)
AS
DECLARE @TongTien Money
SELECT @TongTien=Sum(SoLuong*DonGia)
FROM ChiTietHoaDon
WHERE SoHD=@SoHD
PRINT 'Tổng tiền của hóa đơn ' +@SoHD+Convert(char(20),@TongTien)
--Thực thi thủ tục SPTongTien_2 với tham số vào @SoHD nhận giá trị 3
EXEC SPTongTien_2 '2'
- Thực thi thủ tục sử dụng tham số vào.
[EXEC] <Tên_thủ_tục> <Danh_sách_các_đối_số>
Ghi chú:
Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự của
các tham số khi định nghĩa thủ tục.
Trong trường hợp lời gọi thủ tục được thực hiện bên trong một thủ tục khác, bên trong
một trigger hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau:
EXEC tên_thủ_tục [danh_sách_các_đối_số]
Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo thứ tự của
các tham số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới dạng:
@tên_tham_số = giá_trị
Ví dụ: Thủ tục SPTongTien_2 có thể được thực hiện như sau:
EXEC SPTongTien_2 @SoHD='2'
- Tạo thủ tục có tham số ra (Output)
Ví dụ
--Tạo thủ tục có 2 tham số vào là @MaH và @SoHD và một tham số ra là @SL, với @SL chứa
số lượng đặt hàng của mặt hàng tương ứng với @MaH trong hóa đơn @SoHD
USE QLBanHang
GO
CREATE PROC spud_TinhSLMua
@Sodh CHAR(10), @MaH CHAR(10), @Slmua INT OUTPUT
AS
IF NOT EXISTS(SELECT SoHD FROM ChiTietHoaDon
WHERE SoHD=@Sodh AND MaH=@MaH)
BEGIN
PRINT 'Xin lỗi! mặt hàng này không có trong hóa đơn'
RETURN
END
SELECT @Slmua=SoLuong FROM ChiTietHoaDon WHERE SoHD=@Sodh AND
MaH=@MaH
GO
--Thực thi thủ tục
USE QLBanHang
GO
DECLARE @SL INT
EXEC spud_TinhSLDat @Sodh='1',@MaH='1', @SLmua=@Sl OUTPUT
PRINT 'Đơn đặt hàng 1 với mặt hàng 1'
PRINT 'Có số lượng đặt là: ' + CAST(@SL AS VARCHAR(10))
--Hoặc thực thi thủ tục theo sau cách
USE QLBanHang
GO
DECLARE @SL INT
EXEC spud_TinhSLDat '1','1', @Sl OUTPUT
PRINT 'Đơn đặt hàng 1 với mặt hàng 1'
PRINT 'Có số lượng đặt là: ' + CAST(@SL AS VARCHAR(10))
Nhận xét:
Trong ví dụ trên bắt buộc phải khai báo thêm một biến cục bộ @SL bên ngoài thủ tục dùng
đề đón nhận giá trị trả về của tham số ra @SLMua. Từ khóa OUTPUT bắt buộc phải được sử
dụng tại hai nơi khi sử dụng các loại tham số đầu ra (lúc định nghĩa tham số và lúc gọi thực hiện
thủ tục). Tên của biến cục bộ bên ngoài thủ tục và tên của tham số hình thức lúc định nghĩa thủ
tục có thể được phép trùng tên nhau, tuy nhiên trong ví dụ trên cố tình đặt tên khác nhau để giúp
cho chúng ta dễ dàng phân biệt: biến cục bộ là @SL và tham số hình thức là @SLMua.
Bài 5: THỦ TỤC LƯU TRỮ (Số tiết: 3 tiết)
3.9 Thay đổi cấu trúc thủ tục lưu trữ
Khi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng câu lệnh
ALTER PROCEDURE có cú pháp như sau:
ALTER PROC[EDURE] <Tên_thủ_tục>
[<@tên_tham_biến_1> <Kiểu_dữ_liệu>[= <giá_trị_mặc_định>][Output]]
[,…]
[<@tên_tham_biến_n> <Kiểu_dữ_liệu>[= <giá_trị_mặc_định>][Output]]
[WITH ENCRYPTION]
AS
<Thân_thủ_tục>
Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại
một thủ tục đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như không
tác động đến các thủ tục khác hay trigger phụ thuộc vào thủ tục này.
Ví dụ:
--Sửa lại thủ tục SPTongTien_1 để đưa ra danh sách các mặt hàng có trong hóa đơn có mã là
@SoHD
ALTER PROC SPTongTien_1
@SoHD Char(1)
AS
SELECT Hang.*, CT.SoLuong, DonGia
FROM ChiTietHoaDon CT, Hang
WHERE CT.MaH=Hang.MaH AND SoHD=@SoHD
--Gọi thực thi thủ tục
EXEC SPTongTien_1 @SoHD= ‘2’
3.0 Xóa thủ tục
Để xoá một thủ tục đã có, ta sử dụng câu lệnh DROP PROCEDURE với cú pháp như sau:
DROP PROCEDURE tên_thủ_tục
Khi xoá một thủ tục, tất cả các quyền đã cấp cho người sử dụng trên thủ tục đó cũng đồng
thời bị xoá bỏ. Do đó, nếu tạo lại thủ tục, ta phải tiến hành cấp phát lại các quyền trên thủ tục
đó.
Ví dụ: Xóa thủ tục SPTongTien_1
DROP PROCEDURE SPTongTien_1
3.11 Xem định nghĩa thủ tục
Để xem lại định nghĩa thủ tục đã tạo ta sử dụng thủ tục SP_HELPTEXT.
Ví dụ: Xem lại định nghĩa thủ tục spud_TinhSLMua
EXEC SP_HELPTEXT spud_TinhSLMua
Kết quả xuất hiện như sau:
CREATE PROC spud_TinhSLMua
@Sodh CHAR(10), @MaH CHAR(10), @Slmua INT OUTPUT
AS
IF NOT EXISTS(SELECT SoHD FROM ChiTietHoaDon
WHERE SoHD=@Sodh AND MaH=@MaH)
BEGIN
PRINT 'Xin xem lại số đặt hàng, mã vật tư!'
RETURN
END
SELECT @Slmua=SoLuong FROM ChiTietHoaDon WHERE SoHD=@Sodh AND
MaH=@MaH
CÂU HỎI ÔN TẬP
Câu 1: Định nghĩa thủ tục lưu trữ.
Câu 2: Phân loại các loại thủ tục lưu trữ?
Câu 3: Trình bày cú pháp thủ tục lưu trữ? Cho ví dụ minh họa?
Câu 4: Trình bày các loại tham số trong thủ tục lưu trữ
Câu 5: Trình bày các loại biến trong SQL Server?
Ví dụ 4.1: Sử dụng Trigger được dùng để thay thế các constraint trong trường hợp ta muốn việc
kiểm tra ràng buộc dữ liệu kèm theo các câu thông báo thích hợp theo ý muốn người dùng.
--Tạo Trigger để kiểm tra việc nhập và cập nhật dữ liệu vào bảng Hàng nếu số lượng <0
thì đưa ra màn hình dòng thông báo lỗi và hủy việc nhập hoặc cập nhật. Ngược lại đưa ra màn
hình dữ liệu đã cập nhật thành công?
CREATE TRIGGER CapNhatDuLieu_Hang
On Hang
FOR INSERT,UPDATE
AS
If EXISTS (SELECT * FROM INSERTED WHERE SoLuong < 0)
Begin
Print 'Dữ liệu cập nhật không hợp lệ, Mời chúng ta nhập lại'
RollBack Tran
End
ELSE
Print'Xin chúc mừng!Dữ liệu cập nhật thành công'
GO
--Trigger CapNhatDuLieu_Hang được tự động kích hoạt khi Table Hang xảy ra một trong 2 sự
kiện INSERT hoặc UPDATE.
-- Tạo Trigger để kiểm tra việc cập nhật đơn giá vào bảng ChiTietHoaDon. Đơn giá mới được
cập nhật chỉ cho phép tăng không quá 10% so với đơn giá cũ.
CREATE TRIGGER CapNhat
ON ChiTietHoaDon
FOR UPDATE
AS
DECLARE @DGC INT, @DGM INT
SELECT @DGC=DonGia FROM DELETED
PRINT 'GIA CU ='
PRINT CONVERT(CHAR(10),@DGC)
SELECT @DGM =DonGia FROM INSERTED
PRINT 'GIA MOI ='
PRINT CONVERT(CHAR(10),@DGM)
IF (@DGM>(@DGC*1.10))
BEGIN
PRINT 'GIA MOI TANG QUA 10%, KHONG CAP NHAT'
ROLLBACK TRAN
END
ELSE
PRINT 'GIA MOI CHAP NHAN DUOC'
GO
--Trigger CapNhat được tự động kích hoạt khi Table ChiTietHoaDon xảy ra UPDATE.
Ví dụ 4.2: Tạo Deleted Trigger
-- Giả sử cần tạo bảng để lưu lại những mặt hàng đã bị xóa dùng cho mục đích phân tích
sau này. Mỗi mặt hàng trong bảng MATHANG khi bị xóa sẽ được lưu lại trong bảng này.
Ta tạo bảng TTHANGXOA có cấu trúc giống hệt với bảng MATHANG
Tạo Trigger để lưu lại thông tin mỗi khi xóa
CREATE TRIGGER TTHANGXOA
ON HANG
FOR DELETE
AS
INSERT INTO TTHANGXOA SELECT *
FROM DELETED
GO
---Trigger TTHANGXOA được tự động kích hoạt khi Table Hang xảy ra DELETE
Ví dụ 4.3: Sử dụng trigger để đảm bảo việc thay đổi dây chuyền dữ liệu giữa các bảng với nhau
(Khi có sự thay đổi dữ liệu trên 1 table thì dữ liệu trên 1 hay nhiều table khác cũng tự động thay
đổi theo cho phù hợp)
--Tạo Trigger để khi thêm mới một bản ghi vào Table ChiTietHoaDon thì tự động Update lại
cột SoLuong trên Table Hang. Ngoài ra Trigger này kiểm soát được số lượng trong Table
ChiTietHoaDon luôn phải <= Số lượng của mặt hàng đó trong Table Hàng
CREATE TRIGGER NhapDuLieu_ChiTietHoaDon
On ChiTietHoaDon
FOR INSERT
AS
DECLARE @SLBan INT,@SL INT
DECLARE @MaH CHAR(10)
SET @SLBan=(SELECT SoLuong FROM INSERTED)
SET @MaH=(SELECT MaH FROM INSERTED)
SET @SL=(SELECT SoLuong FROM Hang WHERE MaH=@MaH)
--Kiểm tra số lượng hàng do khách hàng mua > số lượng có của mặt hàng thì đưa ra thông
báo lỗi
IF (@SLBan>@SL)
Begin
Print 'Xin lỗi! Mặt hàng trên không đáp ứng đủ số lượng’
RollBack Tran
End
--Nếu việc mua hàng thực hiện thành công thì tự động cập nhật lại số lượng cho mặt hàng trong
bảng Hàng
ELSE
UPDATE Hang
SET SoLuong=SoLuong-@SLBan
Where MaH=@MaH
GO
--Để kích hoạt Trigger NhapDuLieu_ChiTietHoaDon ta sử dụng lệnh sau:
Insert into ChiTietHoaDon(SoHD, MaH, SoLuong, DonGia)
Values('1','1',100,200000)
--Dữ liệu của bảng Hàng trước khi nhập dữ liệu vào bảng ChiTietHoaDon
--Dữ liệu của bảng Hàng sau khi nhập dữ liệu vào bảng ChiTietHoaDon
Ví dụ 4.4: Tạo Trigger loại INSTEAD OF TRIGGER
--Tạo View chứa dữ liệu của bảng HoaDon
Create View vwHoaDon
AS
SELECT *
FROM HoaDon
--Tạo Trigger có tên là Nhap_HoaDon để kiểm tra việc nhập dữ liệu vào Table HoaDon Thông
qua vwHoaDon. Nếu ngày nhập vào lớn hơn ngày hiện thời thì đưa ra màn hình dòng thông báo
lỗi, ngược lại tiến hành nhập dữ liệu vào bảng HoaDon
CREATE TRIGGER Nhap_HoaDon
ON vwHoaDon
INSTEAD OF INSERT
AS
DECLARE @Ngay DateTime, @NgayHienTai DateTime
DECLARE @SoHD Char(10), @MaK Char(10)
SELECT @Ngay=Ngay, @SoHD=SoHD,@MaK=MaK FROM INSERTED
SET @NgayHienTai=(SELECT Getdate())
IF @Ngay>@NgayHienTai
Begin
Print 'Dữ liệu nhập không hợp hệ'
End
ELSE
Begin
INSERT INTO HoaDon(SoHD,MaK,Ngay)
Values(@SoHD,@MaK,@Ngay)
Print'Dữ liệu đã nhập vào bảng HoaDon'
End
4.7 Quản lý Trigger
- Xem mã Trigger
SP_helptext <Tên Trigger>
Ví dụ:
SP_helptext ChiTietHoaDon
- Xem những Trigger nào đang tồn tại trên bảng
SP_Helptrigger <Tên bảng>
Ví dụ:
SP_helptrigger ChiTietHoaDon
- Xóa Trigger
Drop Trigger <Tên Trigger>
Ví dụ:
Drop Trigger NhapDuLieu_ChiTietHoaDon
- Sửa đổi Trigger:
Khi một Trigger đã được tạo ra, ta có thể tiến hành định nghĩa lại Trigger đó bằng câu lệnh
ALTER TRIGGER có cú pháp như sau:
ALTER TRIGGER <Tên Trigger>
ON <Tên_bảng>| <Tên_view>
[WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF [DELETE],[INSERT],[UPDATE]
AS
<Thân_của_Trigger >
Các tham số trong lệnh này sử dụng tương tự như câu lệnh CREATE TRIGGER.
- Vô hiệu hoặc làm cho có hiệu lực một Trigger
Dùng phát biểu ALTER TABLE để vô hiệu hoặc cho có hiệu lực một Trigger thay vì phải
xóa định nghĩa của nó khỏi bảng.
Vô hiệu một Trigger:
ALTER TABLE Hang
Ví dụ:
Disable Trigger CapNhatDuLieu_Hang
Làm cho Trigger có hiệu lực trở lại
ALTER TABLE Hang
Ví dụ:
Enable Trigger CapNhatDuLieu_Hang
4.8 Các đặc điểm và hạn chế của Trigger
Từ một trigger có thể xây dựng bên trong nó các câu lệnh tác động lên cột của bất kỳ table
nào trong cơ sở dữ liệu.
Một trigger có thể thực hiện nhiều hành động (multiple actions), và nó có thể được kích
hoạt bởi nhiều hơn 1 một sự kiện sau: insert, delete, update).
Trigger không thể được tạo trên 1 table tạm (temporary table, là table được tạo với tên table
có ký tự # hoặc ## phía trước) hoặc table hệ thống (system table). Tuy nhiên các câu lệnh bên
trong trigger hoàn toàn có thể tham chiếu đến nội dung bên trong các table tạm và table hệ thống.
Một hạn chế là các trigger loại INSTEAD OF DELETE và INSTEAD OF UPDATE không
thể được định nghĩa trên các table có chứa khóa ngoại được thiết đặt tính chất On Delete Cascade
và On Update Cascade.
Trigger có 2 dạng là Instead of và After|For: Instead of là loại trigger mà hoạt động của sự
kiện gọi nó sẽ bỏ qua và thay vào nó là các lệnh thực hiện trong trigger. After (tương đương với
từ khóa For) khác với loại Instead of thì loại trigger này sẽ thực hiện các lệnh trong nó sau khi
đã thực hiện xong sự kiện gọi nó.
Loại trigger AFTER|FOR chỉ có thể áp dụng cho một Table. Loại trigger INSTEAD OF
có thể áp dụng hoặc cho Table hoặc cho View.
Câu lệnh CREATE TRIGGER phải là câu lệnh đầu tiên trong một query batch (Một batch
là một lô bao gồm các câu lệnh T-SQL kết thúc bởi từ khóa GO.
Trên một table, nếu muốn chúng ta có thể định nghĩa cả hai loại trigger. Nếu chúng ta định
nghĩa cả hai loại trigger và các constraint cho một table, thứ tự thi hành sẽ là trigger INSTEAD
OF, các constraint được xử lý và sau cùng là trigger AFTER. Nếu các constraint bị vi phạm (có
nghĩa là việc kiểm tra ràng buộc toàn vẹn của các constraint phát hiện có vi phạm tính toàn vẹn
dữ liệu), các hành động của trigger INSTEAD OF sẽ được quay lui, trigger AFTER không thi
hành nếu các constraint bị vi phạm hoặc nếu có một số biến cố khác làm cho việc sửa đổi dữ
liệu trên table bị lỗi.
Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaSV Mã sinh viên
HoTen Họ tên sinh viên
NgaySinh Ngày sinh
GioiTinh Giới tính
MaLop Mã lớp
MaTinh Mã tỉnh
DTB Điểm trung bình
Yêu cầu:
Bài số 1: Tạo một Trigger để kiểm tra tính hợp lệ của dữ liệu được nhập vào bảng SINHVIEN
sao cho MaSV là không rỗng.
Bài số 2: Thực hiện việc kiểm tra rằng buộc khoá ngoại trong bảng SINHVIEN là mã lớp phải
tồn tại trong bảng DMLOP.
Bài số 3: Tạo một Trigger khi thêm một sinh viên trong bảng SINHVIEN ở một lớp nào đó thì
cột Siso của lớp đó trong bảng DMLOP tự động tăng lên 1, đảm bảo tính toàn vẹn dữ liệu khi
thêm một sinh viên mới trong bảng SINHVIEN thì sinh viên đó phải có mã tỉnh trong bảng
DMTINH. Đảm bảo tính toàn vẹn dữ liệu khi thêm là mã lớp phải có trong bảng DMLOP.
Bài số 4: Tạo một Trigger không cho phép xoá các sinh viên ở lớp có mã là CT12.
Bài số 5: Tạo một Trigger không cho phép xoá nhiều hơn 2 tỉnh trong bảng DMTINH.
Bài số 6: Tạo một Trigger sao cho khi xóa một sinh viên mới từ bảng SINHVIEN thì SiSo của
lớp tương ứng trong bảng DMLOP tự động giảm xuống 1.
Bài số 7: Tạo một Trigger kiểm tra điều kiện cho cột Điểm trung bình là <=10.
Bài số 8: Tạo Trigger bẫy lỗi cho khoá ngoại của bảng SINHVIEN khi chỉnh sửa.
Bài số 9: Tạo Trigger sao cho khi cập nhật MaLop một sinh viên trong bảng SINHVIEN thì
SiSo của lớp tương ứng trong bảng DMLOP tự động thay đổi.
Bài số 10: Hãy tạo ra Trigger sao cho khi sửa MaLop những sinh viên trong bảng SINHVIEN
thì SiSo của lớp tương ứng trong bảng DMLOP tự động thay đổi.
CHƯƠNG 5. KIỂU DỮ LIỆU CON TRỎ (CURSOR)
Nội dung chính của chương trình bày những khái niệm cơ bản cũng như các ví dụ thực tiễn về
dữ liệu con trỏ trong quản trị cơ sở với hệ quản trị CSDL SQL Server. Các vấn đề chính sẽ được
đề cập:
- Khái niệm cơ bản về Cursor
- Quá trình thực hiện của Cursor
- Các loại Cursor
- Sử dụng Cursor
Bài 8: Kiểu dữ liệu con trỏ (Cursor) (Số tiết: 3 tiết)
5.1 Khái niệm cơ bản về Cursor
Khi sử dụng câu lệnh SELECT để truy vấn dữ liệu thì kết quả của câu lệnh sẽ trả về dưới
dạng bảng tuy nhiên nếu muốn truy xuất từng giá trị trong một dòng dữ liệu thì các câu lệnh
SELECT trong SQL server không thực hiện được, điều này được giải quyết bằng cách sử dụng
kiểu dữ liệu con trỏ.
Con trỏ(Cursor) là một đối tượng của cơ sở dữ liệu được sử dụng để truy xuất dữ liệu theo
từng bản ghi. Tập hợp những bản ghi dữ liệu được biến kiểu trỏ tham chiếu đến được xác định
bởi câu lệnh SELECT
5.2 Các bước thực hiện một Cursor
Khi thao tác với kiểu dữ liệu Cursor ta thực hiện theo 5 bước sau:
- Khai báo Cursor
- Mở Cursor
- Xử lý dữ liệu trên Cursor
- Đóng Cursor
- Hủy bỏ Cursor
5.2.1 Khai báo Cursor
DECLARE Tên_Cursor CURSOR
[ LOCAL | GLOBAL]
[ FORWARD_ONLY | SCROLL]
[ STATIC | KEYSET | DYNAMIC]
[READ_ONLY]
FOR
<Câu _lệnh_truy_vấn>
Giải thích:
- Tên_cursor: Là tên của biến Con trỏ
- Từ khóa LOCAL | GLOBAL: Xác định phạm vi hoạt động của Con trỏ
- Nếu khai báo LOCAL (mặc định), con trỏ chỉ có hiệu lực trong bó lệnh có khai báo nó.
- Nếu khai báo GLOBAL, con trỏ đó sẽ có phạm vi ảnh hưởng đến toàn bộ hoạt động của một
kết nối.
- Từ khóa FORWARD_ONLY | SCROLL: Dùng để điều khiển việc dịch chuyển trỏ bản ghi
- FORWARD_ONLY chỉ cho phép di chuyển trỏ bản ghi theo chiều tiến.
- SCROLL: cho phép di chuyển trỏ bản ghi theo cả hai chiều là tiến hoặc lùi. (Forward_only
là mặc định nếu không chỉ rõ STATIC | KEYSET | DYNAMIC khi khai báo kiểu Cursor.
Ngược lại khi khai báo có chỉ rõ STATIC | KEYSET | DYNAMIC thì mặc định là SCROLL)
- Từ khóa STATIC | KEYSET | DYNAMIC: Dùng để phân loại Cursor.
- STATIC (kiểu trỏ tĩnh): Dùng chỉ định dữ liệu đọc bên trong con trỏ là tĩnh. Khi đó nếu những
người dùng khác có các thay đổi ở bên dưới dữ liệu gốc (base table) thì các thay đổi đó sẽ
không được cập nhật tự động trong dữ liệu của cursor. Bởi vì khi đó dữ liệu trong cursor chính
là dữ liệu của một bảng tạm đã được hệ thống sao chép và lưu trữ trong cơ sở dữ liệu tempdb
của hệ thống khi địng nghĩa cursor.
- DYNAMIC (Cursor động): dùng chỉ định dữ liệu bên trong cursor là động. Khi đó việc cập
nhật dữ liệu trong bảng cơ sở (base table) bởi những người dùng khác sẽ được cập nhật tự
động trong dữ liệu cursor có kiểu là DYNAMIC.
- KEYSET: có hoạt động gần giống với kiểu DYNAMIC nếu bảng dữ liệu cơ sở có ít nhất một
cột thỏa mãn ràng buộc UNIQUE, khi đó các thay đổi dữ liệu trên các cột không là khóa chính
trong bảng cơ sở bởi những người dùng khác sẽ được cập nhật trong dữ liệu cursor. Tuy nhiên
đối với các mẫu tin vừa thêm mới hoặc các mẫu tin đã bị hủy bỏ bởi những người dùng khác
sẽ không được hiển thị trong dữ liệu cursor có kiểu là KEYSET.
- KEYSET: Có hoạt động giống STATIC nếu bảng dữ liệu cơ sở không có ràng buộc UNIQUE
- Từ khóa READ_ONLY: Dùng chỉ định dữ liệu bên trong cursor là chỉ đọc nhằm hạn chế việc
sửa đổi dữ liệu bên trong cursor. Khi khai báo cursor với kiểu dữ liệu là tĩnh (STATIC) thì
dữ liệu trong cursor xem như là chỉ đọc.
- Câu _lệnh_truy_vấn: Là câu lệnh SELECT dùng để xác định tập hợp các bảng ghi dữ liệu
mà biến kiểu trỏ tham chiếu tới. Câu lệnh SELECT trong cursor không thể chứa các mệnh
đề: INTO, COMPUTE, COMPUTE BY.
Ví dụ 5.1: Để định nghĩa một biến cursor chứa toàn bộ các dòng dữ liệu bên trong bảng HANG,
các dòng dữ liệu trong cursor cho phép được cập nhật. Ta sử dụng lệnh khai báo biến cursor như
sau:
USE QL_BanHang
Go
DECLARE TRO_Hang CURSOR DYNAMIC
FOR
SELECT *
FROM Hang
Ví dụ 5.2: Để định nghĩa một biến cursor chứa toàn bộ các dòng dữ liệu bên trong bảng Khach,
các dữ liệu trong cursor chỉ được phép đọc và việc đọc dữ liệu trong cursor chỉ theo một chiều
tiến. Ta sử dụng lệnh khai báo biến cursor như sau:
USE QL_BanHang
Go
DECLARE TRO_Khach CURSOR FORWARD_ONLY STATIC READ_ONLY
FOR
SELECT *
FROM Khach
Nhận xét: ở ví dụ trên, ta có thể bỏ đi từ khóa READ_ONLY bởi vì bản thân từ khóa STATIC
đã định nghĩa dữ liệu của cursor là chỉ đọc.
5.2.2 Mở Cursor
Để có thể đọc được các dòng dữ liệu bên trong cursor trước tiên chúng ta cần phải mở
cursor ra bằng lệnh OPEN. Hoạt động bên trong của lệnh này thực ra là hệ thống sẽ thực hiện
câu lệnh truy vấn SELECT đã được chỉ định trong lệnh định nghĩa biến cursor trước đó.
Trong trường hợp nếu ta định nghĩa sử dụng cursor với kiểu STATIC hoặc KEYSET thì
hệ thống sẽ tạo ra bảng tạm chứa các dữ liệu kết quả của lệnh SELECT nằm trong cơ sở dữ liệu
tempdb. Cú pháp lệnh OPEN như sau:
OPEN <Tên_cursor>
Tên_cursor: tên của biến kiểu cursor đã định nghĩa trước đó bằng lệnh DECLARE.
Ví dụ 5.3: Mở các con trỏ đã tạo trong ví dụ 5.1
OPEN TRO_Hang
5.2.3 Xử lý dữ liệu
Sau khi mở Cursor ta cần sử dụng lệnh FETCH để đọc và xử lý các dòng dữ liệu bên trong
Cursor, cú pháp lệnh FETCH như sau:
FETCH [Next | Prior | First | Last|Relative <n>|Absolute <n>]
FROM <Tên_Cursor>
[INTO <Danh_sách_biến>]
Giải thích:
- NEXT: Di chuyển trỏ bản ghi về bản ghi kế tiếp.
- PRIOR: Di chuyển trỏ bản ghi về bảng ghi kế trước.
- FIRST: Di chuyển trỏ bản ghi về bản ghi đầu tiên.
- LAST: Di chuyển trỏ bản ghi về bản ghi cuối cùng.
- Relative <n>: Di chuyển trỏ bản ghi đến bản ghi thứ n tính từ bản ghi hiện hành, Nếu
n là số nguyên dương, di chuyển theo chiều tiến, ngược lại n là số nguyên âm di chuyển
theo chiều lùi.
- Absolute <n>: Di chuyển trỏ bản ghi đến bản ghi thứ n tính từ bản ghi đầu tiên nếu n
là số nguyên dương, ngược lại di chuyển trỏ bản ghi đến bản ghi thứ n nếu n là số
nguyên âm.
- Tên_Cursor: tên của biến kiểu cursor đã được định nghĩa trước đó bằng lệnh
DECLARE.
Danh_sách_biến: danh sách tên các biến cục bộ đã được định nghĩa trước đó. Các biến này
sẽ lưu trữ các giá trị dữ liệu được đọc từ lệnh FETCH.
Hình 5.1 : các bước đọc lệnh FETCH
Ghi Chú: FETCH ABSOLUTE không thể sử dụng với DYNAMIC CURSOR
Ví dụ 5.4: Khai báo Cursor, mở và đưa dữ liệu của bản ghi đầu tiên vào biến
USE QL_BanHang
Go
DECLARE @MaH char(10), @TenH char(50),@DVT char(6), @SL INT
DECLARE TRO_Hang CURSOR DYNAMIC
FOR
SELECT MaH, TenH, DVT, SoLuong
FROM Hang
Open TRO_Hang
FETCH First FROM TRO_Hang
INTO @MaH , @TenH ,@DVT , @SL
Go
5.2.4 Đóng Cursor
Lệnh CLOSE chỉ là thực hiện hành động giải phóng các dòng dữ liệu tham chiếu bên trong
biến cursor, chúng ta có thể mở lại cursor mà không cần thiết phải định nghĩa lại biến cursor
bằng lệnh DECLARE, cú pháp của lệnh CLOSE như sau:
CLOSE <Tên_cursor>
5.2.5 Giải phóng Cursor
Lệnh DEALLOCATE để giải phóng thật sự biến cursor ra khỏi bộ nhớ. Sau khi thực hiện
lệnh này, nếu có lệnh nào tham chiếu đến tên cursor đều sẽ gây ra lỗi. Lệnh DEALLOCATE có
cú pháp sau:
DEALLOCATE <Tên_cursor>
CÂU HỎI ÔN TẬP
Câu 1: Hãy nêu khái niệm con trỏ?
Câu 2: Các bước thực hiện con trỏ?
Câu 3: Để xử lý dữ liệu trong con trỏ dùng câu lệnh như thế nào?
Bài 9: Kiểu dữ liệu con trỏ (cursor) (tiếp) (3 tiết)
5.3 Kiểm tra trạng thái Cursor
Trong quá trình dịch chuyển biến kiểu trỏ để kiểm tra việc di chuyển có thành công hay
không ta sử dụng hàm @@Fetch_Status, hàm này có thể trả về một trong các giá trị sau:
0: lấy mẩu tin thành công
1: lấy mẩu tin thất bại (Do cursor đang ở BOF hoặc EOF)
2: lấy mẩu tin thất bại, với lý do bản ghi dữ liệu không tồn tại.
Ví dụ 5.5: Sử dụng kiểu dữ liệu CURSOR để đưa ra màn hình danh sách các mặt hàng
USE QL_BanHang
Go
DECLARE TRO_Hang CURSOR DYNAMIC
FOR
SELECT *
FROM Hang
Open TRO_Hang
FETCH First FROM TRO_Hang
WHILE @@Fetch_status=0
FETCH Next FROM TRO_Hang
CLOSE TRO_Hang
DEALLOCATE TRO_Hang
Ví dụ 5.6:
- Thêm vào Table HoaDon cột TongTien có kiểu dữ liệu Money
ALTER TABLE HoaDon
ADD TongTien Money
- Sử dụng kiểu dữ liệu CURSOR để cập nhật dữ liệu vào cột TongTien cho mỗi hóa
đơn mua hàng
USE QL_BanHang
Go
DECLARE @SoHD Char(10), @TongTien Money
DECLARE TRO_Tinh_Tien CURSOR DYNAMIC
FOR
SELECT SoHD
FROM HoaDon
Open TRO_Tinh_Tien
FETCH First FROM TRO_Tinh_Tien
INTO @SoHD
WHILE @@Fetch_status=0
BEGIN
SELECT @TongTien=Sum(DonGia*SoLuong)
FROM ChiTietHoaDon
WHERE SoHD=@SoHD
UPDATE HoaDon
SET TongTien=@TongTien
WHERE SoHD=@SoHD
FETCH Next FROM TRO_Tinh_Tien
INTO @SoHD
END
CLOSE TRO_Tinh_Tien
DEALLOCATE TRO_Tinh_Tien
Go
5.4 Thay đổi dữ liệu tại vị trí Cursor
Sử dụng các phát biểu Update hay Delete để cập nhật hoặc xóa mẩu tin tại vị trí Cursor
đang sử dụng với mệnh đề WHERE CURRENT OF <Tên Cursor>. Cập nhật dữ liệu thông qua
cursor: thực chất là dữ liệu được hiệu chỉnh trực tiếp vào trong bảng
Cập nhật giá trị cho cột:
UPDATE <Tên_Table>
SET <Tên_cột>= <Value> [,..n]
WHERE CURRENT OF <Tên_cursor>
Xoá dữ liệu thông qua cursor: Thực sự là dữ liệu xóa trên bảng
DELETE < Tên_Table >
WHERE CURRENT OF < Tên_cursor >
Ví dụ 5.7: Sử dụng kiểu dữ liệu CURSOR để cập nhật dữ liệu vào cột TongTien cho mỗi
hóa đơn mua hàng
USE QL_BanHang
Go
DECLARE @SoHD Char(10), @TongTien Money
DECLARE TRO_Tinh_Tien CURSOR DYNAMIC
FOR
SELECT SoHD
FROM HoaDon
Open TRO_Tinh_Tien
FETCH First FROM TRO_Tinh_Tien
INTO @SoHD
WHILE @@Fetch_status=0
BEGIN
SELECT @TongTien=Sum(DonGia*SoLuong)
FROM ChiTietHoaDon
WHERE SoHD=@SoHD
UPDATE HoaDon
SET TongTien=@TongTien
WHERE CURRENT OF TRO_Tinh_Tien
FETCH Next FROM TRO_Tinh_Tien
INTO @SoHD
END
CLOSE TRO_Tinh_Tien
DEALLOCATE TRO_Tinh_Tien
Go
Kiểm tra lý thuyết bài số 2
Nhìn trên hình ta thấy khi thực hiện chế độ này người sử dụng muốn khai thác SQL Server
phải thông qua 4 bước xác thực (1-Domain, 2-Computer, 3-SQL Server, 4-Database).
b) SQL Server Authentication
Khi thiết lập ở chế độ bảo mật này, những User được quyền khai thác phải là những User
do quản trị SQL Server tạo ra, mà những user của Windows không được khai thác.
Tuy nhiên, SQL Server cho phép thiết lập hai chế độ Windows Authentication Mode
(Windows Authentication) và Mixed Mode (Windows Authentication and SQL Server
Authentication), chế độ Mixed Mode là sự kết hợp của Windows Authentication và SQL Server
Authentication, ở chế độ này cả user của Windows và SQL Server để có thể thiết lập để truy
nhập SQL Server.
6.3 Quản lý người dùng
Người dùng trong SQL Server được chia thành 2 mức: Người truy nhập vào SQL Server
gọi là Login, người khai thác CSDL gọi là User.
Login Là đối tượng được quyền truy nhập vào SQL Server, tùy theo chế độ bảo mật của
SQL Server mà những login là account của Windows NT hay của SQL Server, login do Server
quản lý trực tiếp
User là đối tượng khai thác CSDL, nếu login chỉ xác định truy nhập vào SQL Server thì
User là login ID tham gia khai thác CSDL, user do CSDL quản lý trực tiếp.
6.3.1 Tạo tài khoản đăng nhập cho người dùng
Tạo tài khoản người dùng, ta dùng thủ tục với cú pháp sau
Sp_addlogin [@login=] <’Tên người dùng’>
[,@Password=] <’Mật khẩu’>]
[,@defdb=]<’Tên tệp CSDL’>]
Ví dụ 6.1: Tạo tài khoản người dùng có các tham số sau:
EXEC SP_ADDLOGIN ‘HA’, ‘HA1’, ‘QL_BanHag’
Để thay đổi mật khẩu người dùng ta dùng thủ tục với cú pháp sau:
SP_Password[@old=] <’Mật khẩu cũ>
[@New=]< ‘Mật khẩu mới’>
[@login=]< ‘Tên người dùng’>
Ví dụ 6.2: Thay đổi mật khẩu người dùng
SP_Password ‘HA1’, ‘HAI’, ‘HA’
6.3.2 Cấp phát quyền truy cập vào CSDL
Để cấp phát quyền truy cập cho người dùng vào CSDL ta sử dụng thủ tục có cú pháp sau:
SP_grantdbaccess [@login=]< ‘Tên người dùng’>
[,@Name_in_db=]< ‘Tên bí danh’>
Tham số @Name_in_db là bí danh tên của tài khoản người dùng thành một tên khác khi
truy cập vào CSDL chỉ định.
Ví dụ 6.3: Cấp phát quyền cho người dùng
SP_grantdbaccess ‘HA’, ‘HABD’
Loại bỏ quyền sử dụng
Cú pháp:
SP_revokedbaccess [@Name_in_db =]< ‘Tên bí danh’>
Ví dụ 6.4: Hủy bỏ quyền của người dùng
SP_revokedbaccess ‘HABD’
6.4 Quyền người dùng
Bảng danh sách các quyền thao tác trên các đối tượng của CSDL
SELECT Cho phép người dùng nhìn thấy dữ liệu, nếu người dùng có quyền này thì
họ chỉ có thể thực thi những phát biểu Select để truy vấn dữ liệu trên các
bảng hay View được cho phép
INSERT Cho phép người sử dụng thêm dữ liệu, nếu người sử dụng có quyền này họ
có thể thực hiện phát biểu Insert.
UPDATE Cho phép người sử dụng chỉnh sửa dữ liệu trong CSDL, với quyền Update
người sử dụng có thể cập nhật dữ liệu bằng phát biểu Update
DELETE Quyền này cho phép xóa dữ liệu trong CSDL với quyền Delete người sử
dụng có thể xóa dữ liệu bằng phát biểu Delete.
REFERENCE Cho phép người sử dụng thêm dữ liệu và bảng có khóa ngoài, nếu người
dùng có quyền này họ có thể thực hiện phát biểu INSERT, trong trường hợp
SQL Server thì quyền này không liên quan đến quyền truy vấn SELECT.
EXECUTE Quyền này cho phép người sử dụng thực thi thủ tục trong CSDL, Với quyền
này người sử dụng có thể xóa mẩu tin bằng phát biểu thực thi thủ tục
các_quyền_cấp_phát Danh sách các quyền cần cấp phát cho người dùng
trên đối tượng cơ sở dữ liệu được chỉ định. Các quyền
được phân cách nhau bởi dấu phẩy
tên_bảng | tên_khung_nhìn Tên của bảng hoặc khung nhìn cần cấp phát quyền.
danh_sách_cột Danh sách các cột của bảng hoặc khung nhìn cần cấp
phát quyền.
tên_thủ_tục Tên của thủ tục được cấp phát cho người dùng.
tên_hàm Tên hàm (do người dùng định nghĩa) được cấp phát
quyền.
danh_sách_người_dùng Danh sách tên người dùng nhận quyền được cấp phát.
Tên của các người dùng được phân cách nhau bởi dấu
phẩy.
WITH GRANT OPTION Cho phép người dùng chuyển tiếp quyền cho người
dùng khác.
Trong các quyền được đề cập đến ở trên, quyền REFERENCES được sử dụng nhằm cho
phép tạo khóa ngoài tham chiếu đến bảng cấp phát.
Ví dụ 6.5: Cấp phát cho người dùng có tên Ha quyền thực thi các câu lệnh SELECT, INSERT
và UPDATE trên bảng Hang.
GRANT SELECT, INSERT, UPDATE
ON Hang
TO thuchanh
Cho phép người dùng Ha quyền xem các thuộc tính (MaH, TenH, SoLuong)
GRANT SELECT
ON Hang (MaH, TenH, SoLuong) TO thuchanh
Với quyền được cấp phát như trên, người dùng Ha có thể thực hiện câu lệnh sau trên bảng
Hang
SELECT MaH, TenH, SoLuong
FROM Hang
Nhưng câu lệnh dưới đây lại không thể thực hiện được
SELECT * FROM Hang
Ví dụ 6.6: Câu lệnh dưới đây cấp phát cho người dùng Ha các quyền SELECT, INSERT,
UPDATE, DELETE VÀ REFERENCES trên bảng DIEMTHI
GRANT ALL ON DIEMTHI TO Ha
Khi ta cấp phát quyền nào đó cho một người dùng trên một đối tượng cơ sở dữ liệu,
người dùng đó có thể thực thi câu lệnh được cho phép trên đối tượng đã cấp phát. Tuy nhiên,
người dùng đó không có quyền cấp phát những quyền mà mình được phép cho những người
sử dụng khác.Trong một số trường hợp, khi ta cấp phát quyền cho một người dùng nào đó,
ta có thể cho phép người đó chuyển tiếp quyền cho người dùng khác bằng cách chỉ định tuỳ
chọn WITH GRANT OPTION trong câu lệnh GRANT.
Ví dụ 6.7: Cho phép người dùng Ha quyền xem dữ liệu trên bảng Hang đồng thời có thể chuyển
tiếp quyền này cho người dùng khác
GRANT SELECT
On Hang
WITH GRANT OPTION
b) Cấp phát quyền thực thi các câu lệnh
Ngoài chức năng cấp phát quyền cho người sử dụng trên các đối tượng cơ sở dữ liệu, câu
lệnh GRANT còn có thể sử dụng để cấp phát cho người sử dụng một số quyền trên hệ quản trị
cơ sở dữ liệu hoặc cơ sở dữ liệu. Những quyền có thể cấp phát trong trường hợp này bao gồm:
- Tạo cơ sở dữ liệu: CREATE DATEBASE.
- Tạo bảng: CREATE RULE
- Tạo khung nhìn: CREATE VIEW
- Tạo thủ tục lưu trữ: CREATE PROCEDURE
- Tạo hàm: CREATE FUNCTION
- Sao lưu cơ sở dữ liệu: BACKUP DATABASE
Câu lệnh GRANT sử dụng trong trường hợp này có cú pháp như sau:
GRANT ALL | danh_sách_câu_lênh
TO danh_sách_người_dùng
Ví dụ 6.8: Để cấp phát quyền tạo bảng và khung nhìn cho người dùng có tên là Ha ta sử dụng
câu lệnh như sau:
GRANT CREATE TABLE, CREATE VIEW TO Ha
Với câu lệnh GRANT, ta có thể cho phép người sử dụng tạo các đối tượng cơ sở dữ liệu
trong cơ sở dữ liệu. Đối tượng cơ sở dữ liệu do người dùng nào tạo ra sẽ do người đó sở hữu và
do đó người này có quyền cho người dùng khác sử dụng đối tượng và cũng có thể xóa bỏ (DROP)
đối tượng do mình tạo ra.
Khác với trường hợp sử dụng câu lệnh GRANT để cấp phát quyền trên đối tượng cơ sở
dữ liệu, câu lệnh GRANT trong trường hợp này không thể sử dụng tuỳ chọn WITH GRANT
OPTION, tức là người dùng không thể chuyển tiếp được các quyền thực thi các câu lệnh đã
được cấp phát.
6.4.2 Thu hồi quyền
Câu lệnh REVOKE được sử dụng để thu hồi quyền đã được cấp phát cho người dùng.
Tương ứng với câu lệnh GRANT, câu lệnh REVOKE được sử dụng trong hai trường hợp:
- Thu hồi quyền đã cấp phát cho người dùng trên các đối tượng cơ sở dữ liệu.
- Thu hồi quyền thực thi các câu lệnh trên cơ sở dữ liệu đã cấp phát cho người dùng.
a) Thu hồi quyền trên đối tượng cơ sở dữ liệu
Cú pháp câu lệnh REVOKE sử dụng để thu hồi quyền đã cấp phát trên đối tượng cơ
sở dữ liệu có cú pháp như sau:
REVOKE ALL| các_quyền_cần_thu_hồi
[(danh_sách_cột)] ON tên_bảng | tên_khung_nhìn
|ON tên_bảng | tên_khung_nhìn [(danh_sách_cột)]
|ON tên_thủ_tục
|ON tên_hàm
FROM danh_sách_người_dùng
[CASCADE]
Câu lệnh REVOKE có thể sử dụng để thu hồi một số quyền đã cấp phát cho người dùng
hoặc là thu hồi tất cả các quyền (ALL).
Ví dụ 6 . 9 : Thu hồi quyền thực thi lệnh INSERT trên bảng Hang đối với người dùng Ha
REVOKE INSERT
ON Hang
FROM Ha
Giả sử người dùng Ha đã được cấp phát quyền xem dữ liệu trên các cột MaH,
TenH, SoLuong của bảng Hang, câu lệnh dưới đây sẽ thu hồi quyền đã cấp phát trên cột
SoLuong (chỉ cho phép xem dữ liệu trên cột MaH, TenH)
REVOKE SELECT
ON sinhvien(SoLuong) FROM
Ha
Khi ta sử dụng câu lệnh REVOKE để thu hồi quyền trên một đối tượng cơ sở dữ liêu từ
một người dùng náo đó, chỉ những quyền mà ta đã cấp phát trước đó mới được thu hồi, những
quyền mà người dùng này được cho phép bởi những người dùng khác vẫn còn có hiệu lực. Nói
cách khác, nếu hai người dùng khác nhau cấp phát cùng các quyền trên cùng một đối tượng cơ
sở dữ liệu cho một người dùng khác, sau đó người thu nhất thu hồi lại quyền đã cấp phát thì
những quyền mà người dùng thứ hai cấp phát vẫn có hiệu lực.
Ví dụ 6.10: Giả sử trong cơ sở dữ liệu ta có 3 người dùng là A, B và C. A và B đều có quyền
sử dụng và cấp phát quyền trên bảng R. A thực hiện lệnh sau để cấp phát quyền xem dữ liệu
trên bảng R cho C:
GRANT SELECT
ON R TO C
và B cấp phát quyền xem và bổ sung dữ liệu trên bảng R cho C bằng câu lệnh:
GRANT SELECT, INSERT
ON R TO C
Như vậy, C có quyền xem và bổ sung dữ liệu trên bảng R. Bây giờ, nếu B thực hiện lệnh:
REVOKE SELECT, INSERT
ON R FROM C
Người dùng C sẽ không còn quyền bổ sung dữ liệu trên bảng R nhưng vẫn có thể xem
được dữ liệu của bảng này (quyền này do A cấp cho C và vẫn còn hiệu lực).
Nếu ta đã cấp phát quyền cho người dùng nào đó bằng câu lệnh GRANT với tuỳ chọn
WITH GRANT OPTION thì khi thu hồi quyền bằng câu lệnh REVOKE phải chỉ định tuỳ chọn
CASCADE. Trong trường hợp này, các quyền được chuyển tiếp cho những người dùng khác
cũng đồng thời được thu hồi.
Ví dụ 6.11: Ta cấp phát cho người dùng A trên bảng R với câu lệnh GRANT như sau:
GRANT SELECT
ON R TO A
WITH GRANT OPTION
sau đó người dùng A lại cấp phát cho người dùng B quyền xem dữ liệu trên R với câu lệnh:
GRANT SELECT
ON R TO B
Nếu muốn thu hồi quyền đã cấp phát cho người dùng A, ta sử dụng câu lệnh REVOKE
như sau:
REVOKE SELECT
ON NHANVIEN
FROM A CASCADE
Câu lệnh trên sẽ đồng thời thu hồi quyền mà A đã cấp cho B và như vậy cả A và B đều
không thể xem được dữ liệu trên bảng R.
b) Thu hồi quyền thực thi các câu lênh
Việc thu hồi quyền thực thi các câu lệnh trên cơ sở dữ liệu (CREATE DATABASE,
CREATE TABLE, CREATE VIEW,...) được thực hiện đơn giản với câu lệnh REVOKE có cú
pháp:
REVOKE ALL | các_câu_lệnh_cần_thu_hồi
FROM danh_sách_người_dùng
Ví dụ 6.12: Để không cho phép người dùng Ha thực hiện lệnh CREATE TABLE trên cơ sở
dữ liệu, ta sử dụng câu lệnh:
REVOKE CREATE TABLE FROM Ha
Bảng DMHang để lưu danh mục hàng hoá gồm các thuộc tính sau:
MaHang Mã hàng
Bảng ChiTietHoaDon để lưu chi tiết các hoá đơn bán hàng gồm các thuộc tính sau:
MaHang Mã hàng
Yêu cầu:
Bài 1: Tạo tài khoản người dùng có tên là ‘HA’ và mật khẩu là ‘HA1’
Bài 2: Thay đổi mật khẩu người dùng là ‘HAI’
Bài 3: Cấp phát cho người dùng có tên HA quyền thực thi các câu lệnh SELECT, INSERT và
UPDATE trên bảng DMHang.
Bài 4: Cho phép người dùng HA quyền xem dữ liệu trên bảng HoaDonBan đồng thời có thể
chuyển tiếp quyền này cho người dùng khác.
Bài 5: Cho phép người dùng HA quyền xem dữ liệu trên bảng DMHang đồng thời có thể
chuyển tiếp quyền này cho người dùng khác.
Bài 6: Cho phép người dùng HA quyền xem dữ liệu trên bảng DMKhach đồng thời có thể
chuyển tiếp quyền này cho người dùng khác.
Bài 7: Cho phép người dùng HA quyền xem dữ liệu trên bảng ChiTietHoaDon đồng thời có
thể chuyển tiếp quyền này cho người dùng khác.
Bài 8: Hủy bỏ quyền của người dùng HA.
Bài 9: Tạo tài khoản người dùng có tên là ‘TRANG và mật khẩu là ‘TRANG123. Cấp phát
cho người dùng có tên TRANG quyền thực thi các câu lệnh INSERT và UPDATE trên bảng
ChiTietHoaDon.
Bài 10: Hủy bỏ quyền của người dùng TRANG.
Tài liệu tham khảo
[1]. Phạm Hữu Khang, Đoàn Thiện Ngân (2007), SQL Server 2005 - Lập Trình T-SQL, NXB
Lao động xã hội.
[2]. Nguyễn Thị Tính (Chủ biên), Hồ Thị Tuyến, Hoàng Thị Cành, Lương Thị Minh Huế, Dương
Thị Quy, Nguyễn Thị Oanh (2019), Hệ quản trị cơ sở dữ liệu SQL Server, NXB Đại học Thái
Nguyên.
[3]. Phạm Hữu Khang, Đoàn Thiện Ngân (2005), SQL Server 2005 – Lập trình thủ tục và hàm,
NXB Lao động xã hội.
[4]. Bộ môn Hệ thống thống thông tin (2017), Bài tập thực hành môn Hệ quản trị cơ sở dữ liệu
SQL Server.
[5]. Dương Quang Thiện (2007), SQL Server 2000 Lập trình T-SQL, NXB Văn hoá Sài Gòn.
[6]. Nguyễn Kim Sơn, Nguyễn Thu Hương, Lê Thu Trang (2020), Giáo trình Hệ quản trị cơ sở
dữ liệu nâng cao, NXB Tài Chính.
Các câu hỏi thường gặp
1. Cơ sở dữ liệu là gì?
Câu trả lời: Một tập hợp có cấu trúc của dữ liệu được lưu trong máy tính, theo một cách đặc biệt
nào đó có thể được tiếp cận theo những cách khác nhau được gọi là cơ sở dữ liệu.
2. Một số loại cơ sở dữ liệu thường gặp?
Câu trả lời: Một số loại cơ sở dữ liệu thường được nhắc đến như: Cơ sở dữ liệu lớn, cơ sở dữ
liệu hướng tài liệu, cơ sở dữ liệu hướng đối tượng, Cơ sở dữ liệu đồ thị, cơ sở dữ liệu thời gian
thực, cơ sở dữ liệu tri thức, cơ sở dữ liệu không gian, cơ sở dữ liệu thời gian, cơ sở dữ liệu tập
trung, cơ sở dữ liệu phân tán, cơ sở dữ liệu đám mây, cơ sở dữ liệu quan hệ, cơ sở dữ liệu ngữ
nghĩa…. Với mỗi loại cơ sở dữ liệu này lại kéo theo rất nhiều các công nghệ liên quan, mục đích
sử dụng và kỹ thuật thực hiện.
3. Hệ cơ sở dữ liệu?
Câu trả lời: Hệ cơ sở dữ liệu bao gồm 2 thành phần: Cơ sở dữ liệu và Hệ quản trị CSDL quản trị
và khai thác CSDL đó. Hệ cơ sở dữ liệu tập trung vào việc tạo, duy trì và sử dụng cơ sở dữ liệu
cho các tổ chức và người dùng cuối.
Người ta gọi cơ sở dữ liệu và hệ quản trị cơ sở dữ liệu bằng một thuật ngữ chung là hệ cơ sở dữ
liệu.
4. Hệ quản trị cơ sở dữ liệu là gì?
Câu trả lời: HQT CSDL là một phần mềm cho phép tạo lập CSDL và điều khiển hoặc truy nhập
CSDL đó, đặc biệt HQT CSDL đảm bảo tính độc lập dữ liệu (là sự bất biến của các chương trình
ứng dụng đối với các thay đổi về cấu trúc lưu trữ và chiến lược truy nhập).
5. Hệ cơ sở dữ liệu có phải là Hệ quản trị CSDL không?
Câu trả lời: Không. Vì Hệ CSDL bao gồm Cơ sở dữ liệu và Hệ quản trị CSDL
6. SQL là gì?
Câu trả lời : SQL là tên viết tắt của Structured Query Language - Đây là loại ngôn ngữ truy vấn
có cấu trúc thường được sử dụng trong lập trình. SQL được thiết kế để quản lý dữ liệu được lưu
trữ trong hệ thống quản lý cơ sở dữ liệu quan hệ (RDBMS) hoặc để xử lý luồng trong hệ thống
quản lý luồng dữ liệu quan hệ (RDSMS). Vai trò chính thường là tạo, xóa hoặc sửa đổi các bảng.
SQL là một tiêu chuẩn ANSI (Viện Tiêu chuẩn Quốc gia Hoa Kỳ). Bản chất SQL không phải
ngôn ngữ lập trình nhưng tiêu chuẩn của SQL có thể mở rộng thành ngôn ngữ lập trình. Chính
vậy nên một số người vẫn thường gọi SQL là ngôn ngữ lập trình.
6. Khóa chính (Primary Key) trong Database là gì? Một bảng có được 2 khóa chính không?
Câu trả lời: Khóa chính dùng để định danh Duy nhất mỗi record trong table của cơ sở dữ liệu. Dữ
liệu (value) của field khóa chính phải có tính duy nhất. Và không chứa các giá trị Null (rỗng). Một
bảng thì có một Khóa Chính và nhiều khóa phụ.
7. Thế nào là tính toàn vẹn của dữ liệu?
Câu trả lời : Tính toàn vẹn của dữ liệu xác định độ chính xác cũng như tính nhất quán của dữ liệu
được lưu trữ trong cơ sở dữ liệu. Nó cũng xác định các ràng buộc toàn vẹn để thực thi các quy tắc
kinh doanh trên dữ liệu khi nó được nhập vào một ứng dụng hoặc cơ sở dữ liệu nào khác
8. Sự khác biệt giữa SQL và MySQL là gì?
Câu trả lời : SQL là một ngôn ngữ tiêu chuẩn để truy xuất và thao tác cơ sở dữ liệu có cấu trúc.
Ngược lại, MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ, giống như SQL Server, Oracle
hoặc IBM DB2, được sử dụng để quản lý cơ sở dữ liệu SQL.
9. Giải thích mệnh đề WITH trong SQL?
Câu trả lời : Mệnh đề WITH cung cấp cách một mối quan hệ xác định một mối quan hệ tạm thời,
mà định nghĩa của nó chỉ có sẵn cho truy vấn mà mệnh đề WITH xảy ra. SQL áp dụng các vị từ
trong mệnh đề WITH sau khi các nhóm (cluster) đã được hình thành, nhờ đó các hàm tổng hợp
có thể được sử dụng
10. SQL có hỗ trợ các tính năng của ngôn ngữ lập trình không?
QL đề cập đến Ngôn ngữ truy vấn tiêu chuẩn. Do đó, SQL là một ngôn ngữ nhưng không
thực sự hỗ trợ ngôn ngữ lập trình. Đó là một ngôn ngữ phổ biến không có vòng lặp, câu lệnh
điều kiện và phép toán logic.
SQL không thể được sử dụng cho bất cứ điều gì khác ngoài thao tác dữ liệu. Nó là một ngôn
ngữ lệnh để thực hiện các hoạt động cơ sở dữ liệu. Mục đích chính của SQL là truy xuất,
thao tác, cập nhật, xóa và thực hiện các thao tác phức tạp như nối trên dữ liệu có trong
database.
1. MỤC TIÊU:
- Nắm được khái niệm, mục đích, ưu nhược điểm và ý nghĩa của việc sử dụng View.
- Biết cách tạo và sử dụng View.
- Thực hành tạo, sửa, xóa, cập nhật dữ liệu cho các đối tượng như: CSDL, bảng, View.
2. YÊU CẦU:
+ Yêu cầu về điều kiện thực hành: Máy tính cài đặt phần mềm SQL Server phiên bản 2005
trở lên.
+ Yêu cầu sinh viên: Nắm được cú pháp tạo CSDL, tạo bảng, View để giải quyết các yêu
cầu trong các bài thực hành cơ bản và nâng cao.
Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
MaLop Mã lớp
MaTinh Mã tỉnh
Yêu cầu:
1/Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ)?
2/ Tạo bảng ảo để tổng hợp danh sách sinh viên học lớp có tên là ‘CNTT K14G’?
Hướng dẫn
1/
CREATE DATABASE QLSV
CREATE TABLE LOP(
MAL NVARCHAR(10) PRIMARY KEY,
TENL NVARCHAR(20))
CREATE TABLE TINH(
MAT NVARCHAR(10) PRIMARY KEY,
TENT NVARCHAR(20))
CREATE TABLE SINHVIEN(
MASV NVARCHAR(10) PRIMARY KEY,
HOTEN NVARCHAR(30),
NGAYS SMALLDATETIME,
GIOITINH CHAR(4),
MAL NVARCHAR(10),
MAT NVARCHAR(10),
DTB FLOAT,
CONSTRAINT KN1 FOREIGN KEY(MAL) REFERENCES LOP(MAL),
CONSTRAINT KN2 FOREIGN KEY(MAT) REFERENCES TINH(MAT))
2/
USE QLSV
CREATE VIEW DSSV AS
SELECT MASV, HOTEN
FROM SINHVIEN, LOP
WHERE SINHVIEN.MAL = LOP.MAL AND
TENL= ‘CNTT K14G’
Bài 1: Cho cơ sở dữ liệu quản lý bán hàng gồm các bảng dữ liệu sau:
+ Bảng DMKhach để lưu danh sách các khách hàng gồm các thuộc tính sau:
MaHang Mã hàng
+ Bảng ChiTietHoaDon để lưu chi tiết các hoá đơn bán hàng gồm các thuộc tính sau:
MaHang Mã hàng
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sinh viên phải định nghĩa đầy đủ).
2/ Tạo view tổng hợp thông tin về các khách hàng đã mua hàng của cửa hàng.
3/ Tạo view tổng hợp thông tin về khách hàng có địa chỉ ở Thái Nguyên và từng mua hàng tại
cửa hàng.
4/ Tạo view tổng hợp thông tin về các mặt hàng được sản xuất tại Thái Nguyên hoặc Cao Bằng.
5/ Tạo view tổng hợp thông tin về các khách hàng đã từng mua các mặt hàng được sản xuất tại
Thái Nguyên.
6/ Tạo view tổng hợp thông tin về các mặt hàng đã được bán trong ngày 01/04/2014.
7/ Tạo view tổng hợp thông tin về các khách hàng đã mua hàng trong ngày 01/05/2014.
8/ Tạo view tổng hợp thông tin về các hóa đơn bán hàng trong tháng 9 năm 2014.
9/ Tạo view tổng hợp thông tin về các khách hàng đã mua hàng trong tháng 1 năm 2015.
10/ Tạo view tổng hợp thông tin về các mặt hàng không bán được trong tháng 2 năm 2015.
Bài 2: Cho cơ sở dữ liệu quản lý nhà cho thuê bao gồm các bảng dữ liệu sau:
+ Bảng KHACH để lưu danh sách các khách hàng gồm các thuộc tính sau:
+ Bảng NHA để lưu trữ thông tin về các ngôi nhà cho thuê, gồm các thuộc tính sau:
+Bảng HOPDONG để lưu thông tin về các hợp đồng thuê nhà của khách, gồm:
MaN Mã nhà
MaK Mã khách
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo View để tổng hợp thông tin về những ngôi nhà có giá thuê cao nhất.
3/ Tạo View để tổng hợp thông tin về các khách hàng ngày hôm nay đã hết hạn hợp đồng.
4/ Tạo View để tổng hợp thông tin về các ngôi nhà chưa từng được ai thuê.
Bài 3: Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
MaLop Mã lớp
MaTinh Mã tỉnh
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo View để tổng hợp thông tin về các sinh viên có điểm trung bình cao nhất.
3/ Tạo View để tổng hợp thông tin về các sinh viên có điểm trung bình cao nhất theo từng lớp
học.
3.3. Bài thực hành nâng cao
1/ Tạo view tổng hợp thông tin về các khách hàng ở Thái Nguyên không mua hàng trong tháng
3 năm 2014.
2/ Tạo view tổng hợp thông tin về các khách hàng ở Thái Nguyên chưa từng mua các mặt hàng
mà khách hàng ở Hà Nội đã mua.
3/ Tạo view tổng hợp thông tin về các mặt hàng đã bán được cho cả khách hàng ở Hà Nội và
khách hàng ở Lạng Sơn.
4/ Tạo view tổng hợp thông tin về các mặt hàng mới chỉ bán cho khách hàng ở Hà Nội.
5/ Tạo view tổng hợp thông tin về các khách hàng đã từng mua các mặt hàng được sản xuất tại
quê của họ.
6/ Tạo view tổng hợp thông tin về các khách hàng mới chỉ mua các mặt hàng sản xuất tại quê
của họ.
7/ Tạo view tổng hợp thông tin về các mặt hàng đã bán được cho khách hàng Thái Nguyên trong
ngày hôm nay.
8/ Tạo view tổng hợp thông tin về các khách hàng ở Cao Bằng đã mua hàng trong ngày hôm
qua.
9/ Tạo view tổng hợp thông tin về các mặt hàng mà khách hàng ở Hà Nội chưa từng mua.
Bài thực hành số 2 (số tiết: 5 tiết)
1. MỤC TIÊU:
- Nắm được khái niệm, mục đích, ý nghĩa của việc sử dụng thủ tục.
- Nắm được kiến thức cơ bản về thủ tục, ưu điểm của thủ tục, cách tạo và thực thi thủ tục.
- Thực hành tạo các đối tượng như: CSDL, bảng, thủ tục.
2. YÊU CẦU:
+ Yêu cầu về điều kiện thực hành: Máy tính cài đặt phần mềm SQL Server phiên bản 2005
trở lên.
+ Yêu cầu sinh viên: Nắm được cú pháp tạo CSDL, tạo bảng, tạo thủ tục để giải quyết các
yêu cầu trong các bài thực hành cơ bản và nâng cao.
3. NỘI DUNG BÀI THỰC HÀNH:
3.1. Bài thực hành mẫu
Cho cơ sở dữ liệu quản lý thực tập gồm 3 bảng dữ liệu sau:
+ Bảng SINHVIEN chứa danh sách sinh viên bao gồm các thuộc tính sau:
NS Ngày sinh
+ Bảng DETAI chứa danh sách các đề tài thực tập gồm các thuộc tính sau:
+ Bảng SV_DETAI chứa thông tin về tình hình thực tập của sinh viên theo các đề tài, gồm các
thuộc tính sau:
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Hãy tạo thủ tục có tham số đầu vào là @NTT để tổng hợp thông tin về các sinh viên tham gia
các đề tài triển khai tại Nơi thực tập trên. Thực thi thủ tục để biết thông tin và các sinh viên tham
gia các đề tài triển khai ở Hà Nội.
Hướng dẫn
1/
CREATE DATABASE THUCTAP
GO
USE THUCTAP
CREATE TABLE SINHVIEN
(
MASV VARCHAR(10) PRIMARY KEY,
HOTEN VARCHAR(30),
NS SMALLDATETIME,
DIACHI VARCHAR(30)
)
CREATE TABLE DETAI
(
MADT VARCHAR(10) PRIMARY KEY,
TENDT VARCHAR(30),
GVHD VARCHAR(30)
)
CREATE TABLE SV_DETAI
(
MADT VARCHAR(10),
MASV VARCHAR(10),
NTT VARCHAR(30),
KQ INT,
CONSTRAINT KC PRIMARY KEY (MADT, MASV),
CONSTRAINT KN1 FOREIGN KEY (MASV) REFERENCES
SINHVIEN(MASV),
CONSTRAINT KN2 FOREIGN KEY (MADT) REFERENCES DETAI(MADT)
)
2/
USE THUCTAP
CREATE PROC SVTT
@NTT CHAR(30)
AS
SELECT SINHVIEN.*
FROM DETAI,SV_DETAI,SINHVIEN
WHERE SINHVIEN.MASV=SV_DETAI.MASV AND
DETAI.MADT=SV_DETAI.MADT AND
NTT=@NTT
EXEC SVTT 'HA NOI'
3.2. Bài thực hành cơ bản
Bài 1: Cho cơ sở dữ liệu Quản lý Thư viện gồm các bảng dữ liệu sau:
+Bảng SACH chứa danh mục sách gồm các thông tin thuộc tính sau:
MaSach Mã sách
+Bảng DOCGIA chứa danh sách độc giả gồm các thuộc tính sau:
+Bảng MUON_TRA chứa thông tin về sự mượn và trả sách của độc giả gồm các thuộc tính:
MaSach Mã sách
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số là @MaDG để đưa ra danh mục sách mà độc giả trên đang mượn.
3/ Tạo thủ tục có tham số là @NgayMuon để đưa ra danh sách các độc giả đã mượn sách vào
ngày trên.
4/ Tạo thủ tục để đưa ra danh sách các độc giả có hẹn trả sách trong ngày hôm nay.
5/ Tạo thủ tục có tham số là @MaSach để đưa ra thông tin về quyển sách trên. Sử dụng thủ tục
trên để đưa ra thông tin về cuốn sách có MaSach là ‘MS05’.
6/ Tạo thủ tục để đưa ra thông tin về các cuốn sách chưa từng được mượn.
7/ Tạo thủ tục có tham số là @NXB và @NGAYM để tổng hợp thông tin về các cuốn sách của
Nhà xuất bản đó đã được cho mượn vào ngày nêu trên.
8/ Tạo thủ tục có tham số là @NXB và @DONVI để tổng hợp thông tin về độc giả thuộc đơn vị
nêu trên đã mượn sách của Nhà xuất bản trên.
9/ Tạo thủ tục có tham số là @DONVI để đưa ra danh sách các độc giả thuộc đơn vị trên đã
mượn sách của thư viện.
10/ Xóa thủ tục đã tạo ở ý 9.
Bài 2: Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
Tên Thuộc tính Giải thích
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
MaLop Mã lớp
MaTinh Mã tỉnh
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục để đưa ra sĩ số sinh viên cho từng lớp học (Danh sách đưa ra phải có các thuộc
tính sau: MaLop, TenLop, SiSo).
3/ Tạo thủ tục có tham số là @Tenlop để xoá thông tin về những sinh viên học ở lớp trên.
Bài 3: Cho cơ sở dữ liệu quản lý gồm các bảng dữ liệu sau:
+ Bảng TOCONGDOAN để lưu thông tin về các chi đoàn gồm các thuộc tính sau:
+ Bảng KHENTHUONG để lưu thông tin về tình hình khen thưởng của các công đoàn viên
gồm các thuộc tính sau:
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số vào @TenTCD để đưa ra thông tin về những đoàn viên của chi đoàn
trên.
3/ Tạo thủ tục có tham số vào @TenTCD, @Nam để đưa ra thông tin về những công đoàn viên
của tổ công đoàn đã được khen thưởng vào năm trên.
3.3. Bài thực hành nâng cao
Cho cơ sở dữ liệu Quản lý Thư viện gồm các bảng dữ liệu như trên.
Yêu cầu:
1/ Tạo thủ tục có tham số là @NXB để tổng hợp thông tin về các độc giả đang mượn những
cuốn sách của Nhà xuất bản trên.
2/ Tạo thủ tục có tham số là @DONVI để tổng hợp thông tin về những độc giả thuộc đơn vị trên
đang mượn sách quá hạn.
3/ Tạo thủ tục có tham số là @NXB và @DONVI để tổng hợp thông tin về các độc giả thuộc
đơn vị đó chưa mượn sách của Nhà xuất bản trên.
4/ Tạo thủ tục có tham số là @NXB và @DONVI để tổng hợp thông tin về các cuốn sách của
Nhà xuất bản đó đã được độc giả thuộc đơn vị trên mượn trong ngày hôm nay.
5/ Tạo thủ tục có tham số là @NXB để đưa ra thông tin về các độc giả đã mượn sách của Nhà
xuất bản trên. Sử dụng thủ tục để đưa ra danh sách các độc giả đã mượn sách của Nhà xuất bản
Giáo dục.
6/ Tạo thủ tục có tham số là @MaSach để tổng hợp thông tin về những độc giả đã mượn cuốn
sách trên.
7/ Tạo thủ tục có tham số là @NXB và @DONVI để tổng hợp thông tin về các độc giả thuộc
đơn vị đó đã mượn sách của Nhà xuất bản trên trong ngày hôm nay.
8/ Tạo thủ tục có tham số là @DONVI để đưa ra danh sách các độc giả thuộc đơn vị trên đã
mượn sách của thư viện trong tháng 1/2015.
9/ Tạo thủ tục có tham số là @DONVI để đưa ra danh sách các độc giả thuộc đơn vị trên không
mượn sách của thư viện trong tháng 2 năm 2015.
10/ Tạo thủ tục có tham số là @NXB và @NGAYM để tổng hợp thông tin về các cuốn sách của
Nhà xuất bản đó không được mượn vào ngày trên.
Bài thực hành số 3 (Số tiết: 5 tiết)
1. Mục tiêu
- Nắm được khái niệm, mục đích, ý nghĩa của việc sử dụng thủ tục, Trigger.
- Nắm được kiến thức cơ bản về thủ tục, Trigger, ưu điểm của thủ tục, cách tạo và thực thi thủ
tục, nắm được cơ chế hoạt động của Trigger.
- Thực hành tạo các đối tượng như: CSDL, bảng, thủ tục, Trigger.
2. Yêu cầu của bài thực hành
+ Yêu cầu về điều kiện thực hành: Máy tính cài đặt phần mềm SQL Server phiên bản 2014
trở lên.
+ Yêu cầu sinh viên: Nắm được cú pháp tạo CSDL, tạo bảng, thủ tục, Trigger để giải quyết
các yêu cầu trong các bài thực hành cơ bản và nâng cao.
3. Nội dung thực hành
3.1 Bài tập thực hành mẫu
Cho cơ sở dữ liệu quản lý điểm gồm 3 bảng dữ liệu sau:
+ Bảng SINHVIEN chứa danh sách sinh viên bao gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaSV Mã số sinh viên
HotenSV Họ tên sinh viên
NS Ngày sinh
Diachi Địa chỉ
+ Bảng MON chứa danh sách các môn học gồm các thuộc tính sau:
+ Bảng DIEM chứa thông tin về điểm của sinh viên theo các môn học gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaM Mã môn
MaSV Mã số sinh viên
Phach Số phách
DIEM Điểm thi
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số đầo vào @TenM để đưa ra danh sách các sinh viên có điểm thi chưa
đạt của môn học trên.
3/ Tạo Trigger để kiểm tra việc nhập dữ liệu cho bảng DIEM. Nếu điểm nhỏ hơn 0 hoặc điểm
lớn hơn 10 thì in ra thông báo dữ liệu không hợp lệ và bản ghi không được phép nhập vào bảng.
Ngược lại thì in ra thông báo dữ liệu nhập thành công.
Bài làm:
1/
CREATE DATABASE QLDIEM
GO
USE QLDIEM
CREATE TABLE SINHVIEN(
MASV CHAR(10) PRIMARY KEY,
HOTENSV CHAR(40) NOTNULL,
NS DATETIME,
DIACHI CHAR(40)
)
CREATE TABLE MON (
MAM CHAR(10) PRIMARY KEY,
TENM CHAR(30) NOTNULL,
TINCHI INT
)
CREATE TABLE DIEM(
MAM CHAR(10),
MASV CHAR(10),
PHACH INT,
DIEM FLOAT,
CONSTRAINT KC_DIEM PRIMARY KEY(MAM,MASV,PHACH),
CONSTRAINT KN_DIEM FOREIGN KEY(MAM) REFERENCES MON(MAM),
CONSTRAINT KN1_DIEM FOREIGN KEY(MASV) REFERENCES
SINHVIEN(MASV)
)
2/
CREATE PROC SVTRUOT
@TENM CHAR(30)
AS
SELECT SINHVIEN.*
FROM SINHVIEN,MON,DIEM
WHERE SINHVIEN.MASV=DIEM.MASV AND
MON.MAM=DIEM.MAM AND
DIEM<4 AND
TENM=@TENM
EXEC SVTRUOT 'HQT CSDL'
3/
USE QLDIEM
CREATE TRIGGER XLNHAP ON DIEM
AFTER INSERT AS
IF EXISTS (SELECT DIEM
FROM INSERTED WHERE DIEM <0 OR DIEM >10)
BEGIN
PRINT ‘DU LIEU KHONG HOP LE’
ROLLBACK TRAN
END
ELSE PRINT ‘DA THEM 1 BAN GHI’
3.2. Bài thực hành cơ bản
Bài 1: Cho cơ sở dữ liệu quản lý điểm rèn luyện gồm các bảng sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm các thuộc tính sau:
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số vào @Masv để đưa ra thông tin về điểm rèn luyện của sinh viên trên.
3/ Tạo thủ tục có tham số vào @Malop, @Nam để đưa ra thông tin về điểm rèn luyện của lớp
trên vào năm học trên.
4/ Tạo thủ tục có tham số vào @Tenlop để đưa ra thông tin về điểm rèn luyện của lớp trên.
5/ Tạo Trigger kiểm tra việc nhập dữ liệu cho bảng DIEMRL nếu điểm nhập vào <0 hoặc >100
thì đưa ra yêu cầu nhập lại và bản ghi này không được phép nhập vào bảng, ngược lại thì in ra
thông báo nhập thành công.
Bài 2: Cho cơ sở dữ liệu gồm các bảng dữ liệu sau:
+ Bảng NhanVien để lưu thông tin về nhân viên gồm các thuộc tính sau:
+ Bảng TrinhDo_NN (trình độ ngoại ngữ) để lưu trữ thông tin về trình độ ngoại ngữ của nhân
viên:
Tên Thuộc tính Giải thích
MaNV Mã nhân viên
MaNN Mã ngoại ngữ
TrinhDo Trình độ ngoại ngữ
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số vào @TenNN và @TrinhDo để đưa ra danh các nhân viên biết ngoại
ngữ và trình độ trên.
3/ Tạo thủ tục có tham số vào @TenP để đưa ra tổng số nhân viên hiện có trong phòng này.
4/ Tạo thủ tục có tham số vào là @TenNN, @TenP và @TrinhDo để đưa ra danh các nhân viên
ở phòng này biết ngoại ngữ và trình độ ứng với các tham biến đã cho
5/ Tạo thủ tục có tham số vào @TenP để đưa ra danh các nhân viên có lương cao nhất của phòng
này.
6/ Tạo Trigger để kiểm tra khi nhập dữ liệu vào bảng NhanVien phải đảm bảo lương của nhân
viên phải >0.
3.3. Bài thực hành nâng cao
Cho cơ sở dữ liệu gồm các bảng dữ liệu sau:
+ Bảng NhanVien để lưu thông tin về nhân viên gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaNV Mã nhân viên
TenNV Tên nhân viên
DiaChi Địa chỉ
MaP Mã phòng
Luong Lương của nhân viên
+ Bảng Phong để lưu thông tin về các phòng ban trong cơ quan gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaP Mã phòng
TenP Tên phòng
DiaChiP Địa chỉ phòng
SDT Số điện thoại
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo thủ tục có tham số vào là @TenHV và @ThoiGian để đưa ra danh các nhân viên có học
vị và thời gian đạt được ứng với các tham biến đã cho.
3/ Tạo thủ tục có tham số vào là @TenHV và @ThoiGian để đưa ra danh các nhân viên có trình
độ học vị và thời gian đạt được học vị đó ứng với các tham biến đã cho.
4/ Tạo trigger để kiểm tra dữ liệu khi nhập vào bảng NV_TDHV sao cho thời gian đạt học vị đó
phải <= thời gian hiện tại.
5/ Tạo trigger để kiểm tra dữ liệu khi nhập và cập nhật vào bảng HocVi sao cho không có hai
học vị nào được trùng tên.
Bài thực hành số 4 (Số tiết: 5 tiết)
1. Mục tiêu
- Nắm được khái niệm, mục đích, ý nghĩa của việc sử dụng Trigger, Cursor.
- Biết cách tạo và quản lý Trigger, Cursor.
- Thực hành tạo các đối tượng như: CSDL, bảng, Trigger, Cursor.
2. Yêu cầu của bài thực hành
+ Yêu cầu về điều kiện thực hành: Máy tính cài đặt phần mềm SQL Server phiên bản 2014
trở lên.
+ Yêu cầu sinh viên: Nắm được cú pháp tạo CSDL, tạo bảng, Trigger, Cursor để giải quyết
các yêu cầu trong các bài thực hành cơ bản và nâng cao.
3. Nội dung thực hành
3.1 Bài tập thực hành mẫu
Cho cơ sở dữ liệu quản lý khách sạn gồm các bảng dữ liệu sau:
+ Bảng KhachHang (Khách hàng) để lưu danh mục thông tin về khách hàng tại khách sạn
gồm các trường sau:
Tên Thuộc tính Giải thích
MaKhach Mã khách
TenKhach Tên khách hàng
ĐiaChi Địa chỉ
SDT Số điện thoại
+ Bảng Phong (Phòng) để lưu thông tin về các phòng có trong khách sạn gồm các trường
sau:
Tên Thuộc tính Giải thích
MaP Mã phòng
TenP Tên phòng
LoaiP Loại phòng
Gia Đơn giá
+ Bảng DatPhong (Đặt phòng) để lưu trữ thông tin việc đặt phòng của khách:
Tên Thuộc tính Giải thích
MaKhach Mã khách
MaP Mã phòng
NgayNhan Ngày nhận phòng
NgayTra Ngày trả phòng
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sinh viên phải định nghĩa đầy đủ).
2/ Tạo Trigger để kiểm tra việc nhập dữ liệu cho bảng Phòng. Nếu giá nhập vào <0 thì thông
báo lỗi và bản ghi không được chấp nhận.
3/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách khách hàng ngày hôm nay phải trả phòng?
Bài làm:
1/
CREATE DATABASE QLKS
GO
USE QLKS
CREATE TABLE KHACHHANG(
MAK CHAR(10) PRIMARYKEY,
TENK CHAR(40) NOTNULL,
DIACHI CHAR(40),
SDT CHAR(15)
)
CREATE TABLE PHONG (
MAP CHAR(10)PRIMARYKEY,
TENP CHAR(30)NOTNULL,
LOAIP CHAR(20),
DONGIA FLOAT
)
CREATE TABLE DATPHONG(
MAK CHAR(10),
MAP CHAR(10),
NGAYNHAN SMALLDATETIME,
NGAYTRA SMALLDATETIME,
CONSTRAINT KC_DATPHONG PRIMARYKEY(MAK,MAP,NGAYNHAN),
CONSTRAINT KN_DATPHONG FOREIGNKEY(MAK)REFERENCES
KHACHHANG(MAK),
CONSTRAINT KN1_DATPHONG FOREIGNKEY(MAP)REFERENCES
PHONG(MAP)
)
2/ USE QLKS
CREATE TRIGGER KTNL ON PHONG
AFTER INSERT AS
IF (SELECT DONGIA
FROM INSERTED) <0)
BEGIN
PRINT ‘DU LIEU KHONG HOP LE’
ROLLBACK TRAN
END
ELSE PRINT ‘DA THEM 1 BAN GHI’
3/ USE QLKS
DECLARE @MaK nvarchar(20),@tenk nvarchar(50)
DECLARE @diachi nvarchar(100),@SoDt char(10)
DECLARE p CURSOR SCROLL DYNAMIC
FOR
SELECT KhachHang.*
FROM KhachHang, DatPhong
WHERE (KhachHang.MaKhach = DatPhong.MaKhach)
AND NgayTra = GETDATE()
OPEN p
FETCH FIRST FROM p INTO @MaK,@tenk,@diachi,@sodt
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @MaK + ' ' +@tenk + ' ' + @diachi + ' ' + @sodt
FETCH NEXT FROM p INTO @MaK,@tenk,@diachi,@sodt
END
CLOSE p
DEALLOCATE p
3.2. Bài thực hành cơ bản
Bài 1: Cho cơ sở dữ liệu quản lý Tài sản trong một cơ quan gồm các bảng dữ liệu sau:
+Bảng DMPhong để lưu danh sách các phòng gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaP Mã phòng
TenP Tên phòng
+ Bảng DMTaiSan để lưu trữ thông tin về các tài sản gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaTS Mã tài sản
TenTS Tên tài sản
DonVi Đơn vị tính
Gia Đơn giá
SoLuong Số lượng
+ Bảng PhanPhoi để lưu trữ thông tin về các loại tài sản có trong từng phòng gồm các thuộc
tính sau:
1/ Tạo TRIGGER để kiểm tra dữ liệu khi xóa dữ liệu ở bảng DMPhong nếu TenP là ‘TCCB’ thì
đưa ra màn hình thông báo ‘Phòng này không được xóa’ và bản ghi này không được phép xoá
khỏi cơ sở dữ liệu, ngược lại đưa ra thông báo bản ghi đã xoá thành công.
2/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng PHANPHOI, nếu SoLuong < 0 thì đưa
ra màn hình thông báo lỗi và bản ghi này không được phép nhập vào bảng dữ liệu, ngược lại đưa
ra thông báo bản ghi đã nhập thành công.
3/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng DMTaiSan nếu TenTS đã có trong bảng
thì đưa ra màn hình thông báo ‘Tài sản này đã có trong danh mục’ và bản ghi này không được
phép nhập vào bảng dữ liệu, ngược lại đưa ra thông báo bản ghi đã nhập thành công.
4/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng DMPhong nếu TenP chưa nhập thì đưa
ra màn hình thông báo lỗi là không được để trống tên phòng, ngược lại đưa ra thông báo bản ghi
đã nhập thành công.
Bài 2: Cho cơ sở dữ liệu quản lý thư viện gồm các bảng dữ liệu sau:
+ Bảng SACH chứa danh mục sách gồm các thông tin thuộc tính sau:
Tên Thuộc tính Giải thích
MaSach Mã sách
TenSach Tên sách
NXB Tên nhà xuất bản
NamXB Năm xuất bản
TenTG Tên tác giả
+Bảng DOCGIA chứa danh sách độc giả gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaDG Mã độc giả
TenDG Tên độc giả
DiaChiDG Địa chỉ độc giả
+Bảng MUON_TRA chứa thông tin về sự mượn và trả sách của độc giả gồm các thuộc tính:
Tên Thuộc tính Giải thích
MaDG Mã độc giả
MaSach Mã sách
NgayMuon Ngày mượn
SL Số lượng mượn
NgayHenTra Ngày hẹn trả
NgayTra Ngày trả
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Mỗi bảng yêu cầu nhập 5 bản ghi.
3/ Dùng kiểu dữ liệu CURSOR để đưa ra màn hình danh sách các độc giả hiện tại vẫn đang
mượn sách của thư viện.
4/ Dùng kiểu dữ liệu CURSOR để hiển thị thông tin về các độc giả hiện chưa mượn sách tại thư
viện.
5/ Dùng kiểu dữ liệu CURSOR để tổng hợp thông tin về các quyển sách hiện tại đang được
mượn.
6/ Dùng kiểu dữ liệu CURSOR để tổng hợp thông tin mượn trả của các độc giả có địa chỉ ở Thái
Nguyên.
3.3. Bài thực hành nâng cao
Bài 1: Cho cơ sở dữ liệu quản lý điểm thi gồm các bảng dữ liệu sau:
+ Bảng SinhVien để lưu danh mục thông tin về sinh viên gồm các trường sau:
+ Bảng Diem để lưu trữ thông tin về điểm thi theo từng môn học của mỗi sinh viên bao gồm các
trường sau:
2/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng DIEM nếu DiemThi >10 hoặc DiemThi
< 0 thì đưa ra màn hình thông báo lỗi và bản ghi này không được phép nhập vào bảng dữ liệu,
ngược lại đưa ra thông báo bản ghi đã nhập thành công.
3/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng MONHOC nếu SOTC < 0 hoặc SOTC
>5 thì đưa ra màn hình thông báo lỗi và bản ghi này không được phép nhập vào bảng dữ liệu,
ngược lại đưa ra thông báo bản ghi đã nhập thành công.
4/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng SINHVIEN nếu độ tuổi SINHVIEN<18
thì đưa ra màn hình thông báo lỗi và bản ghi này không được phép nhập vào bảng dữ liệu, ngược
lại đưa ra thông báo bản ghi đã nhập thành công.
5/ Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng SINHVIEN nếu Quequan nhập vào là
‘Hà Đông’ thì đưa ra màn hình thông báo lỗi và bản ghi này không được phép nhập vào bảng dữ
liệu, ngược lại đưa ra thông báo bản ghi đã nhập thành công.
+ Bảng THAMGIA ghi danh sách sinh viên đăng ký tham gia dự án
Tên Thuộc tính Giải thích
MaDA Mã dự án
MaNV Mã nhân viên
TGBD Thời gian bắt đầu
TGKT Thời gian kết thúc
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu SV phải định nghĩa đầy đủ). Mỗi bảng yêu cầu nhập 5 bản ghi.
2/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách các dự án có ngân sách > 10000 USD.
3/ Dùng kiểu dữ liệu CURSOR để cập nhật dữ liệu cho bảng DUAN đối với dự án có MaDA là
‘DA5’.
4/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách nhân viên bắt đầu thực hiện dự án ‘Phòng
chống bệnh mắt hột’ từ ngày 20/11/2015.
5/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách các dự án chưa từng có nhân viên nào tham
gia đăng ký.
6/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách các nhân viên theo từng dự án.
Bài thực hành số 5 (Số tiết: 5 tiết)
1. MỤC TIÊU:
- Nắm được kiến thức cơ bản về khái niệm cursor, ưu điểm của cursor, cách tạo Cursor.
- Biết cách tạo tài khoản người dùng, thay đổi mật khẩu, cấp phát quyền thực thi trên các đối
tượng của CSDL, và thực hiện thu hồi hoặc hủy tài khoản người dùng.
- Thực hành tạo các đối tượng như: CSDL, bảng, Cursor, quản lý bảo mật và người dùng.
2. YÊU CẦU:
- Yêu cầu về điều kiện thực hành: Phòng máy thực hành có cài đặt phần mềm SQL Server, số
lượng máy tương ứng với số sinh viên chia theo lớp thực hành.
- Yêu cầu sinh viên: Chuẩn bị bài tập, tài liệu theo yêu cầu của đề cương môn học.
Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaLop Mã lớp
MaTinh Mã tỉnh
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ)?
2/ Sử dụng kiểu dữ liệu CURSOR để đưa ra màn hình danh sách sinh viên học ở lớp có tên là
‘CNTT K12A’?
3/ Tạo tài khoản người dùng có tên là ‘HA’ và mật khẩu là ‘HA1’
4/ Thay đổi mật khẩu người dùng là ‘HAI’
5/ Cấp phát cho người dùng có tên HA quyền thực thi các câu lệnh SELECT, INSERT và
UPDATE trên bảng SINHVIEN.
1/
CREATE DATABASE QLSV
CREATE TABLE LOP(
MAL NVARCHAR(10) PRIMARY KEY,
TENL NVARCHAR(20))
CREATE TABLE TINH(
MAT NVARCHAR(10) PRIMARY KEY,
TENT NVARCHAR(20))
CREATE TABLE SINHVIEN(
MASV NVARCHAR(10) PRIMARY KEY,
HT NVARCHAR(30),
NGAYS SMALLDATETIME,
GIOITINH CHAR(4),
MAL NVARCHAR(10),
MAT NVARCHAR(10),
DTB INT,
CONSTRAINT KN1 FOREIGN KEY(MAL) REFERENCES LOP(MAL),
CONSTRAINT KN2 FOREIGN KEY(MAT) REFERENCES TINH(MAT))
2/
DECLARE SV12A CURSOR DYNAMIC
FOR
SELECT SINHVIEN.*
FROM SINHVIEN
WHERE MAL IN (SELECT MAL
FROM LOP
WHERE TENL=’CAO DANG K2A’)
OPEN SV12A
DECLARE @MASV NVARCHAR(10),@HT NVARCHAR(30), @NGAYS
SMALLDATETIME, @GIOITINH CHAR(4), @MAL NVARCHAR(10), @MAT
NVARCHAR(10), @DTB INT
FETCH FIRSTN FROM SV12A
INTO @MASV,@HT,@NGAYS,@GIOITINH,@MAL,@MAT,@DTB
WHILE @@FETCH_STATUS=0
BEGIN
PRINT 'KET QUA: MASV ‘+ @MASV
print 'TEN SV'+ @HT
print 'NGAY SINH'+ @NGAYS
print 'GIOI TINH'+ @GIOITINH
print ‘MA LOP'+ @MAL
print ‘MA TINH’+ @MAT
print ‘DTBINH’+ STR( @DTB)
FETCH NEXT FROM SV12A
INTO @MASV,@HT,@NGAYS,@GIOITINH,@MAL,@MAT,@DTB
END
CLOSE SV12A
DEALLOCATE SV12A
3/
EXEC SP_ADDLOGIN ‘HA’, ‘HA1’, ‘QLSV’
4/
exec SP_Password ‘HA1’, ‘HAI’, ‘HA’
exec sp_grantdbaccess 'HA', 'HANAME'
5/
GRANT SELECT, INSERT, UPDATE
ON SINHVIEN
TO HANAME
Cho phép người dùng Ha quyền xem các thuộc tính (MASV, HT, NGAYS, GIOITINH, MAL,
MAT, DTB)
GRANT SELECT
ON SINHVIEN (MASV, HT, NGAYS, GIOITINH, MAL, MAT, DTB) ON SINHVIEN) TO
HA
3.2. Bài thực hành cơ bản
Bài 1: Cho cơ sở dữ liệu quản lý điểm thi gồm các bảng dữ liệu sau:
+ Bảng SinhVien để lưu danh mục thông tin về sinh viên gồm các trường sau:
+ Bảng MonHoc chứa danh mục các môn học gồm các trường sau:
MaM Mã môn
+ Bảng Diem để lưu trữ thông tin về điểm thi theo từng môn học của mỗi sinh viên bao gồm các
trường sau:
MaM Mã môn
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sinh viên phải định nghĩa đầy đủ).
2/ Mỗi bảng yêu cầu nhập 5 bản ghi.
3/ Sử dụng kiểu dữ liệu Cursor để in ra màn hình danh sách điểm rèn luyện của năm học 2015-
20016.
4/ Dùng kiểu dữ liệu CURSOR để đưa ra màn hình danh sách các sinh viên có điểm thi cao nhất
của các môn học.
5/ Dùng kiểu dữ liệu CURSOR để tính điểm trung bình của các sinh viên.
6/ Dùng kiểu dữ liệu CURSOR để đưa ra trung bình điểm thi của từng môn học.
Bài 2: Cho cơ sở dữ liệu quản lý khách sạn gồm các bảng dữ liệu sau:
+ Bảng KhachHang để lưu danh mục thông tin về khách hàng tại khách sạn gồm các thuộc tính
sau:
MaP Mã phòng
+ Bảng DatPhong (Đặt phòng) để lưu trữ thông tin việc đặt thuê phòng của khách:
MaP Mã phòng
NgayNhan Ngày nhận phòng
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sinh viên phải định nghĩa đầy đủ).
MaHang Mã hàng
+ Bảng HoaDonBan để lưu danh sách các đơn hàng gồm các thuộc tính sau:
+ Bảng ChiTietHoaDon đểlưu chi tiết các hoá đơn bán hàng gồm các thuộc tính sau:
MaHang Mã hàng
Yêu cầu
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu định nghĩa đầy đủ).
2/ Tạo tài khoản người dùng có tên là ‘AN’ và mật khẩu là ‘HAAN’
3/ Thay đổi mật khẩu người dùng là ‘AN1’
4/ Cấp phát cho người dùng có tên AN quyền thực thi các câu lệnh SELECT, INSERT và
UPDATE trên bảng DMHang.
3.3. Bài thực hành nâng cao
Map Mã phòng
+ Bảng Phong để lưu thông tin về các phòng ban trong cơ quan gồm các thuộc tính sau:
MaP Mã phòng
+ Bảng TrinhDo_NN (trình độ ngoại ngữ) để lưu trữ thông tin về trình độ ngoại ngữ của nhân
viên:
Tên Thuộc tính Giải thích
Yêu cầu:
1/Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Dùng kiểu dữ liệu CURSOR để đưa ra thông tin về các nhân viên biết ngoại ngữ tiếng Anh
trình độ B2.
3/ Dùng kiểu dữ liệu CURSOR để tăng lương cho mỗi nhân viên lên 10%.
4/ Dùng kiểu dữ liệu CURSOR để đưa ra thông tin về nhân viên có lương cao nhất ở phòng “Tài
chính”.
5/ Dùng kiểu dữ liệu CURSOR để đưa ra thông tin về các nhân viên chưa tích lũy được trình độ
ngoại ngữ nào.
6/ Tạo tài khoản người dùng có tên là ‘ADMIN1’ và mật khẩu là ‘ADMIN’
7/ Cấp phát cho người dùng có tên ADMIN1 quyền thực thi các câu lệnh SELECT, INSERT và
UPDATE trên bảng NHANVIEN.
8/ Thu hồi các quyền đã cấp cho người dùng có tên ADMIN1.
Bài thực hành số 6 (số tiết: 5 tiết)
1. MỤC TIÊU:
- Hiểu được cú pháp tạo tài khoản người dùng, thay đổi mật khẩu, cấp phát quyền thực thi
trên các đối tượng của CSDL, và cú pháp thu hồi hoặc hủy tài khoản người dùng.
- Thực hành tạo các đối tượng như: CSDL, bảng, quản lý và bảo mật người dùng.
2. YÊU CẦU:
- Yêu cầu về điều kiện thực hành: Phòng máy thực hành có cài đặt phần mềm SQL Server, số
lượng máy tương ứng với số sinh viên chia theo lớp thực hành.
- Yêu cầu sinh viên: Chuẩn bị bài tập, tài liệu theo yêu cầu của đề cương môn học.
Cho cơ sở dữ liệu quản lý bán hàng gồm các bảng dữ liệu sau:
+ Bảng DMKhach để lưu các danh mục các khách hàng gồm các thuộc tính sau:
+ Bảng HoaDonBan để lưu danh sách các đơn hàng gồm các thuộc tính sau:
+ Bảng ChiTietHoaDon để lưu chi tiết các hoá đơn bán hàng gồm các thuộc tính sau:
MaHang Mã hàng
Bài 1: Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
Tên Thuộc tính Giải thích
MaLop Mã lớp học
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
MaLop Mã lớp
MaTinh Mã tỉnh
Cho cơ sở dữ liệu quản lý sinh viên bao gồm các bảng dữ liệu sau:
+ Bảng LOP để lưu thông tin về các lớp học gồm có các thuộc tính sau:
+ Bảng TINH để lưu trữ thông tin về các tỉnh thành phố, gồm các thuộc tính sau:
+Bảng SINHVIEN để lưu trữ thông tin về các sinh viên, gồm các thuộc tính sau:
MaLop Mã lớp
MaTinh Mã tỉnh
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sinh viên phải định nghĩa đầy đủ).
1. Hãy nhập dữ liệu cho các bảng dữ liệu của tệp CSDL ở trên.
3. Hãy xóa toàn bộ thông tin về các lớp không có sinh viên
4. Đưa ra thông tin về các lớp học không có sinh viên nào ở Hà Nội
1. Tạo View để tổng hợp thông tin về các sinh viên có điểm trung bình cao nhất.
2. Tạo View để tổng hợp thông tin về các sinh viên có điểm trung bình cao nhất theo từng
lớp học.
3. Tạo View để tổng hợp thông tin về các sinh viên ở Thái Nguyên
1. Tạo thủ tục có tham số là @Tenlop để xoá thông tin về những sinh viên học ở lớp trên.
2. Tạo thủ tục lưu trữ để đưa ra sĩ số sinh viên của lớp học có mã lớp là tham số đầu vào
@Malop, sĩ số sinh viên được trả lại người dùng thông qua tham số đầu ra @SS
3. Tạo thủ tục lưu trữ để xóa thông tin về các tỉnh không có sinh viên
4. Tạo thủ tục lưu trữ để nhập dữ liệu cho bảng LOP
đưa ra màn hình thông báo lỗi và bản nghi này không được phép nhập vào bảng dữ liệu, ngược
lại đưa ra thông báo bản ghi đã nhập thành công.
2. Tạo Trigger để kiểm tra việc thay đổi dữ liệu của bảng sinh viên. Đảm bảo rằng trường
DTB là không thay đổi.
3. Tạo Trigger để đưa ra thông báo dữ liệu đã thay đổi khi người dùng thực hiện thay đổi
dữ liệu cho bảng Tinh thì in ra thông báo đã thay đổi dữ liệu
4. Tạo Trigger để kiểm tra việc xóa dữ liệu cho bảng SINHVIEN, khi người dùng thực
hiện lệnh xóa thì in ra những dòng dữ liệu đã được xóa trong bảng.
1. Sử dụng kiểu dữ liệu CURSOR để đưa ra màn hình danh sách sinh viên học ở lớp có tên
là ‘CNTT K10A’
2. Sử dụng kiểu dữ liệu Cursor để đưa ra màn hình danh sách những lớp không có sinh
viên
3. Sử dụng kiểu dữ liệu Cursor để đưa ra màn hình danh sách những sinh viên thuộc tỉnh
Thái Nguyên
4. Sử dụng kiểu dữ liệu Cursor để đưa ra danh sách các tỉnh không có sinh viên.
Cho cơ sở dữ liệu quản lý thư viện gồm các bảng dữ liệu sau:
+Bảng SACH chứa danh mục sách gồm các thông tin thuộc tính sau:
MaSach Mã sách
+Bảng DOCGIA chứa danh sách độc giả gồm các thuộc tính sau:
+Bảng MUON_TRA chứa thông tin về sự mượn và trả sách của độc giả gồm các thuộc tính:
MaSach Mã sách
Yêu cầu:
1/ Hãy tạo cấu trúc cơ sở dữ liệu trên (mỗi bảng nếu có ràng buộc khoá chính hoặc ràng buộc
khoá ngoài yêu cầu sv phải định nghĩa đầy đủ).
2/ Tạo tài khoản người dùng có tên là ND01 với mật khẩu truy cập là ‘123’
3/ Cấp phát cho người dùng có tên ND01 quyền thực thi các câu lệnh SELECT, INSERT và
UPDATE trên bảng DOCGIA
4/ Cho phép người dùng ND01quyền xem dữ liệu trên bảng MUON_TRA đồng thời có thể
chuyển tiếp quyền này cho người dùng khác.