Tải bản đầy đủ (.pdf) (21 trang)

00 tai lieu huong dan th qtcsdl 1617 vtmhang

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.34 MB, 21 trang )


 

Stored
 Procedure
 và
 Function
 
 
 

Tóm
 tắt
 nội
 dung
 bài
 thực
 hành:
 
Lập
  trình
  trên
  môi
  trường
  SQL
  Server
  với
  Stored
 
Procedure
 và


 Function
 
 
 
 
 
 
 

Bộ môn Hệ thống thông tin

 

Khoa Công nghệ thông tin
ĐH Khoa học tự nhiên TP HCM



 
MỤC
 LỤC
 

 
1
 

Mục
 tiêu
 và

 tóm
 tắt
 nội
 dung
 ...........................................................................................................................
 1
 

2
 

Hướng
 dẫn
 chi
 tiết
 ................................................................................................................................................
 1
 
2.1
  Stored
 Procedure
 (Đọc
 là
 Stored
 Procedure
 hoặc
 Procedure)
 ...................................................
 1
 

2.1.1
  Giới
 thiệu
 ...................................................................................................................................................
 1
 
2.1.2
  Cú
 pháp
 .......................................................................................................................................................
 2
 
2.1.3
  Ví
 dụ
 .............................................................................................................................................................
 4
 
2.2
  Function
 .............................................................................................................................................................
 7
 
2.2.1
  Giới
 thiệu
 ...................................................................................................................................................
 7
 
2.2.2

  Cú
 pháp
 .......................................................................................................................................................
 7
 
2.2.3
  Ví
 dụ
 .............................................................................................................................................................
 7
 

3
 

Bài
 tập
 tại
 lớp
 ..........................................................................................................................................................
 8
 

4
 

Bài
 tập
 về
 nhà

 ......................................................................................................................................................
 11
 


 



 
STORED
 PROCEDURE
 VÀ
 FUNCTION
 
 
 

1 Mục
 tiêu
 và
 tóm
 tắt
 nội
 dung
 
 
Sau
 khi
 hồn

 thành
 bài
 thực
 hành
 này
 sinh
 viên
 sẽ
 biết
 được:
 
 
-­‐

Kỹ
 thuật
 viết
 hàm
 và
 thủ
 tục
 trong
 SQL
 Server
 cơ
 bản
 
 

2 Hướng

 dẫn
 chi
 tiết
 
 
2.1 Stored
 Procedure
 (Đọc
 là
 Stored
 Procedure
 hoặc
 Procedure)
 
2.1.1 Giới
 thiệu
 
Khi
  chúng
  ta
  tạo
  một
  ứng
  dụng
  với
  Microsoft
  SQL
  Server,
  ngơn
  ngữ

  lập
  trình
 
Transact-­‐SQL
  là
  ngơn
  ngữ
  chính
  giao
  tiếp
  giữa
  ứng
  dụng
  và
  database
  của
  SQL
 
Server.
 Khi
 chúng
 ta
 tạo
 các
 chương
 trình
 bằng
 Transact-­‐SQL,
 hai
 phương

 pháp
 
chính
 có
 thể
 dùng
 để
 lưu
 trữ
 và
 thực
 thi
 cho
 các
 chương
 trình
 là:
 
-­‐

Chúng
 ta
 có
 thể
 lưu
 trữ
 các
 chương
 trình
 cục

 bộ
 và
 tạo
 các
 ứng
 dụng
 để
 gởi
 
các
 lệnh
 đến
 SQL
 Server
 và
 xử
 lý
 các
 kết
 quả,
 

-­‐

Chúng
  ta
  có
  thể
  lưu
  trữ

  những
  chương
  trình
  như
  các
  stored
  procedure
 
trong
 SQL
 Server
 và
 tạo
 ứng
 dụng
 để
 gọi
 thực
 thi
 các
 stored
 procedure
 và
 
xử
 lý
 các
 kết
 quả.
 


Đặc
 tính
 của
 Stored-­‐procedure
 trong
 SQL
 Server
 :
 
-­‐

Chấp
  nhận
  những
  tham
  số
  vào
  và
  trả
  về
  những
  giá
  trị
  được
  chứa
  trong
  các
 
tham

 số
 ra
 để
 gọi
 những
 thủ
 tục
 hoặc
 xử
 lý
 theo
 lô.
 

-­‐

Chứa
  các
  lệnh
  của
  chương
  trình
  để
  thực
  hiện
  các
  xử
  lý
  trong
  database,

  bao
 
gồm
 cả
 lệnh
 gọi
 các
 thủ
 tục
 khác
 thực
 thi.
 

-­‐

Trả
 về
 các
 trạng
 thái
 giá
 trị
 để
 gọi
 những
 thủ
 tục
 hoặc
 thực

 hiện
 các
 xử
 lý
 
theo
 lô
 để
 cho
 biết
 việc
 thực
 hiện
 thành
 công
 hay
 thất
 bại,
 nếu
 thất
 bại
 thì
 

 do
 vì
 sao
 thất
 bại.
 


Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 1
 



 
Ta
  có

  thể
  dùng
  Transact–SQL
  EXCUTE
  để
  thực
  thi
  các
  stored
  procedure.
  Stored
 
procedure
 khác
 với
 các
 hàm
 xử
 lý
 là
 giá
 trị
 trả
 về
 của
 chúng
 không
 chứa
 trong
 tên

 

 chúng
 không
 được
 sử
 dụng
 trực
 tiếp
 trong
 biểu
 thức.
 
Stored
 procedure
 có
 những
 thuận
 lợi
 so
 với
 các
 chương
 trình
 Transact-­‐SQL
 lưu
 
trữ
 cục
 bộ

 là:
 
-­‐

Stored
  procedure
  cho
  phép
  điều
  chỉnh
  chương
  trình
  cho
  phù
  hợp:
 
Chúng
  ta
  có
  chỉ
  tạo
  stored
  procedure
  một
  lần
  và
  lưu
  trữ
  trong
  database

 
một
 lần,
 trong
 chương
 trình
 chúng
 ta
 có
 thể
 gọi
 nó
 với
 số
 lần
 bất
 kỳ.
 Stored
 
procedure
  có
  thể
  được
  chỉ
  rõ
  do
  một
  người
  nào
  đó

  tạo
  ra
  và
  sự
  thay
  đổi
 
của
 chúng
 hoàn
 toàn
 độc
 lập
 với
 source
 code
 của
 chương
 trình.
 

-­‐

Stored
 procedure
 cho
 phép
 thực
 thi
 nhanh

 hơn:
 nếu
 sự
 xử
 lý
 yêu
 cầu
 
một
 đoạn
 source
 code
 Transact
 –
 SQL
 khá
 lớn
 hoặc
 việc
 thực
 thi
 mang
 tính
 
lặp
 đi
 lặp
 lại
 thì
 stored

 procedure
 thực
 hiện
 nhanh
 hơn
 việc
 thực
 hiện
 hàng
 
loạt
  các
  lệnh
  Transact-­‐SQL.
  Chúng
  được
  phân
  tích
  cú
  pháp
  và
  tối
  ưu
  hóa
 
trong
  lần
  thực
  thi
  đầu

  tiên
  và
  một
  phiên
  bản
  dịch
  của
  chúng
  trong
  đó
  sẽ
 
được
  lưu
  trong
  bộ
  nhớ
  để
  sử
  dụng
  cho
  lần
  sau,
  nghĩa
  là
  trong
  những
  lần
 
thực

  hiện
  sau
  chúng
  không
  cần
  phải
  phân
  tích
  cú
  pháp
  và
  tối
  ưu
  lại,
  mà
 
chúng
 sẽ
 sử
 dụng
 kết
 quả
 đã
 được
 biên
 dịch
 trong
 lần
 đầu
 tiên.

 

-­‐

Stored
 procedure
 có
 thể
 làm
 giảm
 bớt
 vấn
 đề
 kẹt
 đường
 truyền
 mạng:
 
giả
 sử
 một
 xử
 lý
 mà
 có
 sử
 dụng
 hàng
 trăm
 lệnh

 của
 Transact-­‐SQL
 và
 việc
 
thực
  hiện
  thơng
  qua
  từng
  dịng
  lệnh
  đơn,
  như
  vậy
  việc
  thực
  thông
  qua
 
stored
 procedure
 sẽ
 tốt
 hơn,
 vì
 nếu
 khơng
 khi
 thực

 hiện
 chúng
 ta
 phải
 gởi
 
hàng
 trăm
 lệnh
 đó
 lên
 mạng
 và
 điều
 này
 sẽ
 dẫn
 đến
 tình
 trạng
 kẹt
 mạng.
 

-­‐

Stored
  procedure
  có
  thể

  sử
  dụng
  trong
  vấn
  đề
  bảo
  mật
  của
  máy:
  vì
 
người
 sử
 dụng
 có
 thể
 được
 phân
 cấp
 những
 quyền
 để
 sử
 dụng
 các
 stored
 
procedure
  này,
  thậm

  chí
  họ
  khơng
  được
  phép
  thực
  thi
  trực
  tiếp
  những
 
stored
 procedure
 này.
 

2.1.2 Cú
 pháp
 
Một
 Stored
 procedure
 được
 định
 nghĩa
 gồm
 những
 thành
 phần
 chính

 sau:
 


 



 
-­‐

Tên
 của
 stored
 procedure
 

-­‐

Các
 tham
 số
 

-­‐

Thân
  của
  stored
  procedure:

  bao
  gồm
  các
  lệnh
  của
  Transact-­‐SQL
  dùng
  để
 
thực
 thi
 procedure.
 

Một
 stored
 procedure
 được
 tạo
 bằng
 lệnh
 Create
 Procedure,
 và
 có
 thể
 thay
 đổi
 bằng
 

cách
  dùng
  lệnh
  Alter
  Procedure,
  và
  có
  thể
  xóa
  bằng
  cách
  dùng
  lệnh
  Drop
  Procedure
 
trong
 lập
 lệnh
 của
 Transact
 –
 SQL
 
Tạo
 procedure:
 
 
CREATE
 PROCEDURE

 procedure_name
 

 

{@parameter
 data_type
 input/output
 }/*các
 biến
 tham
 số
 vào
 ra*/
 

AS
 
 

 

[khai
 báo
 các
 biến
 cho
 xử
 lý]
 



 

{Các
 câu
 lệnh
 transact-­‐sql}
 


 

RETURN
 value
 -­‐-­‐
 Stored
 procedure
 có
 thể
 trả
 về
 giá
 trị
 hoặc
 khơng
 
 
 
 



 
Một
 số
 lưu
 ý
 khi
 viết
 stored
 procedure:
 
-­‐-­‐
 1.
 Ghi
 chú
 1,
 một
 dòng
 
 
/*
 2.
 Ghi
 chú
 2
 
 
Nhiều
 dòng

 
 */
 
/*3.
 Khai
 báo
 biến*/
 
DECLARE
 @parameter_name
 data_type
 
 
/*4.
 Gán
 giá
 trị
 cho
 biến*/
 
SET
 @parameter_name=value
 
 
SELECT
 @parameter_name=column
 FROM
 …
 
/*5.

 In
 thơng
 báo
 ra
 màn
 hình*/
 
print
 N‘Chuỗi
 thông
 báo
 unicode’
 
/*6.
 Thông
 báo
 lỗi
 */
 
raiserror
 (N‘Nội
 dung
 thông
 báo
 lỗi
 ’,
 16,
 1)
 
/*7.

 Lệnh
 rẽ
 nhánh
 */
 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 3
 




 
IF
 (điều
 kiện-­‐có
 thể
 sử
 dụng
 câu
 truy
 vấn
 con
 và
 từ
 khoá
 EXISTS)
 
BEGIN
 
 

 

{Các
 lệnh
 nếu
 thoả
 điều
 kiện

 /
 nếu
 chỉ
 có
 1
 lệnh
 thì
 khơng
 cần
 BEGIN
 …
 END}
 
 

END
 
 
/*8.
 Lệnh
 rẽ
 nhánh
 có
 ELSE
 
 */
 
IF
 (điều
 kiện-­‐có

 thể
 sử
 dụng
 câu
 truy
 vấn
 con
 và
 từ
 khoá
 EXISTS)
 
BEGIN
 
 

 

{Các
 lệnh
 nếu
 thoả
 điều
 kiện
 /
 nếu
 chỉ
 có
 1
 lệnh

 thì
 khơng
 cần
 BEGIN
 …
 END}
 
 

END
 
 
ELSE
 
BEGIN
 
 
 

 

{Các
 lệnh
 nếu
 không
 thoả
 điều
 kiện
 /
 nếu

 chỉ
 có
 1
 lệnh
 thì
 khơng
 cần
 BEGIN
 …
 END}
 
 

END
 
 
/*9.
 Vịng
 lặp
 WHILE
 (Lưu
 ý:
 Khơng
 có
 vòng
 lặp
 FOR)
 */
 
WHILE

 (
 điều
 kiện
 )
 
BEGIN
 

 

{Các
 lệnh
 nếu
 thoả
 điều
 kiện
 /
 nếu
 chỉ
 có
 1
 lệnh
 thì
 khơng
 cần
 BEGIN
 …
 END}
 


END
 
 

Biên
 dịch:
 Chọn
 đúng
 đoạn
 mã
 lệnh
 Tạo
 stored-­‐procedure
 à
 F5
 
Thực
 thi
 procedure:
 
EXEC
 procedure_name
 -­‐-­‐Stored-­‐proc
 không
 tham
 số
 
EXEC
 procedure_name
 Para1_value,

 Para2_value,
 ...
 -­‐-­‐Stored-­‐proc
 có
 tham
 số
 

 
Lấy
 giá
 trị
 trả
 về
 của
 stored
 procedure:
 
EXEC
 @bien
 =
 procedure_name
 -­‐-­‐Stored-­‐proc
 không
 tham
 số
 
EXEC
 @bien
 =

 procedure_name
 Para1_value,
 Para2_value,
 ...
 -­‐-­‐Stored-­‐proc
 có
 tham
 số
 


 
2.1.3 Ví
 dụ
 
 

 dụ
 1:
  Viết
 stored
 procedure
 tính
 tổng
 
 2
 số:
 

 




 
-­‐-­‐Tạo
 
CREATE
 PROCEDURE
 sp_Tong
 @So1
 int,
 @So2
 int,
 @Tong
 int
 out
 
AS
 
 

 

SET
 @Tong
 =
 @So1
 +
 @So2;
 


-­‐-­‐Biên
 dịch
 stored-­‐procedure→F5
 
 
-­‐-­‐Kiểm
 tra
 
Declare
 @Sum
 int
 
Exec
 sp_Tong
 1,
 -­‐2,
 @Sum
 out
 
Print
 @Sum
 


 dụ
 2:
  Viết
 stored
 procedure

 tính
 tổng
 các
 số
 chẳn
 từ
 màn:
 
-­‐-­‐Tạo
 
CREATE
 PROCEDURE
 sp_TongChanMN
 @m
 int,
 @n
 int
 
AS
 
 

 

Declare
 @tong
 int
 
 



 

Declare
 @i
 
 int
 


 

Set
 @tong
 =
 0
 


 

Set
 @i
 =
 @m
 


 


While
 (@i
 <
 @n)
 


 

BEGIN
 
 
 


 


 

IF
 (@i
 %
 2
 =
 0)
 


 



 


 


 


 
 

SET
 @i
 =
 @i
 +
 1
 
 


 


 



 
 


 

END
 
 


 

Print
 
 @tong
 
 
 

SET
 @tong
 =
 @tong
 +
 @i
 
 

-­‐-­‐Biên

 dịch
 stored-­‐procedure→F5
 
 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 5
 




 
-­‐-­‐Kiểm
 tra
 
Exec
 sp_TongChanMN
 1,
 20
 
 
 


 

 dụ
 3:
  Viết
 stored
 procedure
 kiểm
 tra
 sự
 tồn
 tại
 của
 giáo
 viên
 theo

 mã:
 
-­‐-­‐Tạo
 
CREATE
 PROCEDURE
 sp_KiemTraGVTonTai
 @MaGV
 char(9)
 
AS
 
 

 

IF
 (
 EXISTS
 (SELECT
 *
 FROM
 GIAOVIEN
 WHERE
 MAGV=@MAGV)
 )
 
 



 


 


 

ELSE
 


 


 

Print
 N‘Giáo
 viên
 tồn
 tại’
 

Print
 N‘Không
 tồn
 tại
 giáo
 viên

 !
 ’
 +
 @MaGV
 
 
 

-­‐-­‐Biên
 dịch
 stored-­‐procedure→F5
 
 
-­‐-­‐Kiểm
 tra
 
Exec
 sp_KiemTraGVTonTai
 ‘001’
 
 


 

 dụ
 4:
  Viết
 stored
 procedure

 xuất
 ra
 danh
 sách
 giáo
 viên
 của
 một
 bộ
 môn:
 
-­‐-­‐Tạo
 
CREATE
 PROCEDURE
 sp_DanhSachGiaoVien
 @MaBM
 char(9)
 
AS
 
 

 

SELECT
 *
 FROM
 GIAOVIEN
 WHERE

 MABM=@MaBM
 
 
 

-­‐-­‐Biên
 dịch
 stored-­‐procedure→F5
 
 
-­‐-­‐Kiểm
 tra
 
Exec
 sp_DanhSachGiaoVien
 
 ‘HTTT’
 
 


 


 



 
2.2 Function

 
 
2.2.1 Giới
 thiệu
 
Trong
 SQL
 Server
 ta
 có
 thể
 viết
 hàm
 và
 lấy
 giá
 trị
 trả
 về.
 Các
 dạng
 hàm
 có
 thể
 viết
 
như
 sau
 :
 

-­‐

Hàm
 trả
 về
 giá
 trị
 vô
 hướng
 (scalar
 value)
 :
 varchar,
 int,
 ....
 

-­‐

Hàm
 trả
 về
 giá
 trị
 là
 bảng
 tạm
 (inline
 table-­‐valued)
 :

 table
 

2.2.2 Cú
 pháp
 
Tạo
 hàm:
 
CREATE
 FUNTION
 function_name
 (
 [@parameter_name
 parameter_data_type]
 )
 
 
RETURNS
 [return
 Data-­‐type]
 /*Returns
 có
 ‘s’
 */
 
 
AS
 Begin
 


 

return
 ([scalar
 value])
 

End
 

Tạo
 hàm
 trả
 về
 bảng
 (table):
 
CREATE
 FUNTION
 function_name
 (
 [@parameter_name
 parameter_data_type]
 )
 
 
RETURNS
 table
 

 
AS
 

 

return
 [select
 command]
 

2.2.3 Ví
 dụ
 
 

 dụ
 5:
  Viết
 hàm
 tính
 tuổi
 dựa
 vào
 ngày
 sinh
 
 
-­‐-­‐
 Tạo

 hàm
 
 
CREATE
 FUNTION
 fTinhTuoi
 (
 @ngaysinh
 datetime
 
 )
 
 
RETURNS
 int
 
 
AS
 
BEGIN
 
 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |

 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 7
 



 

 

return
 year(getdate())
 –
 year(@ngaysinh)
 

END

 
 
-­‐-­‐
 Biên
 dịch:
 F5
 
 
-­‐-­‐
 Kiểm
 tra
 
 
print
 dbo.fTinhTuoi(‘1/1/2000’)
 
-­‐-­‐
 hoặc
 
 
SELECT
 MAGV,
 dbo.
 fTinhTuoi
 (NgaySinh)
 
 
FROM
 GIAOVIEN
 

 


 dụ
 6:
  Viết
 hàm
 lấy
 danh
 sách
 giáo
 viên
 bộ
 môn
 HTTT
 
 
-­‐-­‐
 Tạo
 hàm
 
 
CREATE
 FUNTION
 fDSGV_HTTT
 (
 )
 
 
RETURNS

 table
 
AS
 
 

 

return
 (SELECT
 *
 FROM
 GIAO
 VIEN
 WHERE
 MABM=’HTTT’)
 
 

-­‐-­‐
 Biên
 dịch:
 F5
 
-­‐-­‐
 Kiểm
 tra
 
 
SELECT

 *
 FROM
 
 dbo.fDSGV_HTTT
 (
 )
 


 



 

Ràng
 buộc
 tồn
 vẹn
 và
 TRIGGER
 
 

Tóm
 tắt
 nội
 dung
 bài
 thực

 hành:
 
Cài
  đặt
  các
  ràng
  buộc
  toàn
  vẹn
  sử
  dụng
  kỹ
  thuật
 
TRIGGER
 
 
 
 
 
 

Bộ môn Hệ thống thông tin

 

Khoa Công nghệ thông tin
ĐH Khoa học tự nhiên TP HCM




 
MỤC
 LỤC
 

 
1
  Mục
 tiêu
 và
 tóm
 tắt
 nội
 dung
 ..............................................................................................................................
 1
 
2
  Hướng
 dẫn
 chi
 tiết
 ...................................................................................................................................................
 1
 
2.1
  Giới
 thiệu
 ............................................................................................................................................................

 1
 
2.2
  Các
 kỹ
 thuật
 cài
 đặt
 ràng
 buộc
 toàn
 vẹn
 đơn
 giản
 ............................................................................
 2
 
2.2.1
  Các
 kỹ
 thuật
 cơ
 bản
 ................................................................................................................................
 2
 
2.2.2
  RULE
 .............................................................................................................................................................
 2

 
2.3
  Kỹ
 thuật
 cài
 đặt
 RBTV
 nâng
 cao:
 TRIGGER
 ..........................................................................................
 4
 
2.3.1
  Giới
 thiệu
 ....................................................................................................................................................
 4
 
2.3.2
  Cú
 pháp:
 ......................................................................................................................................................
 4
 
2.3.3
  Một
 số
 ví
 dụ:

 ..............................................................................................................................................
 6
 
3
  Bài
 tập
 tại
 lớp
 ............................................................................................................................................................
 9
 
4
  Bài
 tập
 về
 nhà
 .........................................................................................................................................................
 10
 


 



 
CÀI
 ĐẶT
 RÀNG
 BUỘC

 TOÀN
 VẸN
 
 

1 Mục
 tiêu
 và
 tóm
 tắt
 nội
 dung
 
 
Sau
 khi
 hồn
 thành
 bài
 thực
 hành
 này
 sinh
 viên
 sẽ
 biết
 được:
 
 
-­‐


Cài
 đặt
 các
 ràng
 buộc
 toàn
 vẹn
 trên
 CSDL
 sử
 dụng
 các
 kỹ
 thuật
 CHECK,
 
RULE,
 TRIGGER,
 …
 

2 Hướng
 dẫn
 chi
 tiết
 
 
2.1 Giới
 thiệu

 
Ràng
 buộc
 toàn
 vẹn
 là
 những
 quy
 tắc,
 quy
 định
 trên
 CSDL
 nhằm
 đảm
 bảo
 cho
 
CSDL
 được
 nhất
 quán
 và
 đúng
 đắn
 với
 ngữ
 nghĩa
 của
 thực

 tế
 hay
 mong
 muốn
 của
 
con
 người.
 
Các
 thành
 phần
 cơ
 bản
 của
 một
 ràng
 buộc
 tồn
 vẹn:
 
-­‐

Phát
 biểu
 RBTV
 bằng
 ngơn
 ngữ
 tự

 nhiên:
 là
 một
 phát
 biểu
 tự
 nhiên
 về
 ràng
 
buộc
 toàn
 vẹn
 

-­‐

Bối
 cảnh:
 là
 những
 quan
 hệ
 liên
 quan
 đến
 RBTV.
 Những
 quan
 hệ

 “liên
 
quan”
 là
 khi
 thực
 hiện
 những
 thao
 tác
 cập
 nhật
 dữ
 liệu
 lên
 những
 quan
 hệ
 
này
 thì
 RBTV
 bị
 vi
 phạm.
 

-­‐

Nội

 dung:
 
 là
 phát
 biểu
 lại
 của
 RBTV
 bằng
 ngôn
 ngữ
 hình
 thức
 để
 thể
 hiện
 
được
 sự
 chặt
 chẽ.
 Một
 số
 ngơn
 ngữ
 hình
 thức
 được
 sử
 dụng

 như:
 phép
 tính
 
quan
 hệ,
 đại
 số
 quan
 hệ
 hoặc
 mã
 giả.
 

-­‐

Bảng
 tầm
 ảnh
 hưởng:
 Là
 bảng
 mô
 tả
 các
 sự
 ảnh
 hưởng
 đến

 RBVT
 của
 các
 
thao
 tác
 cập
 nhật
 lên
 các
 bảng
 dữ
 liệu.
 
 

Các
 loại
 RBTV:
 
-­‐

RBTV
 miền
 giá
 trị
 

-­‐


RBTV
 duy
 nhất
 

-­‐

RBTV
 tham
 chiếu
 

-­‐

RBTV
 liên
 thuộc
 tính
 trên
 một
 quan
 hệ
 

Bộ
 mơn
 Hệ
 thống
 thông
 tin

 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 1
 



 
-­‐

RBTV
 liên
 bộ
 trên
 một
 quan
 hệ

 
 

-­‐

RBTV
 liên
 bộ
 liên
 quan
 hệ
 

-­‐

RBTV
 thuộc
 tính
 tổng
 hợp
 

2.2 Các
 kỹ
 thuật
 cài
 đặt
 ràng
 buộc
 toàn

 vẹn
 đơn
 giản
 
 
2.2.1 Các
 kỹ
 thuật
 cơ
 bản
 
 
-­‐

NOT
 NULL
 
 

-­‐

PRIMARY
 KEY
 

-­‐

FOREIGN
 KEY
 

 

-­‐

CHECK
 
 

Các
 trường
 hợp
 sử
 dụng:
 
-­‐

PRIMARY
 KEY:
 Sử
 dụng
 dành
 riêng
 cho
 RBTV
 khố
 chính.
 Mỗi
 bảng
 trong
 


 hình
 dữ
 liệu
 quan
 hệ
 của
 SQL
 Server
 có
 tối
 đa
 một
 khố
 chính.
 

-­‐

UNIQUE:
 Sử
 dụng
 dành
 riêng
 cho
 RBTV
 duy
 nhất.
 Các
 thuộc

 tính
 được
 khai
 
báo
 RBTV
 duy
 nhất
 có
 thể
 xem
 như
 các
 thuộc
 tính
 của
 khố
 ứng
 viên.
 Mỗi
 
bảng
 có
 thể
 khai
 báo
 nhiều
 khố
 ứng
 viên.

 

-­‐

FOREIGN
 KEY:
 Sử
 dụng
 dành
 riêng
 cho
 việc
 tạo
 RBTV
 tham
 chiếu
 hoặc
 
khố
 ngoại.
 CÁc
 thuộc
 tính
 khố
 ngoại
 phải
 tham
 chiếu
 đến
 các

 thuộc
 tính
 
khố
 (khố
 chính
 hoặc
 khố
 ứng
 viên).
 

-­‐

CHECK:
 Sử
 dụng
 dành
 riêng
 cho
 việc
 tạo
 các
 RBTV
 khác.
 Lúc
 này
 các
 RBTV
 

được
 mô
 tả
 như
 một
 biểu
 thức
 điều
 kiện
 mà
 các
 dữ
 liệu
 phải
 thoả
 biểu
 
thức
 điều
 kiện
 đó.
 
 

Cách
 sử
 dụng
 các
 kỹ
 thuật

 này
 được
 trình
 bày
 trong
 phần
 xây
 dựng
 cấu
 trúc
 Cơ
 sở
 
dữ
 liệu.
 
2.2.2 RULE
 
RULE
 được
 thiết
 lập
 như
 là
 một
 quy
 tắc
 của
 một
 thuộc

 tính.
 Trình
 tự
 các
 bước
 tạo
 

 sử
 dụng
 RULE:
 
Tạo
 RULE:
 
 


 



 
CREATE
 RULE
 [Tên_Rule]
 
 
AS
 [Biểu_thức_mô_tả_điều_kiện]

 
[
 ;
 ]
 

Trong
 đó:
 
-­‐

[Tên_Rule]:
 Tên
 do
 người
 lập
 trình
 đặt
 

-­‐

[Biểu_thức_mơ_tả_điều_kiện]:
 Biểu
 thức
 tương
 ứng
 với
 nội
 dung

 của
 RULE.
 
Trong
 biểu
 thức
 này
 chỉ
 được
 sử
 dụng
 1
 biến
 (bắt
 đầu
 bằng
 @)
 để
 mô
 tả
 
RULE.
 Khi
 gắn
 RULE
 cho
 thuộc
 tính
 nào
 thì

 biến
 tương
 ứng
 với
 thuộc
 tính
 
đó.
 

Gắn
 RULE
 cho
 thuộc
 tính:
 
 
EXEC
 sp_bindrule
 [
 @rulename
 =
 ]
 'Tên_rule'
 ,
 
 

 
 

 
 
 [
 @objname
 =
 ]
 'Tên_bảng.Tên_thuộc_tính'
 
 

Ghi
 chú:
 Sinh
 viên
 tìm
 hiểu
 thêm
 một
 số
 cú
 pháp
 sử
 dụng
 RULE
 khác:
 sử
 dụng
 các
 
tham

 số
 futureonly,
 gắn
 RULE
 cho
 kiểu
 dữ
 liệu…
 
 
Tháo
 bỏ
 RULE
 cho
 thuộc
 tính:
 
 
EXEC
 
 sp_unbindrule
 
 
 [
 @objname
 =
 ]
 'Tên_bảng.Tên_thuộc_tính'
 
 


Ghi
 chú:
 Khi
 gỡ
 bõ
 RULE
 thì
 gỡ
 bỏ
 tồn
 bộ
 RULE
 mà
 đã
 được
 gắn
 vào
 thuộc
 tính.
 
Xóa
 RULE
 
 
DROP
 RULE
 [Tên_Rule]
 
 



 

 dụ
 1:
  Cài
 đặt
 RBTV
 lương
 của
 giáo
 viên
 thuộc
 khoảng
 ($1000,
 $20000)
 bằng
 
cách
 sử
 dụng
 RULE.
 
Tạo
 RULE
 để
 biểu
 diễn
 ràng

 buộc
 thuộc
 1
 khoảng.
 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 3
 




 
CREATE
 RULE
 range_rule
 
AS
 
 
@range>=
 $1000
 AND
 @range
 <$20000;
 


 
Gắn
 RULE
 vừa
 tạo
 cho
 thuộc
 tính
 Luong
 của
 bảng
 GIAOVIEN

 
 
sp_bindrule
 'range_rule'
 ,
 'GIAOVIEN.Luong'
 


 
Khi
 khơng
 sử
 dụng
 RBTV
 này
 nữa
 thì
 tháo
 bỏ
 RULE
 khỏi
 thuộc
 tính
 lương.
 
sp_unbindrule
 'GIAOVIEN.Luong'
 


2.3 Kỹ
 thuật
 cài
 đặt
 RBTV
 nâng
 cao:
 TRIGGER
 
2.3.1 Giới
 thiệu
 
 

 một
 cơ
 chế
 để
 đảm
 bảo
 ràng
 buộc
 toàn
 vẹn
 sử
 dụng
 khả
 năng
 lập
 trình

 của
 Hệ
 
quản
 trị
 cơ
 sở
 dữ
 liệu.
 
 
2.3.2 Cú
 pháp:
 
Tạo
 Trigger
 
 
CREATE
 TRIGGER
 
 [Tên_trigger]
 
ON
 [Tên_bảng]
 
FOR
 [Các_thao_tác:
 insert,
 update

 hoặc
 delete]
 
 
AS
 
 
IF
 UPDATE
 (Tên
 thuộc
 tính)
 
BEGIN
 
-­‐-­‐
 Thân_của_trigger:
 Mã
 nguồn
 kiểm
 tra
 hoặc
 cập
 nhật
 
 
END
 
 


Một
 số
 lưu
 ý
 khi
 sử
 dụng
 trigger:
 
-­‐

Một
 trigger
 được
 gắn
 với
 1
 bảng
 để
 giám
 sát
 sự
 thay
 đổi
 dữ
 liệu
 của
 bảng
 
đó.

 
 Mã
 nguồn
 trong
 phần
 Thân_của_trigger
 sẽ
 được
 tự
 động
 gọi
 thực
 hiện
 


 



 
khi
 xảy
 ra
 Các_thao_tác
 cập
 nhật
 dữ
 liệu
 (insert,

 update
 hoặc
 delete)
 lên
 
bảng
 Tên_bảng.
 Do
 đó
 nội
 dung
 mã
 nguồn
 của
 Thân_của_trigger
 thường
 
sẽ
 thực
 hiện
 những
 công
 việc
 như:
 kiểm
 tra
 dữ
 liệu,
 thay
 đổi

 dữ
 liệu,
 huỷ
 
bỏ
 thao
 tác
 để
 làm
 cho
 ràng
 buộc
 toàn
 vẹn
 không
 bị
 vi
 phạm.
 
 
-­‐

Trong
 phần
 thân
 của
 trigger
 để
 dễ
 dàng

 cho
 các
 thao
 tác
 kiểm
 tra
 dữ
 liệu,
 
hệ
 quản
 trị
 cung
 cấp
 2
 bảng
 tạm
 cho
 người
 viết
 trigger
 sử
 dụng.
 Hai
 bảng
 
này
 có
 cấu
 trúc

 giống
 hệt
 như
 bảng
 chính:
 
 
o Bảng
 inserted:
 chứa
 những
 dòng
 mới
 thêm
 vào
 
 
o Bảng
 deleted
 chứa
 những
 dịng
 vừa
 mới
 bị
 xố
 đi.
 
 


-­‐

Lưu
 ý:
 Khơng
 có
 bảng
 updated
 vì
 thao
 tác
 cập
 nhật
 được
 xem
 là
 bao
 gồm
 
thao
 tác
 xoá
 và
 thêm
 mới.
 Khi
 thực
 hiện
 thao
 tác

 cập
 nhật,
 bảng
 inserted
 
chứa
 dữ
 liệu
 mới,
 bảng
 deleted
 chứa
 dữ
 liệu
 cũ.
 

-­‐

Trong
 MS
 SQL
 Server,
 trigger
 được
 gọi
 thực
 hiện
 sau
 khi

 thao
 tác
 tương
 
ứng
 (insert,
 update,
 delete)
 được
 thực
 hiện
 trên
 bảng
 chính.
 Người
 dùng
 
nếu
 muốn
 khơi
 phục
 lại
 dữ
 liệu
 trong
 bảng
 chính
 thì
 gọi
 lệnh

 rollback.
 
Ngồi
 ra
 sử
 dụng
 hàm
 raiserror
 để
 thơng
 báo
 lỗi
 khi
 phát
 hiện
 thấy
 sự
 vi
 
phạm
 RBTV.
 

Xoá
 Trigger
 
 
DROP
 TRIGGER
 

 [Tên_trigger]
 
 

Cập
 nhật
 nội
 dung
 Trigger:
 
ALTER
 TRIGGER
 
 [Tên_trigger]
 
ON
 [Tên_bảng]
 
FOR
 [Các_thao_tác:
 insert,
 update
 hoặc
 delete]
 
 
AS
 
 
IF

 UPDATE
 (Tên
 thuộc
 tính)
 
BEGIN
 
n Thân_của_trigger:
 Mã
 nguồn
 kiểm
 tra
 hoặc
 cập
 nhật
 
 
-­‐-­‐
 TH1:
 Mã
 nguồn
 kiểm
 tra
 
 

Bộ
 môn
 Hệ
 thống

 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 5
 



 
IF
 (điều
 kiện
 để
 RBTV
 vi
 phạm

 )
 
BEGIN
 

 

raiserror
 (N'Lỗi:
 XXXX
 
 ',
 16,
 1)
 


 

rollback
 

END
 
 

 
-­‐-­‐
 TH2:
 Mã

 nguồn
 cập
 nhật
 
 
 
UPDATE
 …
 

 
END
 
 


 
2.3.3 Một
 số
 ví
 dụ:
 

 dụ
 2:
  Cài
 đặt
 RBTV
 “Lương
 của

 giáo
 viên
 phải
 >=
 1000”
 sử
 dụng
 kỹ
 thuật
 
trigger.
 
Nhận
 xét:
 RBTV
 này
 liên
 quan
 đến
 bảng
 GIAOVIEN
 (à
 ON
 GIAOVIEN),
 khi
 thêm
 
mới
 một
 dòng

 (insert)
 hoặc
 cập
 nhật
 thuộc
 tính
 LUONG
 (update)
 thì
 RBTV
 này
 có
 
khả
 năng
 bị
 vi
 phạm.
 Khi
 xố
 thì
 sẽ
 khơng
 ảnh
 hưởng
 đến
 RBTV
 này
 (à
 FOR

 
insert,
 update).
 
 

 

T
 

X
 

S
 

GIAOVIEN
 

+
 
 

-­‐
 

+
 (LUONG)
 



 
Sử
 dụng
 trigger
 để
 kiểm
 tra
 những
 dữ
 liệu
 mới
 đưa
 vào,
 nếu
 vi
 phạm
 quy
 định
 à
 
báo
 lỗi
 và
 khôi
 phục
 lại
 dữ
 liệu.

 
 
CREATE
 TRIGGER
 trgLuong
 
ON
 GIAOVIEN
 
FOR
 insert,
 update
 
AS
 
 


 



 
if
 update(LUONG)
 
BEGIN
 

 


if
 exists
 (select
 *
 from
 inserted
 where
 LUONG
 <
 1000)
 


 

begin
 


 


 

raiserror
 (N'Lỗi:
 Lương
 của
 giáo

 viên
 phải
 >=
 1000
 ',
 16,
 1)
 


 


 

rollback
 


 

end
 
 

END
 
 



 
Giả
 sử
 có
 bảng
 CTHD
 (MaHD,
 MaSP,
 SoLuong,
 DonGia,
 ThanhTien)
 
 

 dụ
 3:
  Cài
 đặt
 RBTV
 sau
 “Thành
 tiền
 phải
 bằng
 Số
 Lượng
 *
 Đơn
 giá”
 

Nhận
 xét:
 RBTV
 này
 liên
 quan
 đến
 bảng
 CTHD,
 khi
 thêm
 mới
 một
 dòng
 dữ
 liệu
 
hoặc
 khi
 cập
 nhật
 các
 thuộc
 tính
 như
 SoLuong,
 DonGia
 thì
 cần
 cập

 nhật
 lại
 
ThanhTien
 tương
 ứng.
 
 

 

T
 

X
 

S
 

CTHD
 
 

+
 
 

-­‐
 


+
 (SoLuong,
 DonGia,
 
ThanhTien)
 


 
Sử
 dụng
 trigger
 để
 cập
 nhật
 dữ
 liệu
 đúng
 với
 RBTV.
 
CREATE
 TRIGGER
 trgCapNhatThanhTien
 
 
ON
 CTHD
 

 
FOR
 insert,
 update
 
AS
 
 
IF
 update(SoLuong,
 DonGia,
 ThanhTien)
 
BEGIN
 

 

Update
 CTHD
 


 

Set
 ThanhTien
 =
 SoLuong
 *

 DonGia
 
 


 

Where
 EXISTS
 (select
 *
 from
 inserted
 I
 where
 i.MAHD=CTHD.MAHD
 AND
 i.MASP
 =
 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT

 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 7
 



 
CTHD.MASP)
 
 
END
 
 


 dụ
 4:
  Cài
 đặt

 RBTV
 sau
 “Giáo
 viên
 làm
 trưởng
 bộ
 mơn
 thì
 phải
 thuộc
 bộ
 mơn
 
đó”
 

 

T
 

X
 

S
 

GIAOVIEN
 


-­‐
 

-­‐
 

+
 (MABM)
 

BOMON
 

-­‐
 

-­‐
 

+
 (TRBOMON)
 

Giả
 sử
 đã
 có
 các
 RBTV

 khố
 chính,
 khố
 ngoại.
 
CREATE
 TRIGGER
 trgTruongBoMon_BOMON
 
 
 
ON
 BOMON
 
 
FOR
 update
 
AS
 
 
IF
 update(TRBOMON)
 
BEGIN
 

 

IF

 exists
 (SELECT
 *
 
 


 


 

FROM
 INSERTED
 I
 
 


 


 

WHERE
 I.TRBOMON
 IS
 NOT
 NULL
 

 


 


 


 

AND
 I.TRBOMON
 NOT
 IN
 
 (
 SELECT
 G.MAGV
 
 
 


 


 



 


 


 


 

FROM
 GIAOVIEN
 G
 
 


 


 


 


 



 


 

WHERE
 G.MABM=I.MABM
 )
 )
 


 

BEGIN
 


 


 

raiserror
 (N'Lỗi:
 Trưởng
 bộ
 môn
 phải
 là

 người
 trong
 bộ
 môn
 ',
 16,
 1)
 


 


 

rollback
 


 

END
 
 

END
 
 



 



 


 


 

 
CREATE
 TRIGGER
 trgTruongBoMon_GIAOVIEN
 
 
 
 
ON
 GIAOVIEN
 
 
FOR
 update
 
AS
 
 

IF
 update(MABM)
 
BEGIN
 

 

IF
 exists
 (SELECT
 *
 
 


 


 

FROM
 BOMON
 B,
 INSERTED
 I
 
 
 



 


 

WHERE
 B.TRBOMON=I.MAGV
 AND
 B.MABM
 <>
 I.MABM)
 


 

BEGIN
 


 


 

raiserror
 (N'Lỗi:
 Trưởng
 bộ

 môn
 phải
 là
 người
 trong
 bộ
 môn
 ',
 16,
 1)
 


 


 

rollback
 


 

END
 
 

END
 

 


 

Bộ
 môn
 Hệ
 thống
 thông
 tin
 |
 Khoa
 CNTT
 |
 ĐH
 KHTN
 TP
 HCM
 |
 1/2013
 

 

Trang
 9
 




×