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ì
lý
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
và
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ụ
Ví
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
Ví
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
Ví
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’
Ví
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ụ
Ví
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
Ví
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
mơ
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
và
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]
Ví
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
Là
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ụ:
Ví
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)
Ví
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
Ví
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