You are on page 1of 141

TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG

KHOA CÔNG NGHỆ THÔNG TIN

Ths. Đào Trần Chung


Ths. Hồ Thị Tuyến
Ths. Nguyễn Kim Sơn
Ths. Nguyễn Thu Hương
Ths. Ngô Thị Lan Phương

BÀI GIẢNG

HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

Tài liệu lưu hành nội bộ


TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN

Ths. Đào Trần Chung


Ths. Hồ Thị Tuyến
Ths. Nguyễn Kim Sơn
Ths. Nguyễn Thu Hương
Ths. Ngô Thị Lan Phương

BÀI GIẢNG

HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU

Thái Nguyên, tháng 6 năm 2023


MỤC LỤC

MỤC LỤC .................................................................................................................................. 3


CÁC TỪ VIẾT TẮT .................................................................................................................. 6
MỘT SỐ THUẬT NGỮ ............................................................................................................ 7
MỞ ĐẦU ..................................................................................................................................... 9
CHƯƠNG 1. GIỚI THIỆU TỔNG QUAN VỀ SQL SERVER .......................................... 11
Bài 1: GIỚI THIỆU TỔNG QUAN VỀ SQL SERVER (Số tiết: 3 tiết) ........................................... 11
1.1 Giới thiệu về SQL SERVER ................................................................................................... 11
1.2 Các Version của SQL Server .................................................................................................. 13
1.3 Các thành phần trong SQL Server ............................................................................................... 14
1.3.1 Relation Database Engine ..................................................................................................... 14
1.3.2 Replication ............................................................................................................................ 14
1.3.3 Data Transformation Service ................................................................................................ 15
1.3.4 Analysis Service.................................................................................................................... 15
1.3.5 English Query ....................................................................................................................... 15
1.3.6 Meta Data Service ................................................................................................................. 15
1.3.7 SQL Server Books Online .................................................................................................... 15
1.3.8 SQL Server Tools ................................................................................................................. 15
1.4 Cấu trúc của SQL SERVER ........................................................................................................ 16
1.4.1 Các cơ sở dữ liệu hệ thống của SQL SERVER .................................................................... 16
1.4.2 Cấu trúc vật lý của một SQL Server Database ..................................................................... 16
1.4.3 Cấu trúc logic của một SQL Server Database ...................................................................... 17
CÂU HỎI ÔN TẬP .................................................................................................................. 18
CHƯƠNG 2. BẢNG ẢO (VIEW) ........................................................................................... 19
Bài 2: TRUY VẤN DỮ LIỆU VÀ BẢNG ẢO (Số tiết: 3 tiết) ......................................................... 19
2.1 Khái niệm cơ bản về View ........................................................................................................... 19
2.2. Lệnh truy vấn - Select ................................................................................................................. 20
2.3. Ưu điểm của View ...................................................................................................................... 30
Bài 3: TRUY VẤN DỮ LIỆU VÀ BẢNG ẢO (Số tiết: 3 tiết) ......................................................... 30
2.4. Tạo View ..................................................................................................................................... 30
2.5. Các hạn chế khi định nghĩa View ............................................................................................... 32
2.6. Thay đổi, xóa và đổi tên View .................................................................................................... 32
2.7. Sử dụng View ............................................................................................................................. 34
CHƯƠNG 3. THỦ TỤC LƯU TRỮ (STORED PROCEDURE) ........................................ 34
3.1 Khái niệm cơ bản về thủ tục lưu trữ ............................................................................................ 35
3.2 Các ưu điểm của thủ tục lưu trữ ................................................................................................... 35
CÂU HỎI ÔN TẬP .................................................................................................................. 35
BÀI TẬP CUỐI CHƯƠNG 2 ................................................................................................. 35
Bài 4: THỦ TỤC LƯU TRỮ (Số tiết: 3 tiết) ..................................................................................... 37
3.3 Phân loại thủ tục lưu trữ............................................................................................................... 37
3.4 Biến trong SQL SERVER ............................................................................................................ 37
3.4.1 Biến cục bộ ........................................................................................................................... 37
3.4.2 Biến toàn cục......................................................................................................................... 38
3.5 Các cấu trúc điều khiển trong SQL SERVER ............................................................................. 39
3.5.1 Phát biểu IF…ELSE ............................................................................................................. 39
3.5.2 Biểu thức CASE .................................................................................................................... 39
3.5.3 Phát biểu WHILE .................................................................................................................. 41
3.6 Tạo thủ tục lưu trữ ....................................................................................................................... 42
3.7 Tham số trong thủ tục lưu trữ ...................................................................................................... 43
3.8 Thực thi thủ tục lưu trữ ................................................................................................................ 44
Bài 5: THỦ TỤC LƯU TRỮ (Số tiết: 3 tiết) ..................................................................................... 47
3.9 Thay đổi cấu trúc thủ tục lưu trữ.................................................................................................. 47
3.0 Xóa thủ tục ................................................................................................................................... 48
3.11 Xem định nghĩa thủ tục .............................................................................................................. 48
CÂU HỎI ÔN TẬP .................................................................................................................. 49
BÀI TẬP CUỐI CHƯƠNG 3 ................................................................................................. 49
CHƯƠNG 4. BẪY LỖI (TRIGGER) ..................................................................................... 51
Bài 6: Bẫy lỗi (Trigger) (Số tiết: 3 tiết) ............................................................................................. 51
4.1 Khái niệm cơ bản về Trigger ....................................................................................................... 51
4.2 Ứng dụng của Trigger .................................................................................................................. 51
4.3 Phân loại Trigger.......................................................................................................................... 52
4.4 Tạo Trigger .................................................................................................................................. 52
Bài 7: Bẫy lỗi (Trigger) (Tiếp) (Số tiết: 3 tiết) .................................................................................. 53
4.5 Cơ chế hoạt động của Trigger ...................................................................................................... 53
4.6 Một số ví dụ ................................................................................................................................. 54
4.7 Quản lý Trigger ............................................................................................................................ 58
4.8 Các đặc điểm và hạn chế của Trigger .......................................................................................... 60
CÂU HỎI ÔN TẬP .................................................................................................................. 61
BÀI TẬP CUỐI CHƯƠNG 4 ................................................................................................. 61
CHƯƠNG 5. KIỂU DỮ LIỆU CON TRỎ (CURSOR) ....................................................... 63
Bài 8: Kiểu dữ liệu con trỏ (Cursor) (Số tiết: 3 tiết) ......................................................................... 63
5.1 Khái niệm cơ bản về Cursor ........................................................................................................ 63
5.2 Các bước thực hiện một Cursor ................................................................................................... 63
5.2.1 Khai báo Cursor .................................................................................................................... 63
5.2.2 Mở Cursor ............................................................................................................................. 65
5.2.3 Xử lý dữ liệu ......................................................................................................................... 66
5.2.4 Đóng Cursor .......................................................................................................................... 67
5.2.5 Giải phóng Cursor ................................................................................................................. 68
Bài 9: Kiểu dữ liệu con trỏ (cursor) (tiếp) (3 tiết) ............................................................................. 68
5.3 Kiểm tra trạng thái Cursor ........................................................................................................... 68
5.4 Thay đổi dữ liệu tại vị trí Cursor ................................................................................................. 70
CÂU HỎI ÔN TẬP .................................................................................................................. 71
BÀI TẬP CUỐI CHƯƠNG .................................................................................................... 71
CHƯƠNG 6. QUẢN LÝ BẢO MẬT ...................................................................................... 73
Bài 10: Quản lý bảo mật (Số tiết: 3 tiết) ............................................................................................ 73
6.1 Khái niệm cơ bản về bảo mật....................................................................................................... 73
6.2 Các chế độ bảo mật ...................................................................................................................... 73
6.3 Quản lý người dùng ..................................................................................................................... 74
6.3.1 Tạo tài khoản đăng nhập cho người dùng ............................................................................. 75
6.3.2 Cấp phát quyền truy cập vào CSDL ..................................................................................... 75
6.4 Quyền người dùng ....................................................................................................................... 76
6.4.1 Cấp phát quyền ..................................................................................................................... 76
6.4.2 Thu hồi quyền ....................................................................................................................... 80
CÂU HỎI ÔN TẬP .................................................................................................................. 82
BÀI TẬP CUỐI CHƯƠNG 6 ................................................................................................. 82
Tài liệu tham khảo ................................................................................................................... 85
Các câu hỏi thường gặp ........................................................................................................... 86
Bài tập thực hành..................................................................................................................... 91
Bài thực hành số 1 (Số tiết: 5 tiết) ..................................................................................................... 91
Bài thực hành số 2 (số tiết: 5 tiết) ..................................................................................................... 99
Bài thực hành số 3 (Số tiết: 5 tiết) ................................................................................................... 107
Bài thực hành số 4 (Số tiết: 5 tiết) ................................................................................................... 114
Bài thực hành số 5 (Số tiết: 5 tiết) ................................................................................................... 123
Bài thực hành số 6 (số tiết: 5 tiết) .................................................................................................... 133
CÁC TỪ VIẾT TẮT

TT Từ viết tắt Ý nghĩa của từ

1 CSDL Cơ sở dữ liệu

2 GUI Graphical User Interfac – Giao diện đồ họa người dùng

3 SQL Structured Query Language – Ngôn ngữ truy vấn có cấu trúc

Relational Database Management System – Hệ thống quản lý


4 RDBMS
cơ sở dữ liệu quan hệ

5 NT Network Technology – Mô hình mạng

6 XML Extension Markup Language – Ngôn ngữ đánh dấu mở rộng

7 ADO ActiveX Data Objects - Đối tượng dữ liệu ActiveX

8 ODBC Open Database Connectivity – Kết nối cơ sở dữ liệu mở

Object Linking and Embedding, Database – Liên kết và nhúng


9 OLE DB
đối tượng trong cơ sở dữ liệu

10 DBA Database Administrator – Quản trị cơ sở dữ liệu

11 OLTP Online Transaction Processing – Xử lý giao dịch trực tuyến

12 ASC Ascending – Tăng dần

13 DESC Descending – Giảm dần


MỘT SỐ THUẬT NGỮ
Gồm các thuật ngữ đã sử dụng trong bài giảng được xếp thứ tự a,b,c.
1 Column (cột) Được thiết kế để chứa tập dữ liệu, mô tả cùng một thuộc tính
cụ thể, của mỗi thực thể (record) trong table.

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.

Nhóm tác giả


CHƯƠNG 1. GIỚI THIỆU TỔNG QUAN VỀ SQL SERVER
Kể từ khi phát hành SQL Server 1.0 vào năm 1989, SQL Server đã phát triển để trở thành
một nền tảng thông tin doanh nghiệp thực sự. Trong khi chức năng cốt lõi của nó là của RDBMS,
SQL Server đã trở nên nhiều hơn thế. SQL Server 2014 bao gồm các công cụ thông minh kinh
doanh được tích hợp sẵn, cũng như một loạt các công cụ phân tích và báo cáo. Điều này nằm
trên các công cụ quản lý cơ sở dữ liệu như tạo cơ sở dữ liệu, sao lưu, nhân rộng, bảo mật và hơn
thế nữa.
Hiện nay trên thị trường có các phiên bản từ 2005 đến 2022 Tuy nhiên trong bài giảng này
lựa chọn SQL Server 2014 là phiên bản kế tiếp của Microsoft SQL Server 2012 vì SQL Server
2014 cung cấp nền tảng dữ liệu toàn diện, bảo mật, đáng tin cậy dễ quản lý và dễ nâng cấp hơn
cho các ứng dụng
SQL Server 2014 hỗ trợ các nhà phát triển phần mềm tạo ra những ứng dụng có thể lưu trữ
các dữ liệu cho hệ thống sản xuất, website, phần mềm, v.v. với độ tương thích rất cao với các hệ
điều hành.
Nội dung chính của chương gồm:
Giới thiệu SQL Server 2014.
Các Version của SQL Server.
Các thành phần trong SQL Server 2014.
Cấu trúc của SQL Server 2014.
Bài 1: GIỚI THIỆU TỔNG QUAN VỀ SQL SERVER (Số tiết: 3 tiết)
1.1 Giới thiệu về SQL SERVER
SQL Server là hệ thống quản trị cơ sở dữ liệu quan hệ (Relational DataBase Management
System- RDBMS) sử dụng các lệnh giao chuyển Transaction-SQL để trao đổi dữ liệu giữa Client
Computer và Server Computer.
SQL Server có một số đặc tính sau:
Cho phép quản trị một hệ CSDL lớn (lên đến vài tega byte), có tốc độ xử lý dữ liệu nhanh
đáp ứng yêu cầu về thời gian.
Cho phép nhiều người cùng khai thác trong một thời điểm đối với một CSDL và toàn bộ
quản trị CSDL (lên đến vài chục ngàn user).
Có hệ thống phân quyền bảo mật tương thích với hệ thống bảo mật của công nghệ NT
(Network Technology), tích hợp với hệ thống bảo mật của Windows NT hoặc sử dụng hệ thống
bảo vệ độc lập của SQL Server.
Hỗ trợ trong việc triển khai CSDL phân tán và phát triển ứng dụng trên Internet
Cho phép lập trình kết nối với nhiều ngôn ngữ lập trình khác dùng xây dựng các ứng dụng
đặc thù (Visual Basic, C, C++, ASP, ASP.NET, XML,...).
Sử dụng câu lệnh truy vấn dữ liệu Transaction-SQL (Access là SQL, Oracle là PL/SQL).
SQL Server có các ấn bản chính sau:
- Enterpise Manager: Là ấn bản đầy đủ của SQL Server có thể chạy trên 32CPU và 64GB
RAM. Có các dịch vụ phân tích dữ liệu Analysis Service.
- Standard: Giống như Enterprise nhưng bị hạn chế một số tính năng cao cấp, có thể chạy
trên 2CPU, 4GB RAM.
- Personal: Phiên bản này chủ yếu để chạy trên PC, nên có thể chạy trên các hệ điều hành
Windows 9x, Windows XP, Windows 2000, Windows 2003…
- Developer: Là phiên bản tương tự như Enterprise nhưng bị giới hạn bởi số user kết nối
đến.
- Desktop Engine: Là phiên bản một engine chỉ chạy trên desktop và không có giao diện
người dùng (GUI), kích thước CSDL giới hạn bởi 2GB.
- Win CE: Sử dụng cho các ứng dụng chạy trên Windows CE.
- Trial: Phiên bản dùng thử, bị giới hạn bởi thời gian.
- SQL Client: Là phiên bản dành cho máy khách, khi thực hiện khai thác sẽ thực hiện kết
nối đến phiên bản SQL Server, phiên bản này cung cấp giao diện GUI khai thác cho người sử
dụng.
- SQL Connectivity only: Là phiên bản sử dụng chỉ cho các ứng dụng để kết nối đến SQL
Server, phiên bản này không cung cấp công cụ GUI cho người dùng khai thác SQL Server.
Các phiên bản này được cài đặt phụ thuộc vào bộ cài đặt mà chúng ta chọn hoặc lựa chọn
khai cài đặt (ví dụ phiên bản Enterprise, Standard, Personal,… Chúng ta phải chọn theo bộ cài
đặt, phiên bản SQL Client, Connectivity,… do chúng ta chọn trong các hộp thoại trong quá trình
cài đặt).
1.2 Các Version của SQL Server
Dưới đây là các phiên bản khác nhau có sẵn cho SQL Server 2014.
Phiên bản chính
Ba phiên bản chính của SQL Server 2014 là:
Phiên bản doanh nghiệp: Được coi là sản phẩm cao cấp, phiên bản Enterprise hướng tới
các trung tâm dữ liệu quy mô lớn và các giải pháp kho dữ liệu. Nền tảng quản lý dữ liệu và thông
minh kinh doanh cung cấp khả năng mở rộng cấp doanh nghiệp, tính sẵn sàng cao và bảo mật
để chạy các ứng dụng quan trọng. Tất cả các khả năng của phiên bản trung tâm dữ liệu (đã được
bao gồm trong các phiên bản SQL Server trước nhưng hiện đã ngừng hoạt động) đều có trong
phiên bản Enterprise của SQL Server 2014.
Phiên bản tiêu chuẩn: Phiên bản tiêu chuẩn hướng tới cơ sở dữ liệu phòng ban và các ứng
dụng kinh doanh thông minh hạn chế thường thấy trong các tổ chức hoặc phòng ban nhỏ hơn.
Phiên bản Business Intelligence: Hướng đến các tổ chức cần sự thông minh trong kinh
doanh của công ty và khả năng tự phục vụ nhưng không yêu cầu hiệu suất xử lý giao dịch trực
tuyến (OLTP) đầy đủ và khả năng mở rộng được tìm thấy trong phiên bản Enterprise.
Phiên bản chuyên biệt
Ngoài các phiên bản chính của SQL Server, các phiên bản sau có sẵn:
Phiên bản dành cho nhà phát triển (còn được gọi là Phiên bản nhỏ gọn): Một cơ sở dữ liệu
nhúng miễn phí mà các nhà phát triển phần mềm có thể sử dụng để xây dựng các trang web
ASP.NET và các ứng dụng máy tính để bàn Windows.
Ấn bản trên web: Được thiết kế để hỗ trợ khối lượng công việc sử dụng internet và cho
phép các tổ chức triển khai nhanh chóng các trang web, ứng dụng, trang web và dịch vụ.
Phiên bản Express: Phiên bản SQL Server miễn phí lý tưởng để học và xây dựng các ứng
dụng máy tính để bàn và máy chủ nhỏ. Bộ nhớ giới hạn ở 10GB cho mỗi cơ sở dữ liệu. Phiên
bản Express có sẵn trong các phiên bản sau:
SQL Server Express với các công cụ: Chứa cơ sở dữ liệu SQL Server cốt lõi cùng với các
công cụ để quản lý các phiên bản SQL Server bao gồm SQL Server Express, LocalDB và SQL
Azure.
SQL Server Management Studio: Không chứa cơ sở dữ liệu SQL Server, chỉ có các công
cụ để quản lý các phiên bản SQL Server, bao gồm LocalDB, SQL Express, SQL Azure, v.v. Sử
dụng phần mềm này nếu chúng tas đã có cơ sở dữ liệu SQL Server và chỉ cần các công cụ quản
lý.
SQL Server Express LocalDB (trình cài đặt MSI): Phiên bản nhẹ của SQL Server Express
có tất cả các tính năng có thể lập trình nhưng nó vẫn chạy ở chế độ người dùng và cài đặt nhanh,
không cần cấu hình. Không có công cụ quản lý nào được bao gồm.
SQL Server Express với các dịch vụ nâng cao: Bao gồm công cụ cơ sở dữ liệu; Công cụ
Express; Dịch vụ Báo cáo; Tìm kiếm toàn văn; các công cụ quản lý và tất cả các thành phần của
SQL Server Express.
SQL Server Express: Đây là máy chủ cơ sở dữ liệu Express cốt lõi. Sử dụng điều này nếu
chúng ta cần chấp nhận các kết nối từ xa hoặc quản trị từ xa và không cần các công cụ hoặc dịch
vụ nâng cao.
1.3 Các thành phần trong SQL Server
1.3.1 Relation Database Engine
Ðây là một engine có khả năng chứa data ở các quy mô khác nhau dưới dạng table và
support tất cả các kiểu kết nối (data connection) thông dụng của Microsoft như ActiveX Data
Objects (ADO), OLE DB, and Open Database Connectivity (ODBC). Ngoài ra nó còn có khả
năng tự điều chỉnh (tune up) ví dụ như sử dụng thêm các tài nguyên (resource) của máy khi cần
và trả lại tài nguyên cho hệ điều hành khi một user log off.
1.3.2 Replication
Giả sử chúng ta có một database dùng để chứa dữ liệu được các ứng dụng thường xuyên
cập nhật. Nếu muốn có một database giống như thế trên một server khác để chạy báo cáo (report
database) (cách làm này thường dùng để tránh ảnh hưởng đến performance của server chính).
Vấn đề là report server cũng cần phải được cập nhật thường xuyên để đảm bảo tính chính xác
của các báo cáo. Chúng ta không thể dùng cơ chế backup and restore trong trường hợp này. Lúc
đó cơ chế replication của SQL Server sẽ được sử dụng để bảo đảm cho dữ liệu ở 2 database được
đồng bộ (synchronized).
1.3.3 Data Transformation Service
Nếu chúng ta làm việc trong một công ty lớn trong đó data được chứa trong nhiều nơi khác
nhau và ở các dạng khác nhau cụ thể như chứa trong Oracle, DB2 (của IBM), SQL Server,
Microsoft Access... khi chúng ta có nhu cầu di chuyển data giữa các server này (migrate hay
transfer) và định dạng (format) nó trước khi lưu vào database khác, khi đó DTS sẽ giúp giải
quyết công việc trên dễ dàng hơn.
1.3.4 Analysis Service
Dữ liệu (Data) chứa trong database sẽ chẳng có ý nghĩa gì nhiều nếu như không thể lấy
được những thông tin (Information) bổ ích từ đó. Do đó Microsoft cung cấp một công cụ rất
mạnh giúp cho việc phân tích dữ liệu trở nên dễ dàng và hiệu quả bằng cách dùng khái niệm
hình khối nhiều chiều (multi-dimension cubes) và kỹ thuật "khai phá dữ liệu" (data mining).
1.3.5 English Query
Cho phép người sử dụng không có kỹ thuật về SQL cũng có thể sử dụng SQL Server, bằng
cách đặt câu hỏi bằng chuỗi English sau đó được dịch ra query và có thể thực thi trên SQL
Server. Nhưng công cụ này được cài đặt cách biệt với SQL Server
1.3.6 Meta Data Service
Meta data là những thông tin mô tả về cấu trúc của data trong database như data thuộc loại
nào String hay Integer..., một cột nào đó có phải là Primary key hay không... Bởi vì những thông
tin này cũng được chứa trong database nên cũng là một dạng data nhưng để phân biệt với data
"chính thống" người ta gọi nó là Meta Data.
1.3.7 SQL Server Books Online
SQL Server Books Online là nguồn Trợ giúp chính cho Microsoft SQL Server. SQL Server
Books Online bao gồm các khái niệm và thủ tục cần thiết để sử dụng SQL Server hiệu quả. SQL
Server Books Online cũng bao gồm tài liệu tham khảo về các ngôn ngữ và giao diện lập trình để
lưu trữ, truy xuất, báo cáo và sửa đổi dữ liệu bằng cách sử dụng SQL Server. Sách trực tuyến là
cơ sở kiến thức chính thức cho SQL Server. Dịch vụ này rất hữu dụng và không thể thiếu được
(được Microsoft đính kèm theo SQL Server).
1.3.8 SQL Server Tools
- Enterprise Manager: Đây là một công cụ cho ta thấy toàn cảnh hệ thống CSDL một cách
rất trực quan. Nó rất hữu ích đặc biệt cho người mới học và không thông thạo lắm về SQL.
- Query Analyzer: Đối với một DBA giỏi thì hầu như chỉ cần công cụ này là có thể quản lý
cả một hệ thống database mà không cần đến những thứ khác. Đây là một môi trường làm việc
khá tốt vì ta có thể đánh bất kỳ câu lệnh SQL nào và chạy ngay lập tức đặc biệt là nó giúp cho
chúng ta debug mấy cái Stored procedure dễ dàng.
- SQL Profiler: Nó có khả năng chụp tất cả các sự kiện hay hoạt động diễn ra trên một SQL
Server và lưu lại dưới dạng text file rất hữu dụng trong việc kiểm soát hoạt động của SQL Server.
- Ngoài một số công cụ trực quan như trên chúng ta cũng thường hay dùng osql và bcp (bulk
copy) trong command prompt.
1.4 Cấu trúc của SQL SERVER
1.4.1 Các cơ sở dữ liệu hệ thống của SQL SERVER
Các system databases bao gồm:
Master: Chứa tất cả những thông tin cấp hệ thống (system-level information) bao gồm
thông tin về các database khác trong hệ thống như vị trí của các data files, các login account và
các thiết đặt cấu hình hệ thống của SQL Server (system configuration settings).
Tempdb: Chứa tất cả những table hay stored procedure được tạm thời tạo ra trong quá trình
làm việc bởi user hay do bản thân SQL Server engine. Các table hay stored procedure này sẽ
biến mất khi khởi động lại SQL Server hay khi ta disconnect.
Model: Database này đóng vai trò như một bảng kẻm (template) cho các database khác.
Nghĩa là khi một user database được tạo ra thì SQL Server sẽ copy toàn bộ các system objects
(tables, stored procedures...) từ Model database sang database mới vừa tạo.
Msdb: Database này được SQL Server Agent sử dụng để hoạch định các báo động và các
công việc cần làm (schedule alerts and jobs).
1.4.2 Cấu trúc vật lý của một SQL Server Database
Mỗi một database trong SQL Server được lưu trữ dưới dạng 2 tập tin:
Tập tin dữ liệu (data file): Lưu trữ dữ liệu gồm 2 loại:
Primary data file (tên file có phần mở rộng là .mdf): đây là file chính chứa data và những
system tables.
Secondary data file (tên file có phần mở rộng là .ndf): đây là file phụ thường chỉ sử dụng
khi database được phân chia để chứa trên nhiều đĩa.
Tập tin Log (Transaction log file – tên file có phần mở rộng là .ldf): đây là file ghi lại tất
cả những thay đổi diễn ra trong một database và chứa đầy đủ thông tin để có thể roll back hay
roll forward khi cần.
Ghi chú; Mỗi một database trong SQL Server có ít nhất một tập tin dữ liệu và một tập tin log:
Data trong SQL Server được chứa thành từng Page 8KB và 8 page liên tục tạo thành một Extent
như hình vẽ dưới đây:

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ÂU HỎI ÔN TẬP


Câu 1: Hãy trình bày các edition của SQL Server?
Câu 2: Hãy liệt kê các version của SQL Server?
Câu 3: Hãy trình bày thành phần Database Engine và Replication trong SQL Server?
Câu 4: Hãy phân biệt thành phần Integration Services (DTS) và Analysis Services trong SQL
Server?
Câu 5: Hãy phân biệt các thành phần Reporting Services và Full Text Search trong SQL
Server?
Câu 6: Hãy trình bày các tệp CSDL hệ thống trong SQL Server?
Câu 7: Cấu trúc vật lý của tệp CSDL trong SQL Server?
Câu 8: Cấu trúc logic của tệp CSDL trong SQL Server?
CHƯƠNG 2. BẢNG ẢO (VIEW)
Trong hầu hết các cơ sở dữ liệu hiện nay việc truy vấn cơ sở dữ liệu từ nhiều bảng khác
nhau thành một bảng khác thường đóng vai trò chủ yếu trong quá trình xử lý dữ liệu của ứng
dụng. Trong quá trình phân tích thiết kế hệ thống thông thường chúng ta qua nhiều bước chuẩn
hóa thiết kế cơ sở dữ liệu. Phân rã thực thể ban đầu thành nhiều thực thể con khác nhau. Sau khi
phân rã thành nhiều thực thể trong mỗi thực thể chúng ta cần phải thiết kế thành bảng dữ liệu.
Bảng dữ liệu trong cơ sở dữ liệu đều có mối quan hệ với nhau thông qua các trường được chỉ
định.
Trong quá trình xử lý dữ liệu theo yêu cầu của báo cáo kết quả cuối cùng của công việc
đôi khi chúng ta cần kết nối những bản có quan hệ lại với nhau nhằm kết xuất dữ liệu theo ý
muốn. Để làm điều này chúng ta sử dụng phát biểu SQL hay công cụ hỗ trợ View. Trong chương
này chúng ta cùng nhau tìm hiểu về bảng ảo hay còn được gọi là view. Bản thân view thì không
chứa được dữ liệu view chỉ truy vấn dữ liệu kết hợp từ một hay nhiều bảng có quan hệ lại với
nhau
Nội dung chính của chương bao gồm:
Khái niệm cơ bản về View
Ưu điểm và hạn chế của View
Tạo và quản lý View
Bài 2: TRUY VẤN DỮ LIỆU VÀ BẢNG ẢO (Số tiết: 3 tiết)
2.1 Khái niệm cơ bản về View
View là một bảng ảo được định nghĩa bởi một truy vấn với phát biểu select. View được
hình thành dữ liệu từ một hoặc nhiều bảng thật đối với người sử dụng thì view giống như một
bản thật. Tuy nhiên View không tồn tại như là một cấu trúc lưu trữ dữ liệu trong cơ sở dữ liệu.
Dữ liệu (cột và dòng) trong View thực chất được tham chiếu từ một hay nhiều bảng dữ liệu bởi
câu lệnh truy vấn dữ liệu (Lệnh SELECT).
View có thể được dùng như một kỹ thuật bảo mật. Nó đảm bảo rằng người sử dụng chỉ có
thể truy nhập và sửa đổi dữ liệu mà view cung cấp. Người sử dụng không thể truy nhập hay sửa
chữa phần dữ liệu còn lại trong các bảng cơ sở.
Việc sử dụng các truy vấn phức tạp cũng có thể được đơn giản hoá nhờ sử dụng view. Các
truy vấn phức tạp đó có thể được lưu dưới dạng view và dữ liệu từ view có thể được lấy ra nhờ
sử dụng các truy vấn đơn giản hơn.
2.2. Lệnh truy vấn - Select
Việc truy cập và lấy các thông tin từ database được SQL cho phép thực hiện qua câu lệnh
SELECT. Câu lệnh SELECt có phạm vi ứng dụng rất rộng, có thể truy cập dữ liệu từ một table,
hay từ nhiều table

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

Cú pháp tổng quát có dạng sau:

SELECT [ ALL | DISTINCT] <danh_sách_chọn>


FROM <danh_sách_bảng>
[ WHERE <điều_kiện >]
[ GROUP BY <danh_sách_cột> ]
[ HAVING <điều_kiện> ]
[ ORDER BY <tên_cột> [ ASC | DESC ] [,..n]]
a) Mệnh đề FROM
Mệnh đề FROM trong câu SELECT được sử dụng nhằm chỉ định các bảng cần truy xuất
dữ liệu. Sau FROM là danh sách tên của các bảng và khung nhìn tham gia vào truy vấn. Tên của
các bảng và các khung nhìn được phân cách nhau bởi dấu phẩy.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các công ty.
SELECT MaCongTy, TenCongTy, DiaChi
FROM CongTy
Chú ý: Ta có thể sử dụng các bí danh cho các bảng hay khung nhìn trong câu lệnh SELECT. Bí
danh được gán trong mệnh đề FROM bằng cách chỉ định bí danh ngay sau tên bảng.
Ví dụ: Câu lệnh sau gán bí danh là CC cho bảng CongTy
SELECT * FROM CongTy CT
b) Mệnh đề SELECT
Danh sách chọn trong câu lệnh SELECT được sử dụng để chỉ định các trường các biểu
thức cần hiển thị trong các cột của kết quả truy vấn. Các trường các biểu thức được chỉ định
ngay sau từ khoá SELECT và phân cách nhau bời dấu phẩy. Sử dụng danh sách chọn trong câu
lệnh SELECT bao gồm các trường hợp sau:
b.1 Chọn tất cả các cột trong bảng
Khi cần hiển thị tất cả các trường trong bảng, sử dụng ký tự * trong danh sách chọn thay
vì phải liệt kê danh sách tất cả các cột. Trong trường hợp này, các cột được hiển thị trong kết
quả truy vấn sẽ tuân thủ theo thứ tự mà chúng đã được tạo ra khi bảng được định nghĩa.
Ví dụ: Câu lệnh dùng để liệt kê danh sách các mặt hàng
SELECT * FROM HangHoa
b.2 Liệt kê tên cột trong danh sách chọn
Trong trường hợp cần chỉ định cụ thể các cột cần hiển thị trong kết quả truy vấn, ta chỉ
định danh sách các tên cột trong danh sách chọn. Thứ tự của các cột trong kết quả truy vấn tuân
theo thứ tự của các trường trong danh sách chọn.
Ví dụ: Liệt kê danh sách các mặt hàng gồm các thuộc tính sau: MaHang, TenHang, DonViTinh
SELECT MaHang, TenHang, DonViTinh
FROM HangHoa
Chú ý: Nếu truy vấn được thực hiện trên nhiều bảng và các bảng có các trường trùng tên thì tên
của những trường này nếu xuất hiện trong danh sách chọn phải được viết dưới dạng:
<Tên_bảng>.<Tên_trường>
Ví dụ: Liệt kê danh sách các công ty đã cung cấp hàng hoá
SELECT CC.MaCT, TenCongTy, DiaChi
FROM CongTy CT, CungCap CC
WHERE CT.MaCT=CC.MaCT
b.3 Thay đổi tiêu đề các cột
Trong kết quả truy vấn, tiêu đề của các cột mặc định sẽ là tên của các trường tương ứng
trong bảng. Tuy nhiên, để tiêu đề trở thành thân thiện hơn, ta có thể đổi lại tên tiêu đề của các
cột. Để đặt tiêu đề cho một cột nào đó, ta sử dụng cách viết:
<tên_trường > AS <tiêu_đề_cột>
Ví dụ: Cho biết mã và tên của các công ty.
SELECT MaCongTy, TenCongTy AS Tên_Công_Ty
FROM CongTy
b.4 Hằng và biểu thức trong danh sách chọn
Ngoài danh sách trường, trong danh sách chọn của câu lệnh SELECT còn có thể sử dụng
các biểu thức. Mỗi biểu thức trong danh sách chọn trở thành một cột trong kết quả truy vấn.
Ví dụ: Câu lệnh dưới đây cho biết mã công ty, mã hàng, số lượng, đơn giá và thành tiền của các
mặt hàng đã được các công ty cung cấp.
SELECT MaCongTy, MaHang, SoLuong, DonGia, SoLuong*DonGia AS ThanhTien
FROM CungCap
b.4 Loại bỏ các bản ghi trùng nhau trong kết quả truy vấn
Trong kết quả của truy vấn có thể xuất hiện các dòng dữ liệu trùng nhau. Để loại bớt các
dòng này, ta chỉ định thêm từ khoá DISTINCT ngay sau từ khoá SELECT.
Ví dụ: Cho biết thông tin về mã của từng loại mặt hàng đã được cung cấp.
SELECT DISTINCT MaHang FROM CungCap
b.5 Giới hạn số lượng bản ghi trong kết quả truy vấn
Kết quả của truy vấn được hiển thị thường sẽ là tất cả các dòng dữ liệu truy vấn được.
Trong trường hợp cần hạn chế số lượng các dòng
c) Mệnh đề điều kiện WHERE
Mệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện
đối với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logíc và chỉ những dòng
dữ liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
Ví dụ: Câu lệnh dưới đây hiển thị mã số của các nhà cung cấp đã cung cấp mặt hàng có mã là
H2
SELECT MaCongTy
FROM CungCap
WHERE MaHang='H2'
Trong mệnh đề WHERE thường sử dụng
Các toán tử kết hợp điều kiện (AND, OR)
Các toán tử so sánh.
Toán tử phạm vi và toán tử tập hợp
Các giá trị NULL
c.1 Các toán tử so sánh
Toán tử Ý nghĩa

= (Equals) Ngang bằng

> (Greater Than) Lớn hơn

< (Less Than) Nhỏ hơn


>= (Greater Than or Equal To) Lớn hơn hoặc bằng

<= (Less Than or Equal To) Nhỏ hơn hoặc bằng

<> (Not Equal To) Không bằng

!= (Not Equal To) Không bằng

!< (Not Less Than) Không nhỏ hơn

!> (Not Greater Than) Không lớn hơn


c.2 Toán tử phạm vi (Range Operator): [NOT] BETWEEN a AND b
Để kiểm tra xem giá trị dữ liệu nằm trong (ngoài) một khoảng nào đó, ta sử dụng toán tử [NOT]
BETWEEN như sau:
Cách sử dụng Ý nghĩa
giá_tri BETWEEN a AND b a ≤ giá_trị ≤ b
giá_tri NOT BETWEEN a AND b (giá_trị < a) AND (giá_trị) > b
Ví dụ: Cho cơ sở dữ liệu quản lý điểm gồm các bảng sau:
LopHoc(MaLop, TenLop)
SinhVien(MaSV, HoDem, Ten, NgaySinh, GioiTinh, DiaChi, MaLop)
MonHoc(MaMon, TenMon, SoDvht)
Diem(MaSV, MaMon, DiemThi)
Câu lệnh dưới đây cho biết danh sách các môn học có số đơn vị học trình nằm trong khoảng từ
4 đến 5
SELECT *
FROM MonHoc
WHERE SoDvht Between 4 And 5
Câu lệnh dưới đây cho biết danh sách các môn học có số đơn vị học trình không nằm trong
khoảng từ 4 đến 5
SELECT *
FROM MonHoc
WHERE SoDvht NOT Between 4 And 5
c.3 Toán tử tập hợp (IN và NOT IN)
Toán tử IN được sử dụng khi ta cần chỉ định điều kiện tìm kiếm dữ liệu cho câu SELECT
là một danh sách các giá trị. Sau IN (hoặc NOT IN) có thể là một danh sách các giá trị hoặc là
một câu lệnh SELECT khác.
Ví dụ: Để biết danh sách các môn học có số đơn vị học trình là 3, 4 hoặc 5 thay vì sử dụng câu
lệnh
SELECT * FROM MonHoc
WHERE SoDvht =3 OR SoDvht = 4 OR SoDvht = 5
Ta có thể sử dụng câu lệnh
SELECT * FROM MonHoc
WHERE SoDvht IN (3,4,5)
c.4 Toán tử LIKE và các ký tự đại diện
Toán tử LIKE (hoặc NOT LIKE) sử dụng trong câu lệnh SELECT nhằm mô tả khuôn dạng
của cần tìm kiếm. Chùng thường kết hợp với các ký tự đại diện sau đây:
Dấu phần trăm (%): Chỉ một chuỗi các ký tự bất kỳ.
Dấu gạch dưới (_): Chỉ một ký tự đơn bất kỳ
Ví dụ: Cho biết họ và tên của các sinh viên có họ đệm là Dương
SELECT HoDem, Ten FROM SinhVien
WHERE HoDem like 'Dương%'
c.5 Giá trị NULL
Trong mệnh đề WHERE, để kiểm tra giá trị của một cột có giá trị NULL hay không ta sử
dụng cách viết:
WHERE tên_cột IS NULL hoặc WHERE tên_cột IS NOT NULL
c.6 Toán tử SOME, ANY, ALL
- Toán tử SOME, ANY: Chúng được sử dụng kết hợp thêm với các phép toán so sánh căn
bản như: =, >, >=, <, <=, !=, !>, !<... Trả về TRUE nếu một vài biểu thức thỏa mãn
- Toán tử ALL: Chúng được sử dụng kết hợp thêm với các phép toán so sánh căn bản như:
=, >, >=, <, <=, !=, !>, !<... Trả về TRUE nếu tất cả các biểu thức đều thỏa mãn
d) Sắp xếp kết quả truy vấn
Mặc định các dòng dữ liệu trong kết quả của câu truuy vấn tuân theo thứ tự của chúng
trong bảng dữ liệu hoặc được sắp xếp theo chỉ mục (nếu trên bảng có chỉ mục). Trong trường
hợp muốn dữ liệu được sắp xếp theo chiều tăng hoặc giảm của giá trị của một hoặc nhiều trường,
ta sử dụng thêm mệnh đề ORDER BY trong câu lệnh SELECT.
Sau ORDER BY là danh sách các cột cần sắp xếp (tối đa là 16 cột). Dữ liệu được sắp xếp
có thể theo chiều tăng (ASC) hoặc giảm (DESC), mặc định là sắp xếp theo chiều tăng.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các môn học và sắp xếp theo chiều giảm dần của số
đơn vị học trình
SELECT * FROM MonHoc
ORDER BY SoDvht DESC
Chú ý: Nếu sau ORDER BY có nhiều cột thì việc sắp xếp dữ liệu sẽ được ưu tiên theo chiều từ
trái qua phải.
Ví dụ: Liệt kê danh sách sinh viên và sắp xếp theo tên sinh viên theo Alphaber, nếu trùng tên thì
sắp theo giới tính
SELECT * FROM SinhVien
ORDER BY Ten, GioiTinh
e) Phép kết nối
Khi cần thực hiện một yêu cầu truy vấn dữ liệu từ hai hay nhiều bảng, ta phải sử dụng
đến phép kết nối
Để thực hiện được một phép nối, cần phải xác định được những yếu tố sau:
Những cột nào cần hiển thị trong kết quả truy vấn.
Những bảng nào có tham gia vào truy vấn.
Điều kiện để thực hiện phép nối giữa các bảng dữ liệu là gì?
Trong các yếu tố kể trên, việc xác định chính xác điều kiện để thực hiện phép nối giữa các
bảng đóng vai trò quan trọng nhất. Trong đa số các trường hợp, điều kiện của phép nối được xác
định nhờ vào mối quan hệ giữa các bảng cần phải truy xuất dữ liệu. Thông thường, đó là điều
kiện bằng nhau giữa khoá chính và khoá ngoài của hai bảng có quan hệ với nhau.
Ví dụ: Câu lệnh dưới đây hiển thị danh sách các sinh viên với các thông tin: Mã sinh viên, họ
đệm và tên, mã lớp và tên lớp
SELECT MaSV, HoDem, Ten, Lop.MaLop, TenLop
FROM SinhVien, Lop
WHERE SinhVien.MaLop = Lop.MaLop
Trong câu lệnh trên, các bảng tham gia vào truy vấn bao gồm: SinhVien và Lop. Điều
kiện để thực hiện phép kết nối giữa hai bảng là điều kiện sau:
SinhVien.MaLop = Lop.MaLop
Chú ý:
Tên của một số cột nào đó trong các bảng có tham gia vào truy vấn. Nếu tên cột trong các
bảng trùng tên nhau thì tên cột phải được viết dưới dạng: Tên_bảng.tên_cột
Dấu sao (*) được sử dụng trong danh sách chọn khi cần hiển thị tất cả các cột của các bảng
tham gia truy vấn.
Trong trường hợp cần hiển thị tất cả các cột của một bảng nào đó, ta sử dụng cách viết:
tên_bảng.*
Ví dụ: Liệt kê danh sách cac sinh viên tham gia học môn 'Cơ sở dữ liệu'
SELECT SinhVien.MaSV, HoDem, Ten, MaLop, NgaySinh, GioiTinh, DiaChi
FROM SinhVien, MonHoc, Diem
WHERE SinhVien.MaMon = Diem.MaMon AND MonHoc.MaMon=Diem.MaMon
AND TenMon='Cơ sở dữ liệu'
hoặc viết dưới dạng ngắn gọn hơn:
SELECT SinhVien.*
FROM SinhVien, MonHoc , Diem
WHERE SinhVien.MaMon = Diem.MaMon AND MonHoc.MaMon=Diem.MaMon
AND TenMon='Cơ sở dữ liệu'
f) Thống kê dữ liệu với GROUP BY
Mệnh đề GROUP BY sử dụng trong câu lệnh SELECT nhằm phân hoạch các dòng dữ liệu
trong bảng thành các nhóm dữ liệu và trên mỗi nhóm dữ liệu thực hiện tính toán các giá trị thống
kê như tính tổng, tính giá trị trung bình…
Các hàm nhóm được sử dụng để tính giá trị thống kê cho toàn bảng hoặc trên mỗi nhóm
dữ liệu. Chúng có thể được sử dụng như là các cột trong danh sách chọn của câu lệnh SELECT
hoặc xuất hiện trong mệnh đề HAVING, nhưng không được phép xuất hiện trong mệnh đề
WHERE
SQL cung cấp các hàm nhóm dưới đây:
Hàm nhóm Chức năng
SUM(biểu_thức) Tính tổng các giá trị
AVG(biểu_thức) Tính trung bình của các giá trị
COUNT(biểu_thức) Đếm số các giá trị trong biểu thức
COUNT(*) Đếm số các dòng được chọn
MAX(biểu_thức) Tính giá trị lớn nhất
MIN(biểu_thức) Tính giá trị nhỏ nhất
Trong đó:
Hàm SUM, AVG chỉ làm việc với các biểu thức số
Hàm SUM, AVG, COUNT, MIN và MAX bỏ qua các giá trị NULL khi tính toán.
Hàm COUNT(*) không bỏ qua các giá trị NULL
f.1 Thống kê trên toàn bộ dữ liệu
Khi cần tính toán giá trị thống kê trên toàn bộ dữ liệu, ta sử dụng các hàm nhóm trong
danh sách chọn của câu lệnh SELECT. Trong trường hợp này, trong danh sách chọn không được
sử dụng bẩt kỳ một tên cột hay biểu thức nào ngoài các hàm gộp.
Ví dụ: Để thống kê trung bình điểm thi của tất cả các môn học ta sử dụng câu lệnh như sau:
SELECT AVG(DiemThi) FROM Diem
f.2 Thống kê dữ liệu trên các nhóm
Trong trường hợp cần thực hiện tính toán các giá trị thống kê trên các nhóm dữ liệu, ta
sử dụng mệnh đề GROUP BY để phân hoạch dữ liệu vào trong các nhóm. Các hàm nhóm được
sử dụng sẽ thực hiện thao tác tính toán trên mỗi nhóm và cho biết giá trị thống kê theo các nhóm
dữ liệu.
Ví dụ: Câu lệnh dưới đây cho biết sĩ số sinh viên của mỗi lớp
SELECT Lop.MaLop, TenLop, COUNT(MaSV) AS SiSo
FROM Lop, SinhVien
WHERE Lop.MaLop = SinhVien. MaLop
GROUP BY Lop.MaLop, TenLop
Chú ý:
Biểu thức nào điều khiển việc phân nhóm dữ liệu thì các biểu thức đó phải được liệt kê
sau mện đề GROUP BY.
Trong trường hợp danh sách chọn của câu lệnh SELECT có các hàm nhóm và những biểu
thức không phải là đối số của các hàm nhóm thì những biểu thức này phải được liệt kê đầy đủ
trong mệnh đề GROUP BY, nếu không câu lệnh sẽ không hợp lệ
Ví dụ: Dưới đây là một câu lệnh sai do thiếu trường TenLop sau mệnh đề GROUP BY
SELECT Lop.MaLop, TenLop, COUNT(MaSV) AS SiSo
FROM Lop, SinhVien
WHERE Lop.MaLop = SinhVien. MaLop
GROUP BY Lop.MaLop
g) Mệnh đề điều kiện đối với hàm nhóm - HAVING
Mệnh đề HAVING là mệnh đề đặt điều kiện lên các nhóm dữ liệu. Mệnh đề HAVING
thường không thực sự có nghĩa nếu như không sử dụng kết hợp với mệnh đề GROUP BY. Một
điểm khác biệt giữa HAVING và WHERE là trong điều kiện của WHERE không được có các
hàm nhóm trong khi HAVING lại cho phép sử dụng các hàm nhóm trong điều kiện của mính.
Ví dụ: Đưa ra danh sách sinh viên có trung bình điểm thi lớn hơn hoặc bằng 5.
SELECT SinhVien.MaSV, HoDem, Ten, SUM(DiemThi*SoDvht)/SUM(SoDvht)
FROM SinhVien, MonHoc , Diem
WHERE SinhVien.MaMon = Diem.MaMon AND
MonHoc.MaMon=Diem.MaMon
GROUP BY SinhVien.MaSV, HoDem, Ten
HAVING SUM(DiemThi*SoDvht)/SUM(SoDvht) >=5

h) Truy vấn con (Subquery)

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.

Tìm tên các công ty đã cung cấp mặt hàng H2

SELECT TenCongTy

FROM CongTy, CungCap

WHERE (CongTy.MaCongTy = CungCap.MaCongTy)

AND (MaHang = 'H2')

Hoặc có thể viết như sau:

SELECT TenCongTy

FROM CongTy

WHERE MaCongTy IN (SELECT MaCongTy

FROM CungCap

WHERE MaHang = 'H2')

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

WHERE MaCongTy NOT IN (SELECT MaCongTy

FROM CungCap)

Hoặc có thể viết như sau:

SELECT *

FROM CongTy

WHERE MaCongTy <> ALL (SELECT MaCongTy FROM CungCap)

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

WHERE MaCongTy IN (SELECT MaCongTy

FROM CungCap

WHERE MaHang IN (SELECT MaHang

FROM HangHoa

WHERE màu = “đỏ”))

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

WHERE EXISTS (SELECT MaCongTy

FROM CungCap CC

WHERE CC.MaCongTy=CongTy.MaCongTy

AND MaHang <> 'H1')


2.3. Ưu điểm của View
Cung cấp dữ liệu thích hợp cho người dùng (đầy đủ nhưng cũng chỉ vừa đủ): Nhìn chung,
View thường được dùng để tập trung, một cách đơn giản, và tuỳ biến dữ liệu tùy theo nhu cầu
và quyền hạn mỗi người. Nó có thể được sử dụng làm môi trường bảo mật bằng cách cho phép
người sử dụng truy cập và xử lý dữ liệu qua view.
Giấu độ phức tạp của CSDL: View giấu đi sự phức tạp của thiết kế CSDL đối với người
sử dụng. Điều này cho phép người phát triển thay đổi thiết kế CSDL mà không làm ảnh hưởng
đến sự tương tác giữa người sử dụng và CSDL. Ngoài ra, người sử dụng có thể xem dữ liệu bằng
cách sử dụng các tên dễ hiểu hơn so với các tên mã hoá thường được dùng trong CSDL.
Tổ chức dữ liệu từ các nguồn không đồng nhất: Ta có thể tạo view dựa vào những truy vấn
phức tạp kết hợp hai hay nhiều bảng (table). View-đối với người sử dụng giống như một bảng
đơn được gọi là view phân vùng. Chẳng hạn, nếu một bảng chứa thông tin chi tiết về lương cho
nhân viên ở Mỹ, và bảng khác chứa thông tin chi tiết về lương cho nhân viên ở Anh, một view
có thể được tạo từ sự kết hợp (UNION) của những table này. View sẽ thể hiện thông tin chi tiết
về lương cho các nhân viên trong cả 2 nước.
Các view phân vùng có thể dựa vào dữ liệu từ các nguồn không đồng nhất, như máy chủ
từ xa (remote server), chứ không phải chỉ từ các bảng trong cùng CSDL. Ví dụ, để kết hợp dữ
liệu từ các máy chủ từ xa (remote server), trong đó mỗi một máy chủ lưu dữ liệu cho một khu
vực khác nhau của một tổ chức, chúng ta có thể tạo các truy vấn phân tán (những truy vấn truy
xuất dữ liệu từ các nguồn dữ liệu không đồng nhất được lưu trên chính máy đó hoặc trên một
máy khác) lấy dữ liệu từ mỗi nguồn dữ liệu. Do đó, chúng ta có thể tạo một view dựa vào các
truy vấn phân tán (distributed queries) đó. Truy vấn chỉ đọc dữ liệu được yêu cầu từ một bảng
trên máy chủ từ xa có chứa dữ liệu mà truy vấn đó yêu cầu. Các server khác được tham chiếu
bởi các truy vấn phân tán trong view đó không truy cập được.
Hạn chế kích cỡ đối tượng: Các view không chứa dữ liệu. SQL server chỉ lưu định nghĩa
của view trong CSDL.
Bài 3: TRUY VẤN DỮ LIỆU VÀ BẢNG ẢO (Số tiết: 3 tiết)
2.4. Tạo View
Sử dụng lệnh Create View để tạo View với cú pháp sau:
CREATE VIEW view_name [(column_name_list)]
[WITH ENCRYPTION] [WITH SCHEMABINDING]
AS
< select_Statement >
[WITH CHECK OPTION]
Giải thích:
- View_name: Xác định tên của view và cần phải tuân theo các qui tắc định danh.
- column_name_list (Danh sách tên cột): Xác định tên của các cột sẽ xuất hiện trong view.
Danh sách tên cột phải tương ứng với số lượng các cột xuất hiện trong bảng kết quả của lệnh
truy vấn SELECT.Nếu không chỉ ra column_name_list thì view được tạo có tên và thứ tự
của các cột được xác định bởi tên và thứ tự của các cột xuất hiện trong bảng kết quả của câu
lệnh SELECT
- WITH ENCRYPTION: Nếu có mệnh đề này SQL Server sẽ mã hoá đoạn mã lệnh dùng
để định nghĩa view, phục vụ cho mục đích bảo mật
- WITH SCHEMABINDING: Tất cả các Table liên quan đến việc tạo View không thể xoá
được khi View vẫn tồn tại
- select_statement: Xác định khai báo câu lệnh SELECT định nghĩa view. View có thể sử
dụng dữ liệu chứa trong các view và bảng khác
- WITH CHECK OPTION: Bắt buộc tất cả các câu lệnh hiệu chỉnh dữ liệu thực hiện dựa
vào View phải thoã mãn các điều kiện đã đề cập trong mệnh đề Where của câu lệnh SELECT
Ghi chú:
- Lệnh Create View phải được viết đầu tiên trong một Batch
- Phải chỉ định phần column_name trong câu lệnh CREATE VIEW trong các trường hợp
sau:
View có cột được phát sinh từ một biểu thức số học
Hai hay nhiều cột của khung nhìn có trùng tên
Muốn thay đổi tên cột trong View khác với tên cột của bảng cơ sở
Ví dụ: Cho cơ sở dữ liệu gồm các bảng dữ liệu sau:
Bảng DonVi(MaDV, TenDV)
Bảng NhanVien(MaNV, HoTen, NgaySinh, GioTinh, MaDV)
- Tạo view có tên vwGioiTinh để chứa các nhân viên có giới tính bằng 1
Create View vwGioiTinh
As
Select MaNV, HoTen, NgaySinh, GioiTinh
From NhanVien
Where GioiTinh=1
- Câu lệnh dưới đây sẽ bị lỗi do tên của cột thứ 3 chưa được xác định
Create View vwnhanvien
As
Select MaNV, HoTen, Datediff(year,NgaySinh,Getdate()),TenDV
From NhanVien, DonVi
Where NhanVien.MaDV=DonVi.MaDV
- Để câu lệnh trên có thể thực hiện được, ta phải đặt tên cho các cột trong View như sau:
Create View vwnhanvien(MaNV, HoTen, Tuoi, DonVi)
As
Select MaNV, HoTen, Datediff(year,NgaySinh,Getdate()) ,TenDV
From NhanVien, DonVi
Where NhanVien.MaDV=DonVi.MaDV
2.5. Các hạn chế khi định nghĩa View
- View chỉ được tạo nếu có quyền SELECT trên bảng cơ sở
- Định nghĩa View không thể bao gồm các mệnh đề ORDER BY, COMPUTER BY hoặc
từ khoá INTO
- Chỉ được dùng ORDER BY chỉ khi từ khóa TOP được dùng
- Không thể kết hợp với câu lệnh T-SQL khác trong một cùng một bó lệnh
2.6. Thay đổi, xóa và đổi tên View
a) Thay đổi View
Ta có thể thay đổi lại View mà không cần phải hủy nó. Như vậy sẽ đảm bảo rằng các
quyền trên View không bị mất đi khi hủy View. Ta cũng có thể thay đổi View mà không làm
ảnh hưởng tới các đối tượng phụ thuộc vào View. Ta có thể sử dụng câu lệnh ALTER VIEW để
sửa View, với cú pháp sau:
ALTER VIEW view_name [(column_name_list)]
[WITH ENCRYPTION]
AS select_statement
[WITH CHECK OPTION]
- view_name: Tên của view.
- column_name_list: Xác định tên của (các) cột được sử dụng trong view.
- Nếu column_name_list không được xác định, view được tạo sẽ có cùng các cột như đã xác
định trong select_statement.
- WITH ENCRYPTION: Nếu có mệnh đề này SQL Server sẽ mã hoá đoạn mã lệnh dùng để
định nghĩa view, phục vụ cho mục đích bảo mật
- select_statement chỉ ra câu lệnh SELECT xác định view. View có thể sử dụng các view
hoặc các bảng khác.
- WITH CHECK OPTION: Bắt buộc tất cả các câu lệnh hiệu chỉnh dữ liệu thực hiện dựa
vào View phải thoã mãn các điều kiện đã đề cập trong mệnh đề Where của câu lệnh
SELECT.
Ví dụ:
Sửa lại View có tên vwGioiTinh để chứa các nhân viên có giới tính bằng 0
Alter View vwGioiTinh
As
Select MaNV, HoTen, NgaySinh, GioiTinh
From NhanVien
Where GioiTinh=0
b) Xóa View
Ta có thể sử dụng câu lệnh DROP VIEW để hủy (xóa) một view trong CSDL với cú pháp
sau:
DROP VIEW view_name
Giải thích:
- view_name là tên của View cần xóa.
- Chúng ta có thể xóa nhiều View bằng một câu lệnh DROP VIEW. Tên của các View cần
xóa được phân cách bởi dấu “,”
Ghi chú:
- Việc hủy View không gây ảnh hưởng gì đến các bảng cơ sở của view.
- Việc hủy View chỉ hủy các định nghĩa của view và các quyền được phân trên view.
- Nếu truy vấn bất kể một View nào tham chiếu đến một bảng đã bị xóa, chúng ta sẽ nhận
được thông báo lỗi.
Ví dụ:
DROP VIEW vwnhanvien
c) Đổi tên View
Chúng ta có thể đổi tên một view mà không cần xóa nó. Điều này đảm bảo cho các quyền
được phân trên view không bị mất. Có thể được đổi tên view bằng cách sử dụng stored procedure
hệ thống sp_rename với cú pháp sau:
sp_rename old_viewname, new_viewname
Giải thích:
old_viewname là tên view cần đổi
new_viewname là tên mới của view
Chú ý: Khi đổi tên view, chúng ta phải chắc chắn rằng:
- View phải nằm trong database hiện tại
- Tên mới phải được đặt đúng theo quy tắc đặt tên
- Chỉ người tạo view mới có quyền đổi tên
- Người tạo database cũng có quyền đổi tên view
- Định nghĩa View tồn tại ngay cả khi bảng tham gia đã bị xoá
2.7. Sử dụng View
Các chức năng thực hiện trên View tương tự với các chức năng thực hiện đối với Table.
Chúng ta có thể thực thi các câu lệnh INSERT, UPDATE, SELECT và DELETE trên View.
Ví dụ: Đưa ra màn hình danh sách nhân viên có giới tính bằng 0
SELECT *
FROM vwGioiTinh
Khi chúng ta thay đổi dữ liệu (bằng việc sử dụng các lệnh INSERT, UPDATE, DELETE)
trên View đồng nghĩa với chúng ta thay đổi dữ liệu trên các bảng mà View đó đang tham chiếu.
Tuy nhiên khi sử dụng View để cập nhật dữ liệu ta phải tuân theo các quy luật sau: Câu lệnh
SELECT trong định nghĩa View không được chứa:
- Các hàm nhóm dữ liệu hoặc biểu thức
- Các mệnh đề TOP, GROUP BY, UNION, DISTINCT.
Việc áp dụng View để cập nhật dữ liệu chỉ sử dụng với View đơn giản (tham chiếu đến duy nhất
một Table).
Ghi chú: Nếu muốn hiệu chỉnh dữ liệu trên nhiều bảng (View phức tạp) ta phải sử dụng
INSTEAD OF TRIGGER

CHƯƠNG 3. THỦ TỤC LƯU TRỮ (STORED PROCEDURE)


Nội dung chính của chương trình bày những kiến thức cơ bản về thủ tục lưu trữ. Chúng ta sẽ
được khám phá cấu trúc và chức năng của thủ tục nội tại, trong đó những tính năng mới được thể hiện
qua việc khai báo theo nhóm, các loại tham số, mượn quyền thực thi và lợi ích khi sử dụng thủ tục nội
tại trong ứng dụng thực tế. Mục đích của chương giúp người đọc tiếp cận với các loại thủ tục nói
chung và đặc biệt là thủ tục do người dùng định nghĩa, vận dụng linh hoạt các câu lệnh T-SQL để tạo
được thủ tục giúp cho quá trình triển khai dự án thực tế được dễ dàng
3.1 Khái niệm cơ bản về thủ tục lưu trữ
Thủ tục lưu trữ được xây dựng từ tập các câu lệnh của T-SQL để thực hiện một mục đích
nào đó. Thủ tục đã được biên dịch, lưu trữ trong Cơ sở dữ liệu với một tên gọi nào đó và được
thực thi như một đơn vị lệnh
3.2 Các ưu điểm của thủ tục lưu trữ
- Thực hiện nhanh hơn: Khi cần thực hiện một lượng lớn câu lệnh T-SQL, thủ tục lưu trữ thực
hiện nhanh hơn vì khi máy chủ nhận được nhiều cầu lệnh cùng một lúc đều phải kiểm tra tính
hợp lệ quyền của tài khoản từ máy khách và các tham số khác. Thủ tục chỉ thực hiện biên dịch
một lần đầu tiên, những lần sau máy khách sẽ chạy thủ tục đã được biên dịch
- Làm giảm lưu lượng trên mạng: Thay cho vì máy khách phải gửi nhiều dòng lệnh từ các ứng
dụng đến máy chủ, khi sử dụng thủ tục thì nó chỉ cần gửi một lệnh, từ đó dẫn đến lưu lượng
thông tin lệnh truyền qua mạng giảm
- An ninh bảo mật hơn: Khi không muốn cho một user trực tiếp khai thác một đối tượng hay
bảng dữ liệu nào đó, mà cần cho user đó được khai thác thì thủ tục có thể giúp chúng ta gán
quyền khai thác cho người đó. Việc gán quyền khai thác như nói trên sẽ giúp cho vấn đề an
ninh bảo mật trong CSDL tốt hơn

CÂU HỎI ÔN TẬP


Câu 1: Định nghĩa bảng ảo.
Câu 2: Hãy trình bày ưu điểm của View.
Câu 3: Trình bày hạn chế khi định nghĩa View.
Câu 4: Tại sao phải sử dụng View?
Câu 5: Tại sao phải mã hóa View?

BÀI TẬP CUỐI CHƯƠNG 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 DMLOP để 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
TenLop Tên lớp học
Siso Sĩ số lớp học
Bảng DMTINH để 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
MaTinh Mã tỉnh, thành phố
TenTinh Tên tỉnh, thành phố
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 bảng ảo để đưa ra danh sách lớp học
Bài số 2: Tạo môt bảng ảo để đưa ra danh sách tỉnh
Bài số 3: Tạo một bảng ảo để đưa ra danh sách sinh viên có giới tính ‘nam’
Bài số 4: Tạo một bảng ảo để đưa ra danh sách sinh viên thuộc lớp học có tên lớp là ‘Tin học’
Bài số 5: Tạo một bảng ảo để đưa ra danh sách sinh viên có điểm trung bình cao nhất
Bài số 6: Tạo một bảng ảo để đưa ra danh sách sinh viên có giới tính ‘Nam’ và quê ở ‘Thái
Nguyên’
Bài số 7: Tạo một bảng ảo để đưa ra danh sách sinh viên có giới tính ‘Nữ, quê ở ‘Hà Nội’ và
học lớp “Tin Học”
Bài số 8: Tạo một bảng ảo để đưa ra danh sách sinh viên có điểm trung bình cảo nhất quê ở
“Thái Nguyên”
Bài số 9: Tạo một bảng ảo để đưa ra danh sách sinh viên giới tính ‘Nữ, có điểm trung bình
cao nhất
Bài số 10: Tạo một bảng ảo để đưa ra danh sách sinh viên có điểm trung bình thấp nhất
Bài 4: THỦ TỤC LƯU TRỮ (Số tiết: 3 tiết)
3.3 Phân loại thủ tục lưu trữ
Các Thủ tục lưu trữ có thể được phân thành 5 loại:
- Thủ tục lưu trữ hệ thống (System Stored Procedure): Là thủ tục được lưu trữ trong CSDL
Master và được đặt tên với tiếp đầu ngữ là sp_. Thủ tục loại này thường được sử dụng
trong quản trị CSDL và quản trị SQL SERVER
- Thủ tục lưu trữ được định nghĩa bởi người dùng (Local Stored Procedure): Đây là loại thủ
tục thường dùng nhất, nằm trong CSDL do người dùng tạo ra, thực hiện một công việc nào
đó. Thủ tục loại này thường được tạo bởi DBA (Database Administrator) hoặc người lập
trình
- Thủ tục lưu trữ tạm thời (Temporary Stored Procedure): Là thủ tục có tên bắt đầu bằng dấu
#. Chúng được lưu trữ trong CSDL tempdb và được tự động hủy khi SQL Server ngắt kết
nối
- Thủ tục lưu trữ từ xa (Remote Stored Procedure): là một thủ tục được gọi thực thi từ một
server từ xa
- Thủ tục lưu trữ mở rộng (Extended Stored Procedure): Là một thủ tục được tạo từ các
ngôn ngữ lập trình khác (không phải SQL Server) đã được biên dịch thành DLL. Tên thủ
tục được bắt đầu bằng tiền tố xp_. Ví dụ thủ tục xp_sendmail dùng gửi mail, thủ tục
xp_cmdshell dùng thực hiện lệnh của DOS (xp_cmdshell ‘dir c:\’)
3.4 Biến trong SQL SERVER
Biến là một đối tượng trong tập lệnh T-SQL mà nó dùng để lưu trữ dữ liệu. Biến phải được
khai báo trước khi dùng. Có 2 loại biến là biến cục bộ (local) và biến toàn cục (Global). Biến
kiểu Global được SQL Server đưa ra và chúng ta có thể dùng bất cứ khi nào và cũng không cần
khai báo (được xem như là những hàm chuẩn của SQl Server)
3.4.1 Biến cục bộ
- Biến cục bộ được khai báo trong phần thân của một bó lệnh hoặc một thủ tục
- Phạm vi hoạt động của biến bắt đầu từ điểm mà nó được khai báo cho đến khi kết thúc một
lô (batch) hoặc stored procedure hoặc Function mà nó được khai báo
- Tên của biến bắt đầu bằng ký tự @
a) Khai báo biến
DECLARE @<Tên_biến> <Kiểu dữ liệu>[,
@<Tên_biến> <Kiểu dữ liệu>[,
@<Tên_biến> <Kiểu dữ liệu>]]
Ghi chú:
Nếu biến vừa khai báo xong thì biến mặc định được gán giá trị là NULL.
b) Gán giá trị cho biến
Để gán biến ta dùng lệnh SET hoặc dùng câu lệnh SELECT:
SET @<Tên_biến>=<Giá_trị>|<biểu_thức>| (Câu lệnh SELECT)
Hoặc
SELECT @<Tên_biến> = Tên_Cột From Tên_Bảng Where….
Ghi chú:
Giá trị gán vào biến phải có kiểu dữ liệu tương tự với kiểu dữ liệu đã khai báo. Không nhất
thiết gán biến với một giá trị cụ thể, mà đôi khi giá trị đó là kết quả của câu lệnh truy vấn
SELECT
Ví dụ: Gán biến bằng giá trị cụ thể
Declare @x int, @y int
Set @y = 5
Set @x = @y + 3
Ví dụ: Gán biến bằng giá trị của SELECT
Declare @x int
Set @x=(Select count(*) From SinhVien)
Print ‘Tổng số sinh viên là’ + Cast(@x char(10))
Ví dụ trên có thể viết như sau :
Declare @x int
SELECT @x= count(*) From SinhVien
Print ‘Tổng số sinh viên là’ + Cast(@x char(10))
3.4.2 Biến toàn cục
Biến kiểu Global được SQL Server đưa ra và chúng ta có thể dùng bất cứ khi nào và cũng
không cần khai báo (được xem như là những hàm chuẩn của SQl Server). Biến toàn cục tên được
bắt đầu bằng 2 ký tự @@
3.5 Các cấu trúc điều khiển trong SQL SERVER
3.5.1 Phát biểu IF…ELSE
Cú pháp:
IF <biểu thức điều kiện>
<Lệnh đơn>|<Khối lệnh>
ELSE
<Lệnh đơn>|<Khối lệnh>
Ghi chú:
• Khối lệnh là một tập các câu lệnh của T-SQL
• Khối lệnh phải được bao trong cặp từ khóa BEGIN …… END
Ví dụ: Kiểm tra xem trong CSDL quản lý Bán hàng có chứa khách hàng đến từ Thái Nguyên?
USE QL_BanHang
go
IF (SELECT COUNT(*) FROM Khach
WHERE DiaChi='Thai Nguyen') > 0
BEGIN
Print ' Có tồn tại các khách hàng đến từ Thái nguyên trong cơ sở dữ liệu.'
END
ELSE
PRINT ' Không có khách hàng đến từ Thái nguyên trong cơ sở dữ liệu.'
3.5.2 Biểu thức CASE
Biểu thức CASE là một biểu thức điều kiện được áp dụng bên trong một phát biểu khác.
Biểu thức CASE có thể sử dụng ở hai dạng khác nhau.
Cú pháp:
CASE <Biểu_thức>
WHEN <Giá_tri_ 1> THEN <Biểu_thức_ kết_quả_1>
WHEN <Giá_tri_ 2> THEN <Biểu_thức_ kết_quả_2>
WHEN <Giá_tri_ 3> THEN <Biểu_thức_ kết_quả_3>
[…]
[ELSE <Biểu_thức_kết_quả_N>]
Trong đó:
- Biểu thức: biểu thức tính toán hoặc tên cột dữ liệu của bảng được dùng để so sánh.
- Giá trị 1, giá trị 2: là các giá trị cụ thể để so sánh bằng (=) với biểu thức.
- Biểu_thức_kết_quả_1, biểu thức kết quả 2: là các biểu thức sẽ được trả về khi việc so
sánh của biểu thức bằng với các giá trị so sánh tương ứng.
- Biểu_thức_kết_quả_N: là biểu thức sẽ được trả về khi tất cả các trường hợp so sánh đều
không bằng với các giá trị đưa ra.
Ví dụ: Sử dụng phát biểu CASE để tính ngày mua hàng là ngày thứ mấy trong tuần.
Use QL_BanHang
Go
SELECT SoHD, MaK, Ngay, Thu=CASE DATEPART(w,Ngay)
WHEN 1 THEN ‘Chủ Nhật’
WHEN 2 THEN ‘Thứ 2’
WHEN 3 THEN ‘Thứ 3’
WHEN 4 THEN ‘Thứ 4’
WHEN 5 THEN ‘Thứ 5’
WHEN 6 THEN ‘Thứ 6’
ELSE ‘Thứ 7’
END
FROM HoaDon
Go
Cú pháp CASE dạng tìm kiếm:
CASE
WHEN <Biểu_thức_logic_1> THEN <Biểu_thức_kết_quả_1>
WHEN < Biểu_thức_logic_2> THEN < Biểu_thức_kết_quả_2>
[……..]
WHEN < Biểu_thức_logic_n> THEN < Biểu_thức_kết_quả_n>
[ELSE <Biểu_thức_kết_quả_N]
Trong đó:
- Biểu_thức_logic_1, Biểu_thức_logic_2: là các biểu thức logic
- Biểu_thức_kết_quả_1, Biểu_thức_kết_quả_2: là các biểu thức sẽ được trả về khi một trong
các biểu thức logic so sánh có kết quả là đúng.
- Biểu_thức_kết_quả_N: là biểu thức sẽ được trả về khi tất cả các biểu thức logic so sánh
đưa ra đều sai.
Ví dụ: Cho bảng Diem(SBD, HoTen,NS,GT,TongDiem) để lưu tổng hợp điểm thi của các thí
sinh trong một đợt tuyển sinh. Hãy dựa vào bảng trên để đưa ra màn hình danh sách gồm các
thuộc tính (SBD, HoTen, NS, GT, TongDiem, Đo/Truot). Với Đo/Truot (Đỗ/Trượt) được tính
theo nguyên tắc nếu sinh viên nào có tổng điểm<20 thì ghi ‘Truot’ ngược lại ghi ‘Đo’
Select Diem.*, Do_Truot=CASE
WHEN TongDiem <20 THEN ‘Truot’
ELSE ‘Đo’
From Diem
3.5.3 Phát biểu WHILE
Phát biểu WHILE là phát biểu điều khiển lặp. Vòng lặp sẽ được thực hiện cho đến khi biểu
thức logic trong While nhận giá trị False.
Cú pháp:
WHILE <Biểu thức logic>
<Các phát biểu SQL>
[Begin
<Các phát biểu SQL>
[BREAK]
<Các phát biểu SQL>
[CONTINUE]
End]
Trong đó:
- Phát biểu BREAK dùng để thoát khỏi vòng lặp. Khi gặp BREAK thì quá trình xử lý sẽ
bỏ qua các phát biểu còn lại chưa xử lý.
- Phát biểu CONTINUE đối ngược với phát biểu BREAK, nếu gặp phát biểu này thì quá
trình xử lý sẽ quay lại đầu vòng lặp.
Sơ đồ tóm tắt ý nghĩa của cấu trúc lặp WHILE kèm với các từ khóa CONTINUE hoặc
BREAK

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?

BÀI TẬP CUỐI CHƯƠNG 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 DMLOP để 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
TenLop Tên lớp học
Siso Sĩ số lớp học
Bảng DMTINH để 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
MaTinh Mã tỉnh, thành phố
TenTinh Tên tỉnh, thành phố
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 thủ tục lưu trữ để đưa ra danh sách các lớp học
Bài số 2: Tạo thủ tục lưu trữ để đưa ra danh sách các tỉnh
Bài số 3: Tạo thủ tục lưu trữ với tham số vào là @GioiTinh để đưa ra danh sách sinh viên có
giới tính như tham số truyền vào
Bài số 4: Tạo thủ tục lưu trữ với tham số vào là @TenTinh để đưa ra danh sách sinh viên
thuộc lớp học có tên lớp trùng với tham số vào
Bài số 5: Tạo thủ tục lưu trữ với tham số vào là @DTB để đưa ra danh sách sinh viên có
điểm trung bình bằng với tham số vào
Bài số 6: Tạo thủ tục lưu trữ để đưa ra danh sách sinh viên có điểm trung bình cao nhất.
Bài số 7: Tạo thủ tục lưu trữ để đưa ra danh sách viên có điểm trung bình thấp nhất.
Bài số 8: Tạo thủ tục lưu trữ với tham số vào là @GioiTinh và @TenTinh để đưa ra danh
sách sinh viên có giới tính và tên tỉnh trùng với tham số đầu vào
Bài số 9: Tạo thủ tục lưu trữ với tham số vào là @ MaLop để đưa ra danh sách sinh viên
thuộc lớp học có mã lớp trùng với tham số vào
Bài số 10: Tạo thủ tục lưu trữ đưa ra danh sách các sinh viên có quê quán ở ‘Thái Nguyên’
và có điểm trung bình lớn hơn 7 và nhỏ hơn 10
CHƯƠNG 4. BẪY LỖI (TRIGGER)
Trong chương trước chúng ta đã tìm hiểu về cách định nghĩa và sử dụng thủ tục lưu trữ
trong SQL Server. Một dạng thủ tục lưu trữ tiếp tục được giới thiệu trong chương này là Trigger.
Trong chương này chúng ta tìm hiểu một số loại Trigger chính đó là: Insert Trigger, Update
Trigger, Delete Trigger. Các loại Trigger này dùng để kiểm soát dữ liệu khi người dùng thay
đổi. Mặc dù, chúng ta không thể sử dụng tham số như đã thực hiện trong chương thủ tục lưu trữ,
Trigger cho phép chúng ta thực thi tự động phát biểu SQL cùng với các tập lệnh khác dựa trên
hành động chính làm thay đổi dữ liệu. Các vấn đề chính sẽ được đề cập:
- Khái niệm Trigger.
- Phân loại Trigger.
- Ứng dụng của Trigger.
- Tạo Trigger.
- Cơ chế hoạt động của Trigger.
Bài 6: Bẫy lỗi (Trigger) (Số tiết: 3 tiết)
4.1 Khái niệm cơ bản về Trigger
Trigger là một loại STORE PROCEDURE đặc biệt. Trigger được xây dựng từ tập các câu
lệnh của T-SQL để thực hiện một số nhiệm vụ nào đó. Trigger đã được biên dịch và gắn vào
bảng dữ liệu (Table) hoặc bảng ảo (View). Trigger sẽ tự động thực thi khi bảng dữ liệu xảy ra
các sự kiện làm thay đổi dữ liệu như: UPDATE, INSERT hoặc DELETE. Tuy nhiên, khác với
thủ tục lưu trữ, trigger hoàn toàn không có tham số. Ngoài ra chúng ta không thể gọi thực hiện
trực tiếp trigger bằng lệnh EXECUTE như thủ tục lưu trữ hoặc bằng bất kỳ một lệnh nào khác.
4.2 Ứng dụng của Trigger
- Kiểm tra các ràng buộc toàn vẹn dữ liệu phức tạp (là những qui tắc được định nghĩa dùng
để kiểm tra tính toàn vẹn của dữ liệu trên nhiều cột hoặc nhiều dòng của các bảng khác nhau)
- Kiểm tra dữ liệu nhập vào phù hợp với mối quan hệ dữ liệu giữa các bả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.
- 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
dữ liệu bảng này thay đổi thì dữ liệu trong một hoặc nhiều bảng khác cũng tự động thay đổi
theo cho phù hợp).
- Sử dụng trigger nếu ta muốn các xử lý được tự động thực hiện khi có các thao tác INSERT,
UPDATE, DELETE xảy ra.
Ghi chú:
Các ràng buộc toàn vẹn dữ liệu đơn giản: như kiểm tra ràng buộc khóa chính, khóa ngoài,
kiểm tra miền giá trị, … ta nên sử dụng phương pháp mô tả chúng khi tạo Table (declarative
data integrity). Đặc điểm của phương pháp này là việc kiểm tra sẽ được thực hiện trước khi cho
phép ghi vào table.
4.3 Phân loại Trigger
Dựa vào ứng dụng của Trigger trên một bảng dữ liệu, Trigger được phân thành ba loại sau:
- INSERT Trigger: thực hiện thêm dữ liệu vào bảng
- UPDATE Trigger: Xảy ra khi thực hiện thay đổi dữ liệu vào bảng
- DELETE Trigger: Xảy ra khi thực hiện xóa dữ liệu trong bảng
- Tập hợp cả ba Trigger trên
4.4 Tạo Trigger
Sử dụng lệnh Create Trigger để tạo Trigger, có cú pháp sau:
CREATE 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 >
Trong đó:
- Tên_trigger: Tên của Trigger cần tạo, tên phải duy nhất và tuân theo quy tắc định danh.
- ON <Tên_bảng>| <Tên_view>: Chỉ định Table hoặc View mà Trigger được áp dụng.
- WITH ENCRYPTION: Dùng để mã hóa Trigger
- FOR | AFTER | INSTEAD OF: Dùng để phân loại trigger
- [DELETE],[INSERT],[UPDATE]: Sự kiện tự động gọi thực thi trigger.
- Thân_của_Trigger: Là tập các câu lệnh của T-SQL để thực hiện một số các yêu cầu nào
đó.
Ghi chú: Khi sử dụng CREATE TRIGGER, ta phải chú ý thực hiện những điều cốt lõi sau:
- Xác định tên của trigger. Tên của trigger có tính duy nhất trên 1 cơ sở dữ liệu (database).
- Chỉ định table hoặc view mà trên đó trigger được áp dụng.
- Chỉ định trigger thuộc loại INSTEAD OF hoặc AFTER.
- Chỉ định một biến cố hoặc nhiều biến cố kích hoạt trigger.
- Các câu lệnh tương ứng với nhiệm vụ mà chúng ta muốn trigger thực hiện.
Bài 7: Bẫy lỗi (Trigger) (Tiếp) (Số tiết: 3 tiết)
4.5 Cơ chế hoạt động của Trigger
Khi thực hiện việc thêm mới một bản ghi vào một table, thao tác này sẽ kích hoạt một
Insert trigger, SQL Server lưu trữ dữ liệu của mẫu tin vừa thêm mới vào một bảng tạm có tên là
Inserted. Tương tự khi thực hiện việc xóa mẫu tin của một table, thao tác này sẽ kích hoạt một
Delete trigger, SQL Server lưu trữ dữ liệu của mẫu tin vừa xóa vào một table có tên là Deleted.
Đối với thao tác sửa đổi dữ liệu (Update) được xem như là sự phối hợp của hai lệnh
DELETE và INSERT (xóa bỏ dữ liệu cũ và thêm vào dữ liệu mới sau khi sửa đổi) do thế mà đối
với các trigger liên quan đến việc sửa đổi dữ liệu thì chúng ta có thể tham chiếu đến cả hai bảng
trung gian Inserted và Deleted. Trong đó bảng Deleted sẽ chứa đựng thông tin của các dòng dữ
liệu đã bị hủy bỏ, các dòng dữ liệu cũ trước khi sửa đổi, bảng Inserted sẽ chứa đựng thông tin
của các dòng dữ liệu mới vừa thêm vào, các dòng dữ liệu sau khi sửa đổi.
Cấu trúc của hai bảng này hoàn toàn giống với cấu trúc của bảng dữ liệu mà trigger tham
chiếu tới. Hai bảng này được xem như là hai bảng tạm và chỉ tồn tại trong bộ nhớ (RAM) của
máy tính mà ta có thể sử dụng trong các xử lý của trigger. Bảng này chỉ tồn tại trong quá trình
Trigger thực thi.
Trigger loại INSTEAD OF sẽ bỏ qua hành động kích hoạt trigger (các thao tác insert,
delete, update), thay vào đó nó sẽ thực hiện các câu lệnh bên trong trigger. Cần lưu ý là nó sẽ bỏ
qua hành động tác động đến cơ sở dữ liệu nhưng việc lưu trữ dữ liệu vào các bảng Inserted (đối
với thao tác insert), deleted (đối với thao tác delete) vẫn được thực hiện.
Trigger loại AFTER|FOR nó có vai trò như là phần bổ sung của hành động kích hoạt
trigger. Các câu lệnh bên trong trigger loại này chỉ được thi hành sau khi hành động kích hoạt
đã được thực hiện rồi. Cần chú ý là các ràng buộc toàn vẹn loại mô tả sẽ được thực hiện trước,
kế đó các câu lệnh bên trong trigger sẽ được thực hiện sau. Trigger loại AFTER chỉ được phép
định nghĩa trên duy nhất đối tượng table (không thể định nghĩa trên view).
Trên một table, ta có thể định nghĩa cả 2 loại trigger. Nếu định nghĩa cả 2 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.
4.6 Một số ví dụ
Cho cơ sở dữ liệu quản lý bán hàng gồm các thuộc tính sau:

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.

CÂU HỎI ÔN TẬP


Câu 1: Trigger trong SQL Server là gì? Khi nào cần sử dụng Trigger?
Câu 2: Có những loại Trigger nào và cơ chế hoạt động của chúng ra sao?
Câu 3: Phân biệt After (for) Trigger và Instead of Trigger?
Câu 4: Phân biệt hai bảng ảo Inserted và Deleted?
Câu 5: Trình bày cách tạo Trigger?
Câu 6: Trigger có những đặc điểm và hạn chế nào?
Câu 7: Khi quản lý Trigger, chúng ta có thể thực hiện những thao tác nào?

BÀI TẬP CUỐI CHƯƠNG 4


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 DMLOP để 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
TenLop Tên lớp học
Siso Sĩ số lớp học
Bảng DMTINH để 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


MaTinh Mã tỉnh, thành phố
TenTinh Tên tỉnh, thành phố

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

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ỏ?
Cau 3: Câu lệnh nào để xử lý dữ liệu trong một con trỏ?
Câu 4: Câu lệnh nào dùng để kiểm tra trạng thái con trỏ?
Câu 5: Câu lệnh nào thay đổi dữ liệu tại vị trí con trỏ?

BÀI TẬP CUỐI CHƯƠNG


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ỉ
Ngaysinh Ngày sinh
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
Bảng NgoaiNgu (ngoại ngữ) gồm các thuộc tính sau:
Tên Thuộc tính Giải thích
MaNN Mã ngoại ngữ
TenNN Tên ngoại 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
MaNV Mã nhân viên
MaNN Mã ngoại ngữ
TrinhDo Trình độ ngoại ngữ
Yêu cầu:
Bài 1: Hãy tạo cấu trúc cơ sở dữ liệu trên (Với 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 đủ).
Bài 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.
Bài 3: Dùng kiểu dữ liệu CURSOR để tăng lương cho mỗi nhân viên lên 10%.
Bài 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”.
Bài 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.
Bài 6: Dùng kiểu dữ liệu CURSOR để đưa ra thông tin trình độ ngoại ngữ hiện có của nhân viên
Nguyễn Văn A
Bài 7: Dùng kiểu dữ liệu CURSOR để đưa ra thông tin nhân viên của phòng “Tài chính” có trình
độ ngoại ngữ tiếng Anh B1.
Bài 8: Dùng kiểu dữ liệu CURSOR để đưa ra thông tin nhân viên trên 40 tuổi.
Bài 9: Dùng kiểu dữ liệu CURSOR để đếm tổng số nhân viên có trình độ ngoại ngữ tiếng anh
B1
Bài 10: Dùng kiểu dữ liệu CURSOR để đưa thông tin các phòng chưa có nhân viên đạt trình độ
ngoại ngữ nào.
CHƯƠNG 6. QUẢN LÝ BẢO MẬT
Nội dung chính của chương trình bày những khái niệm cơ bản về bảo mật và phân quyền người
dùng trong quản trị dữ liệu trên 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ề bảo mật
- Các chế độ bảo mật
- Quản lý người dùng
- Cấp phát và thu hồi quyền người dùng
Bài 10: Quản lý bảo mật (Số tiết: 3 tiết)
6.1 Khái niệm cơ bản về bảo mật
Bảo mật là một trong những yếu tố đóng vai trò quan trọng đối với sự sống còn của cơ sở
dữ liệu. Hầu hết các hệ quản trị cơ sở dữ liệu thương mại hiện nay đều cung cấp khả năng bảo
mật cơ sở dữ liệu với những chức năng như:
- Cấp phát quyền truy cập cơ sở dữ liệu cho người dùng và các nhóm người dùng. Phát hiện
và ngăn chặn những thao tác trái phép của người sử dụng trên cơ sở dữ liệu
- Cấp phát quyền sử dụng các câu lệnh, các đối tượng cơ sở dữ liệu đối với người dùng
- Thu hồi (huỷ bỏ) quyền của người dùng
6.2 Các chế độ bảo mật
SQL Server có 2 chế độ bảo mật:
- Windows Authentication Mode (Windows Authentication)
- Mixed Mode (Windows Authentication and SQL Server Authentication)
a) Windows Authentication
Là chế độ bảo mật mà những User truy nhập SQL Server phải là những User của Windows.
Khi Server đặt ở chế độ bảo mật này, những User phải là những User được Windows quản lý
mới được truy nhập.
Hình 6.1: Các bước xác thực chế độ bảo mật Windows Authentication

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

Quyền Diễn giải

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

6.4.1 Cấp phát quyền


Câu lệnh GRANT được sử dụng để cấp phát quyền cho người dùng hay nhóm người
dùng trên các đối tượng cơ sở dữ liệu. Câu lệnh này thường được sử dụng trong các trường
hợp sau:
- Người sở hữu đối tượng cơ sở dữ liệu muốn cho phép người dùng khác quyền sử dụng
những đối tượng mà anh ta đang sở hữu.
- Người sở hữu cơ sở dữ liệu cấp phát quyền thực thi các câu lệnh (như CREATE
TABLE, CREATE VIEW,...) cho những người dùng khác.
a) Cấp phát quyền cho người dùng trên các đối tượng cơ sở dữ liệu
Chỉ có người sở hữu cơ sở dữ liệu hoặc người sở hữu đối tượng cơ sở dữ liệu mới có
thể cấp phát quyền cho người dùng trên các đối tượng cơ sở dữ liệu. Câu lệnh GRANT trong
trường hợp này có cú pháp như sau:
GRANT ALL | các_quyền_cấp_phát
[(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
TO danh_sách_người_dùng | nhóm_người_dùng
[WITH GRANT OPTION]
Trong đó:
ALL: Cấp phát tất cả các quyền cho người dùng trên đối tượng cơ sở dữ liệu được chỉ định. Các
quyền có thể cấp phát cho người dùng bao gồm:
- Đối với bảng, khung nhìn, và hàm trả về dữ liệu kiểu bảng: SELECT, INSERT,
DELETE, UPDATE và REFERENCES.
- Đối với cột trong bảng, khung nhìn: SELECT và UPDATE.
- Đối với thủ tục lưu trữ: EXECUTE.

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

CÂU HỎI ÔN TẬP


Câu 1: Trình bày khái niệm cơ bản về bảo mật?
Câu 2: Trình bày các loại bảo mật?
Câu 3: Trình bày cách thức tạo tài khoản người dùng? Cho ví dụ minh họa?
Câu 4: Trình bày cách thức cấp phát tài khoản người dùng? Cho ví dụ minh họa?
Câu 5: Trình bày về quyền người dùng trong SQL Server?
Cậu 6: Trình bày cách thức cấp quyền người dùng? Cho ví dụ minh họa?
Câu 7: Trình bày cách thức thu hồi quyền người dùng? Cho ví dụ minh họa?
BÀI TẬP CUỐI CHƯƠNG 6
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:

Tên Thuộc tính Giải thích

MaKhach Mã khách hàng

TenKhach Tên khách hàng

DiaChi Địa khách hàng


DienThoai Điện thoại

Bảng DMHang để lưu danh mục hàng hoá gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

MaHang Mã hàng

TenHang Tên hàng


Bảng HoaDonBan để lưu danh sách các đơn
DVT Đơn vị tính
hàng gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaKhach Mã khách hàng

NgayHD Ngày hoá đơn

DienGiai Diễn giải

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:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaHang Mã hàng

SoLuong Số lượng bán

DonGia Đơn giá

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.

11. Nêu các hệ quản trị CSDL mà em biết.


Câu trả lời: Một số hệ quản trị CSDL thông dụng: Microsoft SQL Server, Oracle, Access,
MySQL, MongoDB, PostgreSQL, Redis, DB2, Elasticsearch…
12.Trình bày các edition của hệ quản trị CSDL SQL Server. Các version của SQL Server.
Câu trả lời:
+ Các Edition của SQL Server: Enterprise, Standard, Personal, Developer, Desktop Engine,
Win CE, Trial.
+ Các version của SQL Server: SQL Server 6.5, SQL Server 7.0, SQL Server 2000, SQL
Server 2005, SQL Server 2008, SQL Server 2012, SQL Server 2014, SQL Server 2016, SQL
Server 2019.
13. Trình bày các thành phần quan trọng trong SQL Server?
Câu trả lời: Các thành phần quan trọng trong SQL Server:
+ Relational Database Engine - Lõi của SQL Server
+ Replication - Cơ chế tạo bản sao
+ Data Transformation Service (DTS)
+ Analysis Service - Một dịch vụ phân tích dữ liệu
+ English Query
+ MetaData Service
+ SQL Server Books Online
+ SQL Server Tools
14. Trình bày cú pháp của lệnh truy vấn dữ liệu select? Cho ví dụ minh hoạ
Câu trả lời:
Cú pháp của câu lệnh truy vấn dữ liệu select
Cú pháp tổng quát có dạng sau:
SELECT [ ALL | DISTINCT ] <danh_sách_chọn>
FROM <danh_sách_bảng>
[ WHERE <điều_kiện >]
[ GROUP BY <danh_sách_cột> ]
[ HAVING <điều_kiện> ]
[ ORDER BY <tên_cột> [ ASC | DESC ] [,..n]]
Ví dụ:
SELECT MaH,TenH,DVT,SoLuong
FROM Hang
15. Trình bày mệnh đề where và cách sử dụng trong câu lệnh truy vấn select? Cho ví dụ
minh hoạ
Câu trả lời:
Mệnh đề WHERE trong câu lệnh SELECT được sử dụng nhằm xác định các điều kiện đối
với việc truy xuất dữ liệu. Sau mệnh đề WHERE là một biểu thức logíc và chỉ những dòng dữ
liệu nào thoả mãn điều kiện được chỉ định mới được hiển thị trong kết quả truy vấn.
16. Trong mệnh đề WHERE thường sử dụng:
Câu trả lời:
· Các toán tử kết hợp điều kiện (AND, OR)
· Các toán tử so sánh.
· Toán tử phạm vi và toán tử tập hợp
· Các giá trị NULL

17. Các hàm nhóm trong SQL?


Câu trả lời: SQL có các hàm nhóm sau:

Hàm nhóm Chức năng

SUM(biểu_thức) Tính tổng các giá trị

AVG(biểu_thức) Tính trung bình của các giá trị

COUNT(biểu_thức) Đếm số các giá trị trong biểu thức

COUNT(*) Đếm số các dòng được chọn

MAX(biểu_thức) Tính giá trị lớn nhất

MIN(biểu_thức) Tính giá trị nhỏ nhất


Trong đó:
· Hàm SUM, AVG chỉ làm việc với các biểu thức số
· Hàm SUM, AVG, COUNT, MIN và MAX bỏ qua các giá trị NULL khi tính toán.
· Hàm COUNT(*) không bỏ qua các giá trị NULL
18. Một bảng có thể có nhiều hơn một khoá ngoại?
Câu trả lời: Đúng, một bảng có thể có nhiều khóa ngoài và chỉ có một khóa chính.\
19. Làm thế nào để lấy ra các hàng ngẫu nhiên từ một bảng?
Câu trả lời: Sử dụng mệnh đề SAMPLE chúng ta có thể chọn các hàng ngẫu nhiên.
Ví dụ: SELECT * FROM table_name SAMPLE (10);
20. DML và DDL là gì?
Câu trả lời: DML là viết tắt của Ngôn ngữ Thao tác Dữ liệu ( Data Manipulation Language):
INSERT, UPDATE và DELETE là các câu lệnh DML.
DDL là viết tắt của Ngôn ngữ Định nghĩa Dữ liệu (Data Definition Language): CREATE,
ALTER, DROP, RENAME là các câu lệnh DDL.
Bài tập thực hành
Bài thực hành số 1 (Số tiết: 5 tiết)

1. MỤC TIÊU:

Bài thực hành nhằm giúp sinh viên biết:

- 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.

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ý 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

TenLop Tên 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

MaTinh Mã tỉnh, thành phố


TenTinh Tên tỉnh, thành phố

+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:
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’

3.2. Bài thực hành cơ bản

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:

Tên Thuộc tính Giải thích

MaKhach Mã khách hàng

TenKhach Tên khách hàng


Quê quán Quê của khách hàng (Tỉnh/TP)

DienThoai Điện thoại


+ Bảng DMHang để lưu danh mục hàng hoá gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

MaHang Mã hàng

TenHang Tên hàng

DVT Đơn vị tính

NOI_SX Nơi sản xuất


+ Bảng HoaDonBan để lưu danh sách các đơn hàng gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaKhach Mã khách hàng

NgayHD Ngày lập hoá đơn

DienGiai Diễn giải

+ 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:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaHang Mã hàng

SoLuong Số lượng bán

DonGia Đơn giá


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 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:

Tên Thuộc tính Giải thích

MaK Mã khách hàng

TenK Tên khách hàng

ĐiaChi Địa chỉ khách

SoDT Số điện thoại

+ 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:

Tên Thuộc tính Giải thích


MaN Mã nhà

TenChuNha Tên chủ nhà

GiaThue Giá thuê

DiaChiNha Địa chỉ nhà

+Bảng HOPDONG để lưu thông tin về các hợp đồng thuê nhà của khách, gồm:

Tên Thuộc tính Giải thích

SoHĐ Số hợp đồng

MaN Mã nhà

MaK Mã khách

NgayBĐ Ngày bắt đầu hợp đồng

NgayKT Ngày kết thúc hợp đồ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 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:

Tên Thuộc tính Giải thích

MaLop Mã lớp học


TenLop Tên 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

MaTinh Mã tỉnh, thành phố

TenTinh Tên tỉnh, thành phố

+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:
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

Cho cơ sở dữ liệu quản lý bán hàng như trên.


Yêu cầu:

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:

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 DETAI chứa danh sách các đề tài thực tập gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

MaDT Mã số đề tài

TenDT Tên đề tài


GVHD Họ và tên giáo viên hướng dẫn đề tài

+ 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:

Tên Thuộc tính Giải thích

MaDT Mã số đề tài

MaSV Mã số sinh viên

NTT Nơi sinh viên đến thực tập

KQ Kết quả thực tập của sv theo đề tài đã chọ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 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:

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ả

SL Số lượng sách

+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ả

DonVi Đơn vị công tác của độ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/ 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

MaLop Mã lớp học

TenLop Tên 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

MaTinh Mã tỉnh, thành phố

TenTinh Tên tỉnh, thành phố

+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:
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:

Tên Thuộc tính Giải thích

MaTCD Mã tổ công đoàn

TenTCD Tên tổ công đoàn


+ Bảng CONGDOAN để lưu thông tin về các đoàn viên gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

MaCDV Mã công đoàn viên

TenCDV Tên công đoàn viên

NgayS Ngày sinh

NgayV Ngày ra nhập công đoàn

MaTCD Mã tổ công đoàn

+ 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:

Tên Thuộc tính Giải thích

MaCDV Mã đoàn viên

MSKT Mã số khen thưởng

Ldo Lý do khen thưởng

Nam Năm khen thưở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 @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:

Tên Thuộc tính Giải thích


MaM Mã môn
TenM Tên môn
TinChi Số tín chỉ

+ 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:

Tên Thuộc tính Giải thích


Malop Mã lớp
Tenlop Tên lớp
+ Bảng SINHVIEN để lưu 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
Tensv Tên sinh viên
Ngaysinh Ngày sinh
Malop Mã lớp
+ Bảng DIEMRL để lưu thông tin về tình hình điểm rèn luyện của 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
Hocky Học kỳ
Nam Năm học
Diem Điểm rèn luyệ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 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:

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

+ Bảng NgoaiNgu (ngoại ngữ) gồm các thuộc tính sau:

Tên Thuộc tính Giải thích


MaNN Mã ngoại ngữ
TenNN Tên ngoại 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
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

+ Bảng HocVi (học vị) gồm các thuộc tính sau:

Tên Thuộc tính Giải thích


MaHV Mã học vị
TenHV Tên học vị
+ Bảng NV_TDHV (trình độ học vị của nhân viên) :

Tên Thuộc tính Giải thích


MaNV Mã nhân viên
MaHV Mã trình độ học vị
ThoiGian Ngày tháng năm đạt trình độ này

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:

Tên Thuộc tính Giải thích


MaTS Mã tài sản
MaP Mã phòng
SoLuong Số lượng
NgayPP Ngày phân phối tài sản
GhiChu Ghi chú
Yêu cầu:

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:

Tên Thuộc tính Giải thích


MaSV Mã sinh viên
TenSV Tên sinh viên
NgaySinh Ngày sinh
GioiTinh Giới tính
QueQuan Địa chỉ
+ Bảng MonHoc chứa danh mục các môn học gồm các trường sau:

Tên Thuộc tính Giải thích


MaM Mã môn
TenM Tên môn
SOTC Số tín chỉ

+ 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:

Tên Thuộc tính Giải thích


MaM Mã môn
MaSV Mã sinh viên
DiemThi Đ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 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ài 2: Cho cơ sở dữ liệu quản lý dự án gồm các bảng dữ liệu sau:


+ Bảng NHANVIEN chứa danh sách các 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
Hoten Họ tên nhân viên
NgaySinh Ngày sinh
GT Giới tính
+ Bảng DUAN chứa thông tin về các dự án gồm có các thuộc tính sau:
Tên Thuộc tính Giải thích
MaDA Mã dự án
TenDA Tên dự án
NganSach Ngân sách

+ 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.

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ý 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

TenLop Tên 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

MaTinh Mã tỉnh, thành phố

TenTinh Tên tỉnh, thành phố

+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:
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:

Tên Thuộc tính Giải thích

MaSV Mã sinh viên

TenSV Tên sinh viên

NgaySinh Ngày sinh

GioiTinh Giới tính

QueQuan Địa chỉ

+ Bảng MonHoc chứa danh mục các môn học gồm các trường sau:

Tên Thuộc tính Giải thích

MaM Mã môn

TenM Tên môn

DVHT Đơn vị học trình

+ 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:

Tên Thuộc tính Giải thích

MaM Mã môn

MaSV Mã sinh viên

DiemThi Đ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 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:

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 để lưu thông tin về các phòng có trong khách sạn gồm các thuộc tính sau:

Tên Thuộc Giải thích


tính

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 thuê 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/ 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 danh sách khách hàng ngày hôm nay phải trả phòng.
4/ Dùng kiểu dữ liệu CURSOR để đưa ra danh sách khách hàng hiện tại đang thuê phòng tại
khách sạn.
5/ Dùng kiểu dữ liệu CURSOR để đưa ra danh các phòng hiện tại chưa có khách hàng đặt thuê
phòng.
6/ Dùng kiểu dữ liệu CURSOR để đưa ra thông tin về các khách hàng có số ngày đặt phòng lớn
nhất.
Bài 3: 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:

Tên Thuộc tính Giải thích

MaKhach Mã khách hàng

TenKhach Tên khách hàng

DiaChi Địa khách hàng

DienThoai Điện thoại


+ Bảng DMHang để lưu danh mục hàng hoá gồm các thuộc tính sau:
Tên Thuộc tính Giải thích

MaHang Mã hàng

TenHang Tên hàng

DVT Đơn vị tính

+ Bảng HoaDonBan để lưu danh sách các đơn hàng gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaKhach Mã khách hàng

NgayHD Ngày hoá đơn

DienGiai Diễn giải

+ 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:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaHang Mã hàng

SoLuong Số lượng bán

DonGia Đơn giá

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

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

+ Bảng NgoaiNgu (ngoại ngữ) gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

MaNN Mã ngoại ngữ

TenNN Tên ngoại 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

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/ 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.

- Kiểm tra 2 tiết thực hành trên máy tính.

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.

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ý 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:

Tên Thuộc tính Giải thích

MaKhach Mã khách hàng

TenKhach Tên khách hàng

DiaChi Địa khách hàng

DienThoai Điện thoại


+ Bảng DMHang để lưu danh mục hàng hoá gồm các thuộc tính sau:

Tên Thuộc tính Giải thích


MaHang Mã hàng

TenHang Tên hàng

DVT Đơn vị tính

+ Bảng HoaDonBan để lưu danh sách các đơn hàng gồm các thuộc tính sau:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaKhach Mã khách hàng

NgayHD Ngày hoá đơn

DienGiai Diễn giải

+ 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:

Tên Thuộc tính Giải thích

SoHD Số hoá đơn bán

MaHang Mã hàng

SoLuong Số lượng bán

DonGia Đơn giá


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à ‘HA’ và mật khẩu là ‘HA1’
3/ Thay đổi mật khẩu người dùng là ‘HAI’
4/ 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.
1/
CREATE DATABASE BANHANG
CREATE TABLE DMKHACH(
MK NVARCHAR(10) PRIMARY KEY,
TK NVARCHAR(30) NOT NULL,
DC NVARCHAR(30),
DT NVARCHAR(30))
CREATE TABLE DMHANG(
MH NVARCHAR(10) PRIMARY KEY,
TH NVARCHAR(30) NOT NULL,
DVT NVARCHAR(30) NOT NULL)
CREATE TABLE HDB(
SHD INT PRIMARY KEY,
MK NVARCHAR(10) NOT NULL,
NGAYHD SMALLDATETIME NOT NULL,
DG NVARCHAR(30),
CONSTRAINT KN_MK FOREIGN KEY (MK)REFERENCES DMKHACH(MK))
CREATE TABLE CTHD(
SHD INT,
MH NVARCHAR(10) NOT NULL,
SL INT NOT NULL,
DGIA INT NOT NULL,
CONSTRAINT KC_CTHD PRIMARY KEY (SHD,MH),
CONSTRAINT KN_MH FOREIGN KEY (MH) REFERENCES DMHANG(MH))
2/
EXEC SP_ADDLOGIN ‘HA’, ‘HA1’, ‘QLBanHang’
3/
SP_Password ‘HA1’, ‘HAI’, ‘HA’
4/
GRANT SELECT, INSERT, UPDATE
ON DMHang
TO HA
Cho phép người dùng Ha quyền xem các thuộc tính (MaH,TenH,SoLuong)
GRANT SELECT
ON DMHang(MaH,TenH,SoLuong) ON DMHang) 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ý 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

TenLop Tên 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

MaTinh Mã tỉnh, thành phố

TenTinh Tên tỉnh, thành phố

+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:
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à HA với mật khẩu truy cập là ‘123’
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 SINHVIEN
4/ Cho phép người dùng HA quyền xem dữ liệu trên bảng LOP đồng thời có thể chuyển tiếp
quyền này cho người dùng khác.
5/ Hủy bỏ quyền của người dùng HA.
Bài 2: Bài tập ôn tập

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

TenLop Tên 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

MaTinh Mã tỉnh, thành phố

TenTinh Tên tỉnh, thành phố

+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:

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/ Hãy thực hiện các yêu cầu sau:

1. Hãy nhập dữ liệu cho các bảng dữ liệu của tệp CSDL ở trên.

2. Hãy sửa thông tin cho bảng SinhVien

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

3/ Hãy tạo các View sau:

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

4/. Hãy tạo các thủ tục lưu trữ sau:

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

5/ Hãy tạo các Trigger sau:


1. Tạo TRIGGER để kiểm tra dữ liệu khi nhập vào bảng sinh viên: nếu điểm trung bình
nhập vào <0 thì

đư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.

6/ Hãy thực hiện các yêu cầu sau:

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.

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 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/ 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.

5/ Hủy bỏ quyền của người dùng ND01.

You might also like