You are on page 1of 57

MODUL 3

LẬP TRÌNH TRONG MICROSOFT SQL SERVER


MỤC TIÊU

Sau khi học các nội dung của modul, sinh viên có thể:
 Lập trình trong MS SQL Server bằng T-SQL để tạo ra các thủ tục lưu trữ,
các hàm, các trigger
 Nắm được các kỹ thuật lập trình với các cấu trúc điều khiển
 Sử dụng các kiểu dữ liệu
 Nắm bắt việc bẫy lỗi và xử lý phiên giao dịch bằng trigger và transaction
GIỚI THIỆU

 Microsoft SQL Server cho phép có thể lập trình để xử lý


dữ liệu trong hệ thống, sử dụng T-SQL.
 Các chương trình được lập lưu trữ trực tiếp trong từng
cơ sở dữ liệu dưới dạng mã lệnh, được thực hiện có
chương trình hoặc sự kiện gọi đến.
 Người phát triển có thể lập trình các loại
 Thủ tục lưu trữ (Stored Procedure)
 Hàm (Function)
 Trigger
THỦ TỤC LƯU TRỮ
(STORED PROCEDURE)
THỦ TỤC LƯU TRỮ

 Là một trong những đối tượng thuộc CSDL


 Trong thủ tục, có thể các biến, các cấu trúc lập trình tương tự như
các ngôn ngữ lập trình khác
 Thao tác trực tiếp đối với CSDL
 Có thể nhận các tham số đầu vào và trả kết quả thông qua các
tham số đầu ra
 Được biên dịch và tối ưu hóa khi thực hiện
 Cho phép modul hóa phần mềm khi phát triển, tăng cường tính an
toàn và bảo mật
 Các thủ tục có thể gọi lẫn nhau, có thể sử dụng các hàm có sẵn
hoặc hàm tự tạo.
TẠO THỦ TỤC

 Cú pháp
CREATE { PROCEDURE | PROC } procedure_name
[ @parameter datatype
[ VARYING ] [ = default ] [ OUT | OUTPUT | READONLY ]
, @parameter datatype
[ VARYING ] [ = default ] [ OUT | OUTPUT | READONLY ] ]

[ WITH { ENCRYPTION | RECOMPILE | EXECUTE AS Clause } ]


[ FOR REPLICATION ]

AS

<sql_statements>
CÁC THÀNH PHẦN TRONG LỆNH
 procedure_name: Tên thủ tục
 @parameter: Một hay nhiều tham số được truyền vào hàm.
 Datatype: Kiểu dữ liệu cho @parameter.
 Default: Giá trị mặc định gán cho @parameter.
 OUT/OUTPUT: @parameter là một tham số đầu ra
 READONLY: @parameter không thể bị procedure ghi đè lên.
 VARYING: Chỉ sử dụng cho kiểu con trỏ (cursor), có thể làm tham số đầu ra.
 ENCRYPTION: Mã nguồn (source) của procedure sẽ không được lưu trữ dưới
dạng text trong hệ thống.
 RECOMPILE: Truy vấn sẽ không được lưu ở bộ nhớ đệm (cache) cho thủ tục
 EXECUTE AS clause: Xác định ngữ cảnh bảo mật để thực thi thủ tục.
 FOR REPLICATION: Procedure đã lưu sẽ chỉ được thực thi trong quá trình
replication (nhân bản).
CÁCH TRUYỀN GIÁ TRỊ VÀO THAM SỐ CỦA
THỦ TỤC

 Cách 1: Gán giá trị ngầm định ngay khi tạo thủ tục
 Cách 2: Truyền các giá trị cho tham số chưa có giá trị
ngầm định hoặc chỉ truyền cho một số tham số của thủ
tục, thông thường sử dụng khi khai báo thủ tục có giá trị
ngầm định cho tham số. Khi đó, với mỗi tham số ta
truyền trực tiếp giá trị cho tham số đó dưới dạng:
@parameter=value
 Cách 3: Truyền giá trị cho tất cả các tham số của thủ
tục: viết lần lượt các giá trị tương ứng với các tham số
được khai báo trong thủ tục, phải phù hợp các kiểu dữ
liệu và ý nghĩa của các tham số.
THỰC THI THỦ TỤC

 Cú pháp:

EXEC[CUTE] procedure_name
[<parameter_values>][@parameter=value..]

 Ý nghĩa: thực thi một thủ tục với các giá trị được truyền vào cho
tham số.
 Kết quả hoặc trạng thái thực thi thủ tục sẽ được thể hiện trên màn
hình.
VÍ DỤ

 Lập một thủ tục để đưa ra danh sách các nhân viên khi biết một cụm từ
trong họ và tên của nhân viên
CREATE PROC sp_dsnv @ht nvarchar(30)
AS
SELECT * FROM nhanvien WHERE hoten like @ht

 Khi thực hiện thủ tục, giả sử muốn tìm nhân viên trong họ tên có cụm từ
‘inh’:
EXEC sp_dsnv N’%inh%’
LẤY KẾT QUẢ RA TỪ THAM SỐ

 Khi khai báo tham số, thêm từ khóa OUTPUT/OUT


ngay sau mỗi tham số
 Khi thực thi thủ tục, cần có các biến tương ứng với các
tham số đầu ra để chứa giá trị và viết kèm theo từ khóa
OUTPUT/OUT với biến đó trong danh sách giá trị/biến
truyền vào cho thủ tục
 Một thủ tục có thể trả ra nhiều kết quả
VÍ DỤ
 Lập thủ tục để thực hiện phép chia hai số thực
CREATE PROC Chia @sobichia real,@sochia real,
@kqua real OUTPUT
AS
IF (@sochia =0)
Print ‘Chia cho 0’
ELSE
SELECT @kqua = @sobichia / @sochia

 Thực thi:
DECLARE @ketqua real
EXEC Chia 100, 2, @ketqua OUT
SELECT @ketqua
KHAI BÁO BIẾN, GÁN GIÁ TRỊ

 Cú pháp
DECLARE @<tên biến> <kiểu dữ liệu> [=<giá trị ngầm định>]
 Ý nghĩa: Khai báo biến cục bộ trong thủ tục. Trong một lệnh, có thể
khai báo nhiều biến với nhiều kiểu dữ liệu khác nhau
 Ví dụ:
DECLARE @hoten nvarchar(30)
 Gán giá trị cho biến
 Cách 1:
SET @<tên biến>= <biểu thức>
 Cách 2:
SELECT @<tên biến>= <biểu thức>
BIỂU THỨC

 Sử dụng các biến, các giá trị, các hàm và các phép tính tương ứng
 Có thể sử dụng thêm các toán tử:
+= Add and assign
-= Subtract and assign
*= Multiply and assign
/= Divide and assign
%= Modulo and assign
&= Bitwise AND and assign
^= Bitwise XOR and assign
|= Bitwise OR and assign
CÁC TOÁN TỬ LOGIC
oán tử Mô tả
ALL Đươc dùng để so sánh một giá trị với toàn bộ các giá trị trong một bộ giá trị khác.

AND Cho phép nhiều điều kiện được tồn tại trong một phát biểu lệnh SQL

ANY Dùng để so sánh một toán tử với bất kỳ một toán tử nào đó trong list theo một điều
kiện nhất định.
BETWEEN Toán tử này sẽ tìm kiếm một bộ giá trị nằm giữa hai giá trị điều kiện (giá trị nhỏ nhất và
giá trị lớn nhất)
IN Dùng để so sánh một giá trị với một danh sách các giá trị (để cho biết giá trị so sánh
có nằm trong danh sách các giá trị đó hay không).

NOT Dùng để nghịch đảo các toán tử logic khác


OR Được dùng để kết hợp nhiều điều kiện trong một phát biểu lệnh SQL

EXISTS Để tìm sự tồn tại của một hàng trong một bảng mà thỏa mãn một điều kiện cụ thể

LIKE Toán tử LIKE được sử dụng để so sánh một giá trị với các giá trị tương tự bởi sử dụng
các ký tự wildcard (Là ký tự sử dụng để thể hiện một hay nhiều ký tự. Ví dụ như ký tự
sao * thường dùng để thể hiện một hay nhiều ký tự, ký tự ? thường dùng để thể hiện
một ký tự nào đó.)
SỬA, XÓA THỦ TỤC

 Sửa thủ tục


ALTER PROC[EDURE] <tên thủ tục>
<mô tả thủ tục mới>

 Ý nghĩa: cho phép sửa đổi nội dung trong thủ tục đã được tạo.

 Xóa thủ tục


DROP PROC[EDURE] <tên thủ tục>
XEM NỘI DUNG THỦ TỤC, HÀM…

 Cú pháp
EXEC sp_helptext <tên đối tượng>
 Ý nghĩa: Cho phép xem nội dung của các đối tượng không mã hóa,
bao gồm thủ tục, hàm, trigger, view, các trường tính toán, ràng
buộc…
 Ví dụ:
THỂ HIỆN DỮ LIỆU

 Cách 1: sử dụng lệnh SELECT, có thể dùng cho nhiều biểu thức
hoặc biến có kiểu dữ liệu khác nhau. Được thể hiện dạng grid trên
màn hình.

SELECT <danh sách biểu thức>

 Cách 2: Sử dụng lệnh PRINT, mỗi lệnh chỉ in được 1 dữ liệu trên
màn hình dưới dạng message. Do vậy, khi muốn đưa nhiều dữ liệu
bằng lệnh PRINT, thường sẽ phải chuyển về cùng dạng ký tự.

PRINT <biểu thức>


KHỐI LỆNH/LỆNH GỘP
 Trong lập trình, nhiều cấu trúc chỉ cho phép thực hiện một lệnh, do
vậy, để có thể đưa nhiều lệnh vào cấu trúc lập trình, MS SQL Server
cung cấp cấu trúc khối lệnh hay lệnh gôp, khi đó các lệnh nằm trong
cấu trúc này sẽ được coi như một lệnh.
 Cú pháp;
BEGIN
<các lệnh>
END
 Ví dụ:
BEGIN
Set @i=20
Set @a=@i / 7
END
CẤU TRÚC RẼ NHÁNH IF
 Cú pháp
IF Boolean_expression
{ sql_statement 1 | statement_block 1}
[ ELSE
{ sql_statement 2| statement_block 2} ]
 Ý nghĩa: Nếu biểu thức điều kiện có giá trị TRUE thì sẽ thực hiện lệnh 1,
ngược lại, sẽ thực hiện lệnh 2.
 Chú ý:
 Trong cấu trúc có thể có ELSE
 Có thể lồng nhiều lệnh IF vào nhau
 Ví dụ:
IF (@sochia =0)
Print ‘Chia cho 0’
ELSE
SELECT @kqua = @sobichia / @sochia
BÀI TẬP THỰC HÀNH 1

Lập thủ tục có đầu vào là 3 số, thủ tục


kiểm tra 3 số đó và đưa kết quả ra: có
phải là 3 cạnh của tam giác hay
không, nếu là tam giác thì là loại tam
giác gì?
BÀI TẬP THỰC HÀNH 2

 Lập một thủ tục cho phép thêm nhân viên mới vào bảng
NHANVIEN, các tham số truyền vào tương ứng với các
trường trong bảng. Yêu cầu kiểm tra nhân viên đã tồn
tại hay chưa dựa trên mã nhân viên.

Hàm: EXISTS(Câu lệnh SELECT/BẢNG)


Hàm trả về giá trị:
 TRUE: nếu có bản ghi
 FALSE: Không có bản ghi
HÀM CASE
 Cú pháp 1
CASE input_expression
WHEN when_expression THEN result_expression [ ...n ]
[ELSE else_result_expression]
END
 Cú pháp 2
CASE
WHEN Boolean_expression THEN result_expression [ ...n ]
[ELSE else_result_expression]
END
 Ý nghĩa: Trả về giá trị tương ứng khi biểu thức đầu vào bằng điều kiện
kiểm tra (dạng 1) hoặc biểu thức logic có giá trị TRUE (dạng 2)
VÍ DỤ

 Đưa ra danh sách gồm họ tên, giới tính của các nhân
viên
SELECT hoten, gt,
[Giới tính]= CASE gt
WHEN 0 THEN ‘Nam’
WHEN 1 THEN N’Nữ’
END
FROM nhanvien
BÀI TẬP THỰC HÀNH 3
 Nội dung 1:
Lập một thủ tục có tên sp_docso với tham số đầu vào là một số nguyên
từ 0-9, tham số đầu ra là chữ tương ứng với số đó.
 Nội dung 2:
Lập một thủ tục có tên sp_xeploai với tham số đầu vào là điểm trung bình
của sinh viên (có giá trị từ 0 đến 10), tham số đầu ra là xếp loại học tập
theo quy định sau:
 Điểm<3: Yếu
 3<=Điểm<5: Kém
 5<=Điểm<6.5: Trung bình
 6.5<=Điểm<8: Khá
 8<=Điểm<9: Giỏi
 9<=Điểm<=10: Xuất sắc
LỆNH LẶP WHILE
 Cú pháp
WHILE Boolean_expression
{ sql_statement | statement_block }
[ BREAK ]
{ sql_statement | statement_block }
[ CONTINUE ]
{ sql_statement | statement_block }
 Ý nghĩa: thực hiện các lệnh lặp đi lặp lại cho đến khi biểu thức điều
kiện có giá trị FALSE. Có thể lồng nhiều vòng lặp.
 Hai từ khóa:
 BREAK: thoát khỏi vòng lặp ngay lập tức
 CONTINUE: quay trở lại lệnh đầu tiên trong vòng lặp và bỏ qua các lệnh
phía sau CONTINUE
VÍ DỤ
 Thủ tục tính tổng n số tự nhiên, trong thủ tục hiện ra giá trị của từng số khi
lặp
create proc sp_tongsotunhien
as
declare @n int, @i int, @tong int
set @n=100
set @i=1
set @tong=0
while (@i<=@n)
begin
set @tong=@tong+@i
set @i=@i+1
end
print @tong
CON TRỎ
(CURSOR)
KHAI BÁO CON TRỎ

 Cú pháp chuẩn ISO


DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ]
CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
 Ý nghĩa: khai báo biến con trỏ để lấy dữ liệu qua câu lệnh SELECT
 Các tham số:
 INSENSITIVE: tạo một bản sao dữ liệu để làm việc
 SCROLL: cho phép thực hiện các lệnh FIRST, LAST, PRIOR, NEXT,
RELATIVE, ABSOLUTE khi làm việc với con trỏ.
 UPDATE: xác định các trường của bảng dữ liệu gốc có thể được cập
nhật qua con trỏ
ĐÓNG/MỞ CON TRỎ

 Mở Cursor
OPEN { { [ GLOBAL ] cursor_name } |
cursor_variable_name }
 Đóng Cursor
CLOSE { { [ GLOBAL ] cursor_name } |
cursor_variable_name }
 Loại Cursor khỏi bộ nhớ
DEALLOCATE { { [ GLOBAL ] cursor_name } |
@cursor_variable_name }
LẤY DỮ LIỆU TỪ CON TRỎ
 Cú pháp
FETCH
[ [ NEXT | PRIOR | FIRST | LAST
| ABSOLUTE { n | @nvar }
| RELATIVE { n | @nvar }
]
FROM
]
{ { [ GLOBAL ] cursor_name } | @cursor_variable_name }
[ INTO @variable_name [ ,...n ] ]
 Ý nghĩa: Lấy dữ liệu từ con trỏ vào các biến
 Trạng thái thực hiện được thể hiện qua biến hệ thống @@FETCH_STATUS, có
các giá trị sau:
 0: thành công
 -1: có lỗi khi thực hiện lệnh hoặc vượt giới hạn bản ghi
 -2: không có dữ liệu
VÍ DỤ
Lập thủ tục để đưa ra danh sách các nhân viên từ đầu bảng đến cuối bảng,
sau đó đưa ra danh sách ngược lại, từ cuối bảng đến đầu bảng.

create proc sp_hoten fetch prior from cs_nv into @ht


as while @@fetch_status=0
declare cs_nv scroll cursor for
begin
select hoten from nhanvien
open cs_nv print @ht
declare @ht nvarchar(30) fetch prior from cs_nv into @ht
fetch next from cs_nv into @ht end
close cs_nv
while @@fetch_status=0
deallocate cs_nv
begin
print @ht
fetch next from cs_nv into @ht
end
HÀM
(FUNCTION)
HÀM TRONG MS SQL SERVER

 Là một đối tượng trong cơ sở dữ liệu (CSDL) sử dụng


trong các câu lệnh SQL, được biên dịch sẵn và lưu
trong CSDL nhằm mục đích thực hiện xử lý nào đó như
tính toán phức tạp và trả về kết quả là giá trị nào đó.
 Luôn trả về giá trị
 Gồm 2 loại: Function hệ thống và Function do người dùng tự
định nghĩa
 Function do người dùng tự định nghĩa gồm:
 Scalar-valued: Trả về giá trị vô hướng của các kiểu dữ liệu T-SQL
 Table-valued: Trả về bảng, là kết quả của một hoặc nhiều lệnh
TẠO FUNCTION TRẢ VỀ GIÁ TRỊ LOẠI
SCALAR-VALUED

 Cú pháp
CREATE FUNCTION <Tên function> ([@<tên tham số> <kiểu dữ liệu> [=
<giá trị mặc định>], …,[...]])
RETURNS <kiểu dữ liệu> [WITH ENCRYPTION]
[AS]
BEGIN
[Thân của hàm]
RETURN <Biểu thức giá trị đơn>
END
CÁC THÀNH PHẦN TRONG LỆNH
 Tên function: Tên của hàm chúng ta sẽ tạo
 Tên tham số: Là các tham số Input cho hàm. Khai báo báo gồm tên của tham số
(trước tên tham số sử dụng tiền tố @), kiểu dữ liệu của tham số, chúng ta có thể chỉ
định giá trị mặc định cho tham số. Có thể chỉ định nhiều tham số đầu vào
 RETURNS: từ khóa này chỉ định kiểu dữ liệu hàm sẽ trả về. Kiểu dữ liệu phải được chỉ
định kiểu độ dài dữ liệu. Ví dụ: varchar(100)
 WITH ENCRYPTION: Từ khóa chỉ định code của hàm sẽ được mã hóa trong bảng
syscomments.
 AS: Từ khóa cho biết code của hàm bắt đầu.
 RETURN: Từ khóa này sẽ gửi giá trị tới thủ tục gọi hàm.
 Tên function phải là duy nhất trong 1 CSDL. Function được tạo/định nghĩa trong CSDL
nào thì chỉ sử dụng trong CSDL đó. Khác với Function có sẵn của SQL được truy cập
ở bất cứ đâu.
 Danh sách tham số tối đa 1024 tham số.
VÍ DỤ

Tạo hàm để đưa ra số lượng các loại mặt hàng chưa được bán lần nào

CREATE FUNCTION f_somathangchuaban


RETURNS int
AS]
BEGIN
Declare @soluong int
Select count(mahang) from t_dmhang where mahang not in (select mahang
from t_banhang
RETURN @soluong
END
HÀM GIÁ TRỊ BẢNG ĐƠN GIẢN (TABLE-
VALUED)

 Cú pháp
CREATE FUNCTION <Tên function> ([@<tên tham số> <kiểu dữ
liệu> [= <giá trị mặc định>], …,[...]])
RETURNS TABLE
[WITH ENCRYPTION]
[AS]
RETURN <Câu lệnh SQL>
VÍ DỤ

Lập hàm để đưa ra các phiếu bán hàng có số lượng đã bán lớn hơn tham số
được truyền vào

CREATE FUNCTION loc_banhang (@soluong float)


RETURNS TABLE
AS
RETURN Select * from t_banhang where soluong>@soluong
HÀM GIÁ TRỊ BẢNG ĐA CÂU LỆNH (TABLE-
VALUED)

 Cú pháp:
CREATE FUNCTION <Tên function> ([@<tên tham số> <kiểu dữ
liệu> [= <giá trị mặc định>], …,[...]])
RETURNS @<tên biến trả về> TABLE (<tên cột 1> <kiểu dữ liệu>
[tùy chọn thuộc tính], ..., <tên cột n> <kiểu dữ liệu> [tùy chọn
thuộc tính])
[AS]
BEGIN
<Câu lệnh SQL>
RETURN
END
VÍ DỤ
Lập thủ tục trả về bảng có 2 trường là ngày và số lần, tương ứng với ngày
hiện tại trong hệ thống và số lần bán hàng trong ngày đó
CREATE FUNCTION demsolanban
RETURNS @new_table TABLE (ngay smalldatetime), solan int)
AS
BEGIN
DECLARE @solan int = 0
SELECT @solan = count(*) FROM t_banhang
WHERE ngay=getdate()
INSERT INTO @new_table VALUES (getdate(), @solan)
RETURN
END
SỬA, XÓA HÀM

 Sửa hàm
ALTER FUNCTION <tên hàm>
<mô tả thủ tục mới>

 Ý nghĩa: cho phép sửa đổi nội dung trong hàm đã được tạo.

 Xóa hàm
DROP FUNCTION <tên thủ tục>
BÀI TẬP THỰC HÀNH 4

Tạo cơ sở dữ liệu có tên là BANHANG2 gồm các bảng sau:


HANGHOA(mahang,tenhang,dongia,VAT)
KHACHHANG(makh,tenkh,diachi,dienthoai,masothue)
BANHANG(sophieu,mahang,makh,ngayban,soluong)
Thực hiện các công việc sau:
1. Lập thủ tục thêm hàng hoá mới vào CSDL, có kiểm tra trùng lặp mặt hàng
2. Lập hàm có tên f_banhang để đưa ra danh sách các lần mua hàng khi biết
mã khách hàng, thông tin đưa ra gồm Số phiếu, ngày, tên hàng, số lượng,
thành tiền, VAT và tổng tiền
3. Lập thủ tục có tên sp_tonghopngay để tính tổng số tiền bán hàng và tổng
tiền thuế phải nộp khi cho một ngày nào đó được truyền vào.
4. Lập thủ tục có tên là sp_tonghophang để tính tổng tiền bán hàng, tổng tiền
thuế của mặt hàng cho một năm nào đó được truyền vào.
TRIGGER
TRIGGER

 Là một thủ tục lưu trữ không có tham số


 Trigger sẽ được tự động thực hiện khi có hoạt động cập nhật
trên bảng dữ liệu hoặc view như INSERT, UPDATE, DELETE
 Thường được sử dụng để kiểm tra ràng buộc dữ liệu, lưu
vết…
 Một bảng hoặc view có thể có nhiều Trigger
 Trigger còn được sử dụng cho CSDL và cho SERVER đối
với các lệnh CREATE, ALTER, DROP, GRANT, DENY,
REVOKE, UPDATE STATISTICS, LOGON. Sinh viên có thể
tham khảo thêm trong tài liệu.
TẠO TRIGGER

 Cú pháp:
CREATE TRIGGER trigger_name
ON { table | view }
{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [
UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ] [ NOT FOR REPLICATION ]
AS sql_statement
 Ý nghĩa tạo trigger cho bảng hoặc view với thao tác cập
nhật dữ liệu
CÁC THÀNH PHẦN TRONG LỆNH

 trigger_name: tên trigger


 on: tên bảng hoặc view.
 For/after: after được sử dụng để trigger được thực hiện sau khi tất cả các
thao tác cập nhật dữ liệu đã thực hiện thành công, đây cũng là thông số
ngầm định khi chỉ có từ khóa for duy nhất được chỉ định. After không sử
dụng cho view.
 Instead of: được thực thi thay thế các hoạt động INSERT, UPDATE,
DELETE.
 WITH APPEND: không sử dụng với AFTER và INSTEAD OF, chỉ sử dụng
khi mức độ tương thích từ 65 trở xuống (phiên bản SQL Server cũ).
 NOT FOR REPLICATION: xác định trigger không thực hiện đối với đối
tượng nhân bản.
VÍ DỤ

Tạo Trigger để lưu lại thao tác và thời gian thực hiện cập nhật dữ liệu vào
bảng t_dmhang, thao tác được ghi vào bảng my_log
Thực hiện:
1. Tạo bảng my_log trong CSDL Banhang
Create table my_log
(thaotac nvarchar(50),
Thoidiem smalldatetime)
2. Tạo trigger cho thao tác thêm dữ liệu
Create trigger tg_themdl
On t_dmhang
For INSERT
AS (N’Thêm mặt hàng’, getdate())
VÍ DỤ

3. Tạo trigger cho thao tác sửa dữ liệu


Create trigger tg_suadl
On t_dmhang
For UPDATE
AS (N’Sửa mặt hàng’, getdate())
4. Tạo trigger cho thao tác xóa dữ liệu
Create trigger tg_xoadl
On t_dmhang
For DELETE
AS (N’Xóa mặt hàng’, getdate())
SỬA, XÓA TRIGGER

 Sửa trigger

ALTER trigger <tên trigger>


<mô tả mới trigger>

 Xóa trigger
DROP Trigger <tên trigger>
TRANSACTION
TRANSACTION
 TRANSACTION là tiến trình thực hiện một nhóm các câu lệnh SQL, thực
thi một cách tuần tự và độc lập. Một Transaction được thực hiện thành
công khi tất cả câu lệnh đều thành công, khi đó tất cả các thay đổi dữ liệu
được thực hiện trong Transaction được lưu vào cơ sở dữ liệu.
 Một số tính chất
 Atomicity - Tính bảo toàn: nguyên tắc "all or nothing", đảm bảo rằng tất cả các
câu lệnh trong nhóm lệnh được thực thi thành công. Nếu không, Transaction bị
hủy bỏ tại thời điểm thất bại và tất cả các thao tác trước đó được khôi phục về
trạng thái cũ đồng nghĩa với việc không có gì thay đổi về mặt dữ liệu.
 Consistency - Tính nhất quán: đảm bảo rằng cơ sở dữ liệu thay đổi chính xác
các trạng thái khi một transaction được thực thi thành công.
 Isolation - Tính độc lập: cho phép các Transaction hoạt động độc lập và minh
bạch với nhau.
 Durability - Tính bền vững: đảm bảo rằng kết quả của một transaction được
xác định, không có chuyện dữ liệu của Transaction sau khi thực thi có thể
chuyển lại trạng thái dữ liệu lúc trước khi thực hiện.
CÁC LỆNH VỚI TRANSACTION

 Tạo transaction
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable
[ WITH MARK [ 'description' ] ] ]
 Kết thúc transaction
COMMIT [ TRAN [ SACTION ] [ transaction_name | @tran_name_variable
]]
 Lưu các điểm mốc trong transaction
SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
 Khôi phục trạng thái đến điểm mốc hoặc đầu transaction
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ] ]
MỘT SỐ LƯU Ý

 Có thể lưu nhiều điểm mốc trong một transaction


 Có thể khôi phục trạng thái đến bất kỳ điểm mốc nào
 Khi đã thực hiện lệnh kết thúc transaction, toàn bộ dữ
liệu đã được ghi vào CSDL, không còn khả năng khôi
phục được.
 Transaction thường được sử dụng khi có các thao tác
cập nhật dữ liệu như INSERT, UPDATE, DELETE.
TRY VÀ CATCH

 Cú pháp
BEGIN TRY { sql_statement | statement_block } END TRY
BEGIN CATCH [ { sql_statement | statement_block } ] END CATCH
 Ý nghĩa:
 Cấu trúc TRY CAT CATCH bắt tất cả các lỗi thực thi có mức độ nghiêm
trọng cao hơn 10 mà không đóng kết nối cơ sở dữ liệu.
 Khi có lỗi trong khối TRY, các lệnh trong khối CATCH sẽ thực hiện, ngược
lại, các lệnh trong CATCH sẽ được bỏ qua.
 Hai cấu trúc này luôn đi liền nhau và không được nằm trong hai khối
BEGIN …END khác nhau.
 Cấu trúc này không được sử dụng trong định nghĩa Hàm
VÍ DỤ
CREATE PROC sp_TransMathang COMMIT TRANSACTION suamathang
AS
BEGIN PRINT N’thực hiện xong';
BEGIN TRY END TRY
BEGIN CATCH
BEGIN TRANSACTION suamathang
PRINT N’Khôi phục lại';
UPDATE t_dmhang SET dongia = 10
ROLLBACK TRAN suamathang
WHERE mahang = ’1234’
END CATCH
UPDATE t_dmhang SET dongia = 20 END
WHERE mahang = ’3333’
TÓM TẮT MODUL 3

 Về mặt lý thuyết, nội dung của modul đã:


 Giới thiệu các lệnh T-SQL để lập trình
 Hướng dẫn lập trình thủ tục lưu trữ, hàm, trigger
 Giới thiệu các cấu trúc điều khiển và kiểu dữ liệu
 Các vấn đề về xử lý lỗi, toàn vẹn giao dịch

 Về thực hành
 Lập trình thủ tục và hàm
 Thực hiện tạo lập trigger và transaction

You might also like