1. Thủ tục thường trú
Khái niệm: Thủ tục thường trú (Store Procedure-SP) là
một tập hợp chứa các dòng lệnh, các biến và các cấu
trúc điều khiển trong ngôn ngữ T-SQL dùng để thực hiện
một hành động nào đó. Nội dung của SP sẽ được lưu trữ
tại cơ sở dữ liệu của Microsoft SQL Server.
Khi một câu lệnh gọi chạy stored procedure lần đầu tiên
thì SQL Server sẽ chạy nó và lưu trữ vào bộ nhớ đệm,
những lần tiếp theo SQL Server sẽ sử dụng lại nên sẽ
cho tốc độ xử lý tối ưu.
2. Store Procedure-SP
Nhanh:SP có khả năng phân tích cú pháp và tối ưu
hóa trong lần thực thi đầu tiên, 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. Tức là nó không cần phải phân tích cú
pháp và tối ưu lại, mà sẽ sử dụng kết quả đã được biên
dịch trong lần đầu tiên. Do đó stored procedure có khả
năng thực thi nhanh hơn là việc xử lý một đoạn lệnh
Transaction – SQL lớn, lặp
3. Store Procedure-SP
Bảo mật: Phân cấp ,giới hạn quyền cho các
user thậm chí họ không được phép thực thi trực
tiếp những stored procedure này. Khi đó sẽ hạn
chế, loại bỏ các vấn đề xâm phạm dữ liệu không
được cấp phép
4. Store Procedure-SP
Mỗi thủ tục đều có tên, có thể có tham số truyền vào,
tham số trả giá trị về. Ngoài ra bên trong thân của một
SP chúng ta cũng có thể gọi thực thi một SP khác đã
được tạo trước đó. Phạm vi hoạt động của các SP là
cục bộ bên trong một CSDL lưu trữ thủ tục đó.
5. Tạo mới một thủ tục
Cú pháp:
CREATE PROC[EDURE] <tên thủ tục>[Các tham số]
AS
[DECLARE <biến cục bộ>]
<Các lệnh SQL>
CHẠY THỰC HIỆN THỦ TỤC
EXEC[UTE] <tên thủ tục> [các tham số]
6. Tạo mới một thủ tục
Trong đó:
Tên thủ tục: Là tên thủ tục được tạo mới, tên thủ tục này phải là duy nhất
trong một CSDL.
Các tham số: Là các tham số dùng để tiếp nhận các giá trị bên ngoài đưa
vào thủ tục. Các tham số này được khai báo như sau: @<tên tham số>
<kiểu dữ liệu> [độ dài].
Biến cục bộ: Là những biến chỉ được sử dụng bên trong thủ tục, khi ra
khỏi thủ tục thì những biến này không còn tồn tại nữa.
Các lệnh SQL: Là các lệnh T-SQL dùng để xử lý, tính toán theo yêu cầu
của người sử dụng.
EXEC[UTE] <tên thủ tục> [các tham số]
7. Tạo mới một thủ tục
Ví dụ: MONHOC (MAMH, TENMH, SOTIET)
CREATE PROCEDURE ds_mh
AS
SELECT MAMH, TENMH
FROM MONHOC
WHERE SOTIET>45
Gọi thực thi thủ tục:
Exec ds_mh
8. Tạo mới một thủ tục
Ví dụ:
LOP (MALOP, TENLOP, SISO)
SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP)
CREATE PROC CAPNHAT_SS
AS
UPDATE LOP
SET SISO=(SELECT COUNT(*)
FROM SINHVIEN
WHERE SINHVIEN.MALOP=LOP.MALOP
GROUP BY SINHVIEN.MALOP)
GOI THU TUC:
EXEC CAPNHAT_SS
9. Thủ tục có tham số
Tham số đầu vào: có chức năng nhận các giá trị truyền vào từ bên ngoài
thủ tục để thực hiện các xử lý bên trong thủ tục.
Ví dụ: Viết thủ tục nhập vào mã số sinh viên sẽ in ra kết quả học tập
(DIEM) của sinh viên đó.
KETQUA (MASV, MAMH, DIEM)
CREATE PROC KQ_SV @MASV CHAR(4)
AS
SELECT MASV, MAMH, DIEM
FROM KETQUA
WHERE MASV=@MASV
Gọi thực hiện: EXEC KQ_SV ‘SV01’
10. Thủ tục có tham số
Tham số đầu ra: Tham số đầu ra là những tham số mà giá trị của nó
sẽ được tính toán từ bên trong thủ tục và sẽ được giữ nguyên sau
khi thoát ra khỏi thủ tục.
Tham số đầu ra được gắn với từ khoá OUTPUT trong lúc tạo thủ tục.
Ví dụ:
CREATE PROC XEM_DIEM @MASV CHAR(4), @MAMH CHAR(4),
@DIEM INT OUTPUT
AS
SELECT @DIEM=DIEM
FROM KETQUA
WHERE MASV=@MASV AND MAMH=@MAMH
11. Thủ tục có tham số
Thực hiện gọi thủ tục như sau:
DECLARE @DIEMSV INT
EXEC XEM_DIEM ‘SV02' , 'M01‘ @DIEMSV OUTPUT
PRINT @DIEMSV
12. Lệnh Return
Lệnh RETURN được sử dụng bên trong thủ tục thường
dùng để thoát ra khỏi thủ tục trong các trường hợp dữ
liệu không hợp lệ. Ngoài ra lệnh RETURN cũng cho phép
trả về một số nguyên tại nơi đã gọi thực hiện thủ tục.
Ví dụ: SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP)
CREATE PROC TT_SV @MASV CHAR(10)=NULL
AS
IF @MASV IS NULL
BEGIN
PRINT 'Hay nhap ma sinh viên'
RETURN
END
ELSE
BEGIN
SELECT HOTEN,NGSINH,DCHI,GIOITINH
FROM SINHVIEN
WHERE MASV=@MASV
END
EXEC TT_SV ‘SV01’
13. Thủ tục
Xóa
DROP PROC[EDURE] <tên thủ tục>
Ví dụ:
DROP PROC ds_mh
Sửa
ALTER PROC[EDURE] <tên thủ tục>[các tham số]
AS
[DECLARE <biến cục bộ>]
<Các lệnh SQL>
14. Thủ tục
Mã hóa nội dung
CREATE | ALTER PROC[EDURE] <tên thủ tục>[các tham số]
WITH ENCRYPTION
AS
[DECLARE <biến cục bộ>]
<Các lệnh SQL>
Ví dụ: MONHOC (MAMH, TENMH, SOTIET)
CREATE PROC TT_MH @MAMH CHAR(20)=‘ ’
WITH ENCRYPTION
AS
SELECT TENMH,SOTIET
FROM MONHOC
WHERE MAMH=@MAMH
EXEC TT_MH ‘M01’
15. Trigger
Trigger là một cấu trúc lệnh T-SQL đặc biệt có khả năng thực thi
một cách tự động mỗi khi dữ liệu trên bảng liên quan với trigger bị
thay đổi.
Trigger khác với thủ tục là không có tham số, không cần gọi thực
hiện bằng lệnh EXECUTE mà sẽ được kích hoạt tương ứng với
các hành động thay đổi dữ liệu (thêm, xoá, sửa).
Cấu trúc lệnh trigger được dùng để kiểm tra sự toàn vẹn dữ liệu
nghĩa là kiểm tra được tất cả các ràng buộc toàn vẹn có trong
CSDL. Chúng ta chỉ nên sử dụng trigger cho những ràng buộc kiểm
tra phức tạp trên dữ liệu
16. Hoạt động của Trigger
Mỗi trigger khi được định nghĩa phải chỉ định trigger đó thuộc bảng dữ liệu nào
và chỉ được kích hoạt khi người sử dụng tác động (thêm, xoá, sửa) trên bảng dữ
liệu đó.
Khi một hành động thêm (INSERT) dữ liệu vào bảng xảy ra thì trigger tương ứng
với hành động này sẽ được kích hoạt. Khi đó hệ thống sẽ phát sinh ra một bảng
phụ có tên là INSERTED để chứa một dòng dữ liệu mới mà người dùng muốn
thêm vào bảng.
Khi xoá (DELETE) một dòng dữ liệu trên bảng thì trigger tương ứng với hành động
này sẽ được kích hoạt. Khi đó một bảng phụ tên là DELETED được phát sinh để
chứa dòng dữ liệu mà người dùng muốn xoá đi.
Khi sửa đổi (UPDATE) dữ liệu trên một bảng thì trigger tương ứng với hành động
này sẽ được kích hoạt. Khi đó hệ thống sẽ phát sinh ra 2 bảng phụ: một bảng để
chứa dữ liệu mới cần sửa có tên là INSERTED, bảng còn lại dùng để chứa dữ liệu
cũ cần bỏ đi có tên là DELETED.
17. Tạo Trigger
Cấu trúc
CREATE TRIGGER <tên trigger> ON <tên bảng>
[WITH ENCRYPTION]
FOR <biến cố kích hoạt>
AS
<Các lệnh T-SQL>
Tên trigger: Là tên của trigger cần tạo, tên này phải duy nhất trong
một CSDL.
Mệnh đề ON: Chỉ ra rằng trigger này đang viết cho bảng dữ liệu nào.
Tên bảng: Là tên của bảng dữ liệu cần tạo trigger trên đó.
18. Tạo Trigger
Mệnh đề WITH ENCRYPTION: Dùng để mã hoá nội dung trigger.
Mệnh đề FOR : Dùng để chỉ ra rằng trigger sẽ áp dụng cho hành
động nào trong 3 hành động: INSERT, DELETE, UPDATE.
Biến cố kích hoạt: là các biến cố xảy ra khi người sử dụng tác động
vào CSDL.
Các lệnh T-SQL: là các lệnh SQL thực hiện các xử lý trong trigger,
một số lệnh sau đây không được sử dụng trong trigger: ALTER
DATABASSE, CREATE DATABASE, DROP DATABASE…
19. Insert Trigger
Ví dụ:
LOP (MALOP, TENLOP, SISO)
CREATE TRIGGER KTRA_SISO ON LOP
FOR INSERT
AS
IF (SELECT SISO FROM INSERTED)<0
BEGIN
PRINT 'SISO cua lop phai > 0'
ROLLBACK TRAN
END
FOR INSERT để chỉ ra rằng trigger này chỉ hoạt động cho hành động insert dữ liệu
vào bảng LOP. Mệnh đề IF(SELECT SISO FROM INSERTED)<0 sẽ kiểm tra nếu dữ
liệu (SISO) trong bảng tạm nhỏ hơn 0 thì quay lui giao tác (ROLLBACK TRAN) khi đó
dữ liệu sẽ không được chèn vào bảng.
20. Insert Trigger
Ví dụ:
LOP (MALOP, TENLOP, SISO)
SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP)
CREATE TRIGGER CAPNHAT_SISO ON SINHVIEN
FOR INSERT
AS
UPDATE LOP
SET SISO=(SELECT COUNT(*)
FROM SINHVIEN
WHERE SINHVIEN.MALOP=LOP.MALOP
GROUP BY SINHVIEN.MALOP)
21. Delete Trigger
Ví dụ:
SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP)
CREATE TRIGGER CHUYEN_DL ON SINHVIEN
FOR DELETE
AS
INSERT INTO SV_XOA
SELECT * FROM DELETED
22. Update Trigger
Ví dụ: SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP, DTB)
KETQUA(MASV,MAMH,DIEM)
CREATE TRIGGER CN_DIEM ON KETQUA
FOR UPDATE
AS
BEGIN
UPDATE SINHVIEN
SET DTB=(SELECT AVG(DIEM)
FROM KETQUA
WHERE KETQUA.MASV=SINHVIEN.MASV
GROUP BY KETQUA.MASV)
SELECT * FROM SINHVIEN
END
23. Trigger với nhiều hành động
Ví dụ:
KETQUA (MASV, MAMH, DIEM)
SINHVIEN (MASV, HOTEN, NGSINH, DCHI, GIOITINH, MALOP, DTB)
CREATE TRIGGER CN_DIEM ON KETQUA
FOR INSERT, UPDATE, DELETE
AS
BEGIN
UPDATE SINHVIEN
SET DTB=(SELECT AVG(DIEM)
FROM KETQUA
WHERE KETQUA.MASV=SINHVIEN.MASV
GROUP BY SINHVIEN.MASV)
SELECT * FROM SINHVIEN
24. Xem nội dung trigger
Khởi động trình ứng dụng Enterprise Manager > mở rộng danh
mục CSDL cần xem trigger > chọn đối tượng tables > nhấp chuột
phải vào bảng cần xem trigger > chọn All Tasks > chọn Manage
Triggers
Cú pháp:
sp_helptext <tên trigger>
Ví dụ:
sp_helptext KTRA_SISO
Kiểm tra số trigger trên bảng
sp_helptrigger <tên bảng>
25. Trigger
Xóa
DROP TRIGGER <danh sách tên trigger>
Thay đổi nội dung trigger
ALTER TRIGGER <tên trigger> ON <tên bảng>
[WITH ENCRYPTION]
FOR <biến cố kích hoạt>
AS
<Các lệnh T-SQL>
Tắt bật hoạt động của trigger
ALTER TABLE <tên bảng>
DISABLE | ENABLE TRIGGER <tên trigger>
26. HÀM RAISERROR
Ý nghĩa : Trả thông báo lỗi về cho ứng dụng
Cú pháp : Raiserror(tbao_loi, muc_do, trang_thai [,
cac_tham_so] )
Thông báo lỗi :
Mã thông báo lỗi do người dùng định nghĩa trước
Chuỗi thông báo lỗi bất kỳ.
Mức độ:
Số có giá trị từ 0 tới 25 thể hiện mức độ nghiêm trọng
của lỗi.
Trạng thái: Số từ 1-127 để xác định vị trí lỗi khi sử dụng
cùng một thống báo lỗi tại nhiều điểm khác nhau
27. HÀM RAISERROR
DECLARE @DIEMTB FLOAT
SET @DIEMTB= (SELECT DIEMTB FROM SINHVIEN
WHERE MASV='SV02')
IF (@DIEMTB NOT BETWEEN 0 AND 10)
BEGIN
RAISERROR('DIEM THI PHAI TU 0-10',16,1)
END