CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · •...

114
Lý thuyết CSDL 1 GIÁO VIÊN: Đ Đ Th Th Mai Mai ng ng BMÔN: C C á á c c H H th th ng ng thông thông tin tin KHOA: Công Công ngh ngh thông thông tin tin Email: Email: [email protected] [email protected] SDLIU

Transcript of CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · •...

Page 1: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 1

GIÁO VIÊN: ĐĐỗỗ ThThịị Mai Mai HưHườờngngBỘ MÔN: CCáácc HHệệ ththốốngng thôngthông tin tin

KHOA: CôngCông nghnghệệ thôngthông tintinEmail: Email: [email protected]@gmail.com

CƠ SỞ DỮ LIỆU

Page 2: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 2

Chương 7 Ngôn ngữ T-SQL

1. Giới thiệu T-SQL2. Stored Procedure3. Function4. Trigger

Page 3: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 3

Mục đích

• Nắm vững các khái niệm lô (batch) và xử lý theo lô• Viết các câu lệnh SQL thể hiện logic của ứng dụng• Định nghĩa và gán giá trị cho các biến• Nắm vững và dùng được các lệnh điều khiển cấu trúc lập trình• Nắm cách dùng biến con trỏ• Viết được các thủ tục cơ bản đáp ứng yêu cầu qt csdl• Viết được và Sử dụng được hàm SQL trong truy vấn• Tạo được các trigger cơ bản

Page 4: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 4

Giới Thiệu Transact SQL (T-SQL)• Transact-SQL là ngôn ngữ SQL mở rộng dựa trên SQL chuẩn của ISO (International

Organization for Standardization) và ANSI (American National Standards Institute) đượcsử dụng trong SQL Server T-SQL được chia làm 3 nhóm:

Data Definition Language (DDL):lệnh dùng để quản lý các thuộc tính của một database như định nghĩa các hàng hoặc cột của một table, hay vị trí data file của mộtdatabase...thường có dạng

Create object_NameAlter object_NameDrop object_NameTrong đó object_Name có thể là một table, view, stored procedure, indexes...

Ví dụ:

Lệnh Create sau sẽ tạo ra một table tên Importers với 3 cộtCompanyID,CompanyName,Contact

USE Northwind• CREATE TABLE Importers(

CompanyID int NOT NULL,CompanyName varchar(40) NOT NULL,Contact varchar(40) NOT NULL)

Page 5: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 5

• Data Control Language (DCL):

Ðây là những lệnh quản lý các quyền truy cập lên từng object (table, view, stored procedure...). Thường có dạng sau: Grant, Revoke, Deny Ví dụ:

Lệnh sau sẽ cho phép user trong Public Role được quyền Select đối với table Customer trong database Northwind (Role là một khái niệm giống như Windows Group sẽ đượcbàn kỹ trong phần Security)

USE NorthwindGRANT SELECTON CustomersTO PUBLICLệnh sau sẽ từ chối quyền Select đối với table Customer trong database Northwind củacác user trong Public Role

USE NorthwindDENY SELECTON CustomersTO PUBLICLệnh sau sẽ xóa bỏ tác dụng của các quyền được cho phép hay từ chối trước đóUSE NorthwindREVOKE SELECT ON CustomersTO PUBLIC

Giới Thiệu Transact SQL (T-SQL)

Page 6: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 6

• Data Manipulation Language (DML):

Ðây là những lệnh phổ biến dùng để xử lý data như Select, Update, Insert, Delete

Giới Thiệu Transact SQL (T-SQL)

Page 7: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 7

• Vd: USE qlysvDECLARE @stt INTCREATE TABLE sv

(stt INT,masv NVARCHAR(10) NOT NULL

CONSTRAINT pk_sinhvien PRIMARY KEY, hoten NVARCHAR(50) NOT NULL ,

ngaysinh SMALLDATETIME NULL , gioitinh BIT NULL , noisinh NVARCHAR(100) NULL , malop NVARCHAR(10) NULL

)SELECT @stt = @@IDENTITYINSERT INTO svVALUES(@stt,’SV01CDT2K8’, 'Trần Thu Thuỷ', '11/10/1987',0,'Thái bình','CDT001K008')SELECT * FROM SV

Giới Thiệu Transact SQL (T-SQL)

Page 8: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 8

Giới thiệu về xử lý theo lô (SQL Batch Processing)

Lô (Batch)

Các lệnh SQL riêngrẽ

Được nhóm lại thànhlô (batch)

Được biêndịch thành

một kếhoạch thực

thi

Page 9: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 9

Định nghĩa

Quá trình trong đó một tập lệnh được xử lýcùng lúc được gọi là

Page 10: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 10

Ví dụ về một lô (batch)

Use QlSachSelect * from tacgiaUpdate tacgiaset phone= ‘098890 4566‘where tentg = ‘Trung'Go

Lệnh báo hiệu kếtthúc lô

Page 11: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 11

Mục đích: Hay dùng phân tách nhóm đểthực hiện độc lập

• VDụ: Xét kịch bảnCREATE DaTaBASE qlbanhangUSE qlbanhangCREATE TABLE ktra(

A INT,B INT

)SELECT * FROM ktra

• --Sẽ bị báo lỗi

Page 12: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 12

Cần sửa lại

• CREATE DaTaBASE qlbanhangGOUSE qlbanhangCREATE TABLE ktra(

A INT,B INT

)GOSELECT * FROM ktraGO

Page 13: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 13

Chú thích trong một lô xử lý

• Các chuỗi ký tự trong mã lệnh chương trình (còn được gọi là chú thích) không được xử lý bởi trình biên dịch.

• Dùng để giải thích cho mã lệnh hay vô hiệu hóa tạm thời các thành phầncâu lệnh T-SQL đang xử lý

• Giúp việc bảo trì mã lệnh dễ dàng hơn. • Chú thích thường được sử dụng để ghi lại tên chương trình, tên tác giả và

ngày tháng thực hiện thay đổi mã lệnh. • Chú thích có thể được dùng để mô tả các phép tính toán phức tạp hay giải

thích về phương pháp lập trình.

Page 14: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 14

Các hình thức chú thích

SQL Server hỗ trợ hai hình thức chú thích:

1) --(hai ghạch ngang)

Ví dụ:USE QlsachGO-- Đây là chú thích.

2) /* ... */ (cặp dấu ghạch chéo và dấu sao)

Ví dụ:

SELECT * FROM nhanvien /*Đây là chú thích*/

Page 15: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 15

Chú thích nhiều dòng

• Chú thích nhiều dòng /* */ không thể vượt quá một lô. Một chú thíchhoàn chỉnh phải nằm trong một lô xử lý.

• Ví dụ, trong công cụ Query Analyzer, lệnh GO báo hiệu kết thúc lô. Khigặp lệnh GO trên dòng lệnh nó sẽ gửi tất cả các mã lệnh sau từ khóaGO cuối cùng lên máy chủ SQL trong một lô xử lý.

• Nếu lệnh GO xuất hiện trên một dòng giữa /* và */ thì Query Analyzer sẽ gửi đi một đoạn chú thích có các ký tự đánh dấu sai trong mỗi lô vàsẽ gây ra lỗi cú pháp.

Page 16: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 16

Chú ý:

• Đối với các lệnh CREATE như là: CREATE DEFAULT, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER, CREATE VIEW không được phép kết hợp vớicác lệnh khác trong cùng một lô.

Page 17: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 17

Biến cục bộ

Page 18: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 18

Khai báo bien

• DECLARE @Tên_biến Kiểu_dữ_liệu [, ...]• Kiểu dữ liệu text, ntext hoặc image không được chấp nhận khi khai

bao bien• Ví dụ: Để khai báo các biến lưu trữ giá trị tổng số lượng đặt hàng,

họ tên nhà cung cấp, ngày xuất hàng. Sử dụng lệnh DECLARE như sau:

DECLARE @Tongsldat INT, @Hotenncc CHAR(50)DECLARE @Ngayxh DATETIME

Page 19: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 19

Gán giá trị cho biến

• Từ khóa SET hay SELECT được dùng để gán giá trị cho biến.• Cú pháp: SET @<tên biến cục bộ> = <giá trị>

Hoặc là:SELECT @<Tên biến cục bộ> = <giá trị>

• Chú ý: Phạm vi hoạt động của biến chỉ nằm trong một thủ tụchoặc một lô có chứa lệnh khai báo biến đó

Page 20: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 20

Ví du:

• Để gán giá trị là ngày 25/03/2002 vào biến ngày xuất hàng ta sửdụng lệnh SET như sau:

• DECLARE @Ngayxh DATETIMESET @Ngayxh='2002-03-25'

• Chú ý:Đối với kiểu dữ liệu dạng ngày trong Microsoft SQL Server thường sử dụng theo định dạng yyyy-mm-dd để gángiá trị vào biến hoặc vào trong cơ sở dữ liệu.

Page 21: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 21

Ví du:

• Để tính ra số lượng đặt hàng cao nhất của mặt hàng “ĐầuDVD Hitachi 1 đĩa” có mã vật tư là

“DD01”. Sử dụng lệnh SELECT như sau:DECLARE @MaxSldat INTSELECT @MaxSldat=MAX(SLDAT)FROM CTDONDH

WHERE MAVTU="DD01"

Page 22: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 22

Xem giá trị hiện hành của biến

• PRINT @Tên_biến | Biểu_thức_chuỗi• Để tính đồng thời giá trị số lượng đặt hàng thấp nhất và cao

nhất, hiển thị kết quả ra màn hình. Ta sử dụng lệnh SELECT và PRINT :

DECLARE @MinSldat INT, @MaxSldat INTSELECT @MinSldat=MIN(SLDAT),@MaXSldat=MAX(SLDAT)

FROM CTDONDHPRINT "Số lượng thấp nhất là : "PRINT @MinSldat

PRINT "Số lượng cao nhất là : " + CONVERT(VARCHAR(10), @MaxSldat)

Page 23: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 23

Các loại biến

SQL Server hỗ trợ hai loại biến sau trong T-SQL:

Page 24: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 24

Các biến toàn cục

Biến toàn cục trong SQL Server bắt đầu bằng 2 ký tự @. Ta cóthể truy xuất giá trị của các biến này bằng truy vấn SELECT đơn giản

Page 25: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 25

Danh sách các biến toàn cục

Các biến Ý nghĩa@@CONNECTIONS Số các kết nối đên máy chủ từ lần khởi động

cuối.@@CPU_BUSY Số milliseconds (một phần ngìn giây) hệ thống

đã xử lý từ khi SQL Server được khởi động@@CURSOR_ROWS Số bản ghi trong cursor mở gần nhất.

@@DATEFIRST Giá trị hiện tại của tham số trong lệnh SET DATEFIRSTquyết định ngày đầu tiên của tuần.

@@ERROR Mã lỗi của lỗi xảy ra gần nhất

@@FETCH_STATUS 0 nếu trạng thái lần truy xuất cuối thành công. -1 nếu có lỗi

Page 26: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 26

Danh sách các biến toàncục(tiếp…)

Các biến Ý nghĩa

@@IDENTITY Giá trị identity gần nhất được sinh ra@@LANGUAGE Tên của ngôn ngữ đang được sử dụng.@@MAX_CONNECTIONS Số kết nối tối đa có thể.@@ROWCOUNT Số bản ghi bị tác động bởi câu lệnh SQL

gần nhất.@@SERVERNAME Tên của máy chủ@@SERVICENAME Tên của dịch vụ SQL trên máy chủ@@TIMETICKS Số milliseconds trong một tick trên máy chủ@@TRANSCOUNT Số giao dịch đang hoạt động trên kết nối

hiện tại@@VERSION Thông tin về phiên bản của SQL Server

Page 27: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 27

Các lệnh điều khiển

Page 28: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 28

Các lệnh điều khiển(tiếp..)

Page 29: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 29

BEGIN..END

BEGIN...END : Một tập lệnh SQL được thực thi sẽ đượcđặt trong BEGIN..END.

Cú pháp:BEGIN

<lệnh> | <đoạn lệnh>END

Page 30: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 30

IF..ELSE

IF...ELSE: Chúng ta có thể thực thi các tập lệnh SQL khác nhau dựa vào các điều kiện khác nhau.

Cú pháp:IF <điều kiện>

< lệnh sql1> | <tập lệnh1>

[ ELSE < lệnh sql2>|< tập lệnh2> ]

IF statement

TRUE FALSE

Page 31: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 31

Ví dụ về IF

Page 32: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 32

IF có kết hợp từ khóa EXISTS

• Để kiểm tra sự tồn tại của các dòng dữ liệu bên trong bảng• IF EXISTS (Câu_lệnh_SELECT)

Câu_lệnh1 | Khối_lệnh1[ ELSECâu_lệnh2 | Khối_lệnh2 ]

Page 33: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 33

Cấu trúc WHILE

WHILE: Có thể thực thi một lệnh SQL hay một tậplệnh dựa vào điều kiện nào đó. Các câu lệnhđược thực thi nhiều lần khi nào điều kiện vẫn cònđúng.

Cú pháp:WHILE <Điều kiện>BEGIN

Các_lệnh_lặpEND

Page 34: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 34

BREAK và CONTINUE

USE pubsGOWHILE (SELECT AVG(price) FROM titles) < $30BEGINUPDATE titles

SET price = price * 2SELECT MAX(price) FROM titlesIF (SELECT MAX(price) FROM titles) > $50

BREAKELSE

CONTINUEENDPRINT 'Too much for the market to bear'

Chúng ta có thể dùng từ khóa CONTINUE và BREAK trongvòng lặp while để điều khiển phần thực thi của các câu lệnh.

Page 35: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 35

Sơ đồ đầy đủ:

• WHILE Biểu_thức_logicBEGIN

Các_lệnh_nhóm_lặp1[ IF Biểu_thức_lặp_tiếp

CONTINUE ][ IF Biểu_thức_thoát

BREAK ]Các_lệnh_nhóm_lặp2

ENDCác_lệnh_khác

Page 36: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 36

Từ khóa GOTO

GOTO:Có thể thay đổi dòng thực thi của chương trình đến một điểm (còn

gọi là nhãn).Các lệnh sau từ khóa GOTO sẽ được bỏ qua và tiến trình thực thi

tiếp tục ở vị trí nhãn chỉ ra trong mệnh đề GOTO.

Cú pháp:

GOTO <nhãn>

Page 37: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 37

RETURN

RETURN: Ta có thể dùng RETURN bất cứ lúc nào để thoát khỏimột đoạn lệnh hay một thủ tục. Các lệnh sau từ khóa RETURN sẽ không được thực thi.

Cú pháp:

RETURN [số nguyên]

Page 38: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 38

Con trỏ

Một con trỏ là một đối tượng csdl, được sử dụng đểthao tác với từng hàng dữ liệuVới con trỏ ta có thể: Cho phép định vị các hàng chỉ định của tập kết

quả. Nhận về một hàng đơn hoặc tập hợp các hàng từ vị

trí hiện tại của tập kết quả. Hỗ trợ sửa đổi dữ liệu của hàng ở vị trí hiện tại

trong tập kết quả. Hỗ trợ quan sát đối với các thay đổi được tạo ra

bởi các người dùng khác trên các dữ liêu của tậpkết quả.

Page 39: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 39

Tạo con trỏ

Lệnh DECLARE dùng để tạo một con trỏ. Lệnh này chứa các lệnh SELECT để bao gồm các bản ghi từ

bảng. Cú pháp là:

DECLARE <Tên con trỏ> CURSOR[LOCAL | GLOBAL][FORWARD ONLY | SCROLL][STATIC | KEYSET | DYNAMIC ][READ_ONLY | SCROLL_LOCKS]

FOR <Lệnh SELECT>[FOR UPDATE [OF <Tên cột> [,….N]]]

Page 40: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 40

Các bước sử dụng con trỏ

Mở con trỏOPEN <Cursor_name>

Nhận về các bản ghiFETCH <Cursor_name>

Đóng con trỏCLOSE <Cursor_name>

Xoá các tham chiếu tới con trỏDEALLOCATE <Cursor_name>

Page 41: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 41

Truy xuất và duyệt con trỏFETCH [NEXT | PRIOR | FIRST | LAST| ABSOLUTE n | RELATIVE n]

FROM Tên_cursor[INTO Danh_sách_biến]

FETCH FIRST: Truy xuất hàng đầu tiên.FETCH NEXT: Truy xuất hàng tiếp theoFETCH PRIOR: Truy xuất hàng trước hàng truy xuất trước đó. FETCH LAST: Truy xuất hàng cuối cùng.FETCH ABSOLUTE n: Nếu n là một số nguyên dương, truy

xuất hàng n trong con trỏ. Nếu n là một số nguyên âm, hàng n trước hàng cuối cùng trong con trỏ được truy xuất. Nếu nbằng 0, không hàng nào được truy xuất.

Page 42: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 42

Truy xuất và duyệt con trỏ

FETCH RELATIVE n: Truy xuất n hàng từ hàng truy xuấttrước đó, nếu n là số dương. Nếu n là số âm, n hàng trướchàng truy xuất trước đó được truy xuất. Nếu n bằng 0, hànghiện tại được nhận về.

Page 43: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 43

Các biến toàn cục của lệnh FETCH

@@FETCH _STATUS: Biến này trả về một số nguyênbiễu diễn kết quả của lệnh truy xuất cuối cùng của con trỏ.@@CURSOR_ROWS: Biến này trả về tổng số hàng hiện

tại trong con trỏ đang mở.

Page 44: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 44

Ví dụ tạo con trỏ

Page 45: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 45

create proc danhmatudongasbegincreate table danhsach(sobd nchar(10),manv nchar(10), hoten nvarchar(50), ngaysinh datetime)declare @ma nchar(10), @ten nvarchar(50),@ns datetime,@stt int,@i intset @i=1 DECLARE cur_tro CURSOR FORWARD_ONLY FOR SELECT manv,hoten,ngaysinh from nhanvienOPEN cur_tro

WHILE 0=0--@@FETCH_STATUS=0BEGINFETCH NEXT FROM cur_tro

INTO @ma,@ten,@nsIF @@FETCH_STATUS<>0

BREAKinsert into danhsach values('SBD'+convert(nchar(7),@i),@ma,@ten,@ns)

set @i=@i+1end

CLOSE cur_troDEALLOCATE cur_troEnd

Gọi thủ tục;danhmatudongKiểm tra;Select * from danhsach

Ví dụ tạo con trỏ

Page 46: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 46

Ví dụ

• Để cập nhật giá trị dữ liệu cho cột TGNHAP (trị giá nhập) trong bảng PNHAP bằng cách duyệt qua từng phiếu nhập, tính ra trị giá nhập của từng phiếu căn cứ vào số lượng nhậpvà đơn giá nhập của từng vật tư trong bảng CTPNHAP, saucùng cập nhật vào cột TGNHAP

Page 47: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 47

DECLARE @sSopn CHAR(4), @nTongtg MONEYDECLARE cur_Pnhap CURSORFORWARD_ONLYFOR

SELECT SOPNFROM PNHAPOPEN cur_PnhapWHILE 0=0BEGIN

FETCH NEXT FROM cur_PnhapINTO @sSopnIF @@FETCH_STATUS<>0

BREAKSELECT @nTongtg = SUM(SLNHAP*DGNHAP)

Page 48: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 48

FROM Ctnhap WHERE Sopn=@sSopnPRINT ‘Đang cập nhật phiếu nhập:’+@sSopn+’…’UPDATE PnhapSET Tgnhap = @nTongtgWHERE CURRENT OF cur_Pnhap

ENDCLOSE cur_PnhapDEALLOCATE cur_Pnhap

Page 49: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 49

Tổng kết

Con trỏ được tạo bằng lệnh DECLARE. Đầu tiên con trỏ đượckhai báo và tạo ra trong bộ nhớ. Sau đó nó mới được mở. Lệnh OPEN mở con trỏ. Việc nhận về các bản ghi từ một con

trỏ được gọi là fetching. Một người dùng chỉ có thể nhận vềmột bản ghi tại một thời điểm. Lệnh FETCH được sử dụng để đọc các bản ghi từ con trỏ. Ngầm định, một con trỏ là forward only. Nó có thể truy xuất

tuần tự các bản ghi từ bản ghi đầu tiên đến bản ghi cuốicùng.

Page 50: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 50

Thủ tục lưu trữ

Page 51: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 51

Mục tiêu

Định nghĩa các thủ tục lưu trữ.Giải thích quá trình tạo lập, sửa và thực thi các thủ tục lưu trữ

do người dùng định nghĩa. Sử dụng các tham số và các biến trong thủ tục lưu trữ.Thực hiện cài đặt thủ tục trên ví dụChọn các tuỳ chọn biên dịch lại phù hợp.Tìm hiểu báo lỗi trong thủ tục lưu trữ.

Page 52: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 52

Thủ tục lưu trữ

Tập hợp biên dịch các câu lệnh T-SQL được lưu trữ với mộttên xác định

Sử dụng để thực hiện các nhiệm vụ quản trị, hoặc áp dụng cácluật giao dịch phức tạpCó hai loại thủ tục lưu trữ:

Thủ tục lưu hệ thống đề cập đến phương pháp quản trị dữliệu và cập nhật thông tin vào các bảng (thường bắt đầu bằngsp_).Thủ tục lưu do người dùng định nghĩa.

Page 53: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 53

Thủ tục lưu trữ < tiếp tục…>

Page 54: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 54

Lợi ích của thủ tục Tăng tôc độ thực hiện : Các thủ tục được tối ưu hóa lần đầu tiên khi

chúng biên dịch ->cho phép thực thi với chi phí it hơn so với T-SQL thông thường.

Tốc độ truy nhập dữ liệu nhanh hơn: SQl không phải lựa chọn cáchtốt nhất để xử lý các lệnh SQL và truy suất csdl mỗi khi chúng đượcbiên dịch

Modular programming:Một thủ tục có thể phân thành các thủ tụcnhỏ hơn, các thủ tục này có thể được dùng chung giữa các thủ tụckhác->giảm thời gian thiết kế và thực thi các thủ tục đông thời cũngdễ quản lý và gỡ rối.

Sự nhất quán. Cải thiện sự bảo mật: Nâng cao an toàn bảo mật. Có thể chỉ ra quyên

thực thi cho các thủ tục vì vậy nó thực hiện đúng tác vụ người dùng.

Page 55: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 55

Các danh mục củathủ tục lưu trữ hệ thống

System storedprocedures

SQL Server Query Agent

SQL Mail Catalog

Extended

Replication

SystemSecurityCursor

Distributed Query

Page 56: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 56

Ví dụ về hệ thống thủ tục lưu trữ

System storedprocedures

sp_stop_job

sp_password

sp_configure

sp_help

sp_helptextsp_start_job

sp_tables

sp_stored_procedures

sp_server_info

sp_databases

Page 57: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 57

Định nghĩa thủ tục lưu trữ bằng EM: Bước 1:

Page 58: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 58

Bước 2:

Page 59: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 59

Tạo thủ tục lưu trữ bằng T-SQL Cú pháp:

CREATE PROC[EDURE] <tên thủ tục> [(<DSách tham số>) ][WITH RECOMPILE|ENCRYPTION|RECOMPILE, ENCRYPTION]AS

[DECLARE <biến cục bộ><Các câu lệnh của thủ tục>

Các thủ tục lưu trữ có quyền truy cập tới tất cả các đối tượng khithủ tục được gọi.

2100 tham số có thể được sử dụng trong một thủ tục lưu trữ. Tham so bắt đầu bởi @, cần chỉ ra kiểu dliệu của tham số

Có thể tạo lập nhiều biến cục bộ trong thủ tục tuỳ khả năng cungcấp của bộ nhớ.

Dung lượng tối đa của thủ tục lưu trữ là 128 MB.

Page 60: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 60

Ví du: Cho csdl qlsv

Page 61: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 61

Yeu cau:

Giả sử ta cần thực hiện một chuỗi các thao tác trên cơ sở dữ liệu1. Bổ sung thêm môn học cơ sở dữ liệu có mã CST005 và số đơn vị học

trình là 5 vào bảng MONHOC2. Lên danh sách nhập điểm thi môn cơ sở dữ liệu cho các sinh viên học

lớp có mã CDT002K009 (bổ sung thêm vào bảng DIEMTHI các bản ghivới cột MAMONHOC nhận giá trị CST005, cột MASV nhận giá trị lầnlượt là mã các sinh viên học lớp có mã CDT002K009 và các cột điểmlà NULL).

Page 62: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 62

CREATE PROC sp_LenDanhSachDiem @mamh NCHAR(10),@tenmh NVARCHAR(50), @sodvht iNT,@malop NCHAR(10)

ASBEGIN

INSERT INTO monhoc(mamh,tenmh,sodvht) VALUES(@mamh,@tenmh,@sodvht)INSERT INTO diemthi(mamh,masv)

SELECT @mamh,masvFROM sinhvienWHERE malop=@malop

ENDKhi thủ tục trên đã được tạo ra, thực hiện được hai yêu cầu trên qua lời gọi thủ tục:

sp_LenDanhSachDiem 'CST006','Cơ sở dữ liệu',5,'CNTT'

Page 63: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 63

vd:

• Tính mặt hàng nào có số lượng bán caonhất trong tháng 01/2002.

Page 64: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 64

CREATE PROC MaxSLhang_200201 ASDECLARE @sTenhang VARCHAR(100), @smahang char(4), @nMaxSL INTSELECT

@smahang=a.mahang,@sTenhang=tenhang,@nMaxSL=Sum(b.soluong)FROM mathang a INNER JOIN chitietdathang b ON a.Mahang=b.MahangJOIN dondathang c ON b.SOhd=c.SOhdWHERE CONVERT(CHAR(7),ngaydathang,21)="2002-01“GROUP BY a.mahang, tenhang

Page 65: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 65

HAVING sum(soluong)>=ALL(SELECT sum(soluong)FROM (FROM mathang a INNER JOIN chitietdathang b ON

a.Mahang=b.MahangJOIN dondathang c ON b.SOhd=c.SOhdWHERE CONVERT(CHAR(7),ngaydathang,21)="2002-01“GROUP BY a.mahang, tenhang)PRINT @sTenhang + " có doanh số bán cao nhất,"PRINT “VớI số lượng: " + CAST(@nMaxSL AS CHAR(10))GO

Page 66: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 66

Thực thi các thủ tục người dùng

Lời gọi thủ tục có dạng:<tên_thủ_tục> [<danh_sách_các_đối_số>]

Số lượng các đối số và 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ố hình thức.

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êntrong 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ápnhư sau:

EXEC[UTE] <tên_thủ_tục> [<danh_sách_các_đối_số>]vdụ: EXECUTE MaxSLhang_200201Kết quả trả về : Số lượng 10Thứ 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ố đượcviết dưới dạng:

@<tên_tham_số> = <giá_trị>

Page 67: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 67

VD sử dụng biến trong thủ tục:

CREATE PROC sp_Vidu(@malop1 NVARCHAR(10),@malop2 NVARCHAR(10))ASDECLARE @tenlop1 NVARCHAR(30)DECLARE @namnhaphoc1 INT

DECLARE @tenlop2 NVARCHAR(30) DECLARE @namnhaphoc2 INTSELECT @tenlop1=tenlop,@namnhaphoc1=namnhaphocFROM lop WHERE malop=@malop1SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphocFROM lop WHERE malop=@malop2PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1)

print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)IF @namnhaphoc1=@namnhaphoc2

PRINT 'Hai lớp nhập học cùng năm'ELSE

PRINT 'Hai lớp nhập học khác năm'

Page 68: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 68

Giá trị trả về của tham số trong thủ tục

• trường hợp cần giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta khai báo thamsố của thủ tục theo cú pháp:

@tên_tham_số kiểu_dữ_liệu OUTPUT• Hoặc:

@tên_tham_số kiểu_dữ_liệu OUT• Trong lời gọi thủ tục, sau đối số được truyền cho thủ tục, ta cũng phải chỉ định thêm

từ khoá OUTPUT (hoặc OUT)CREATE PROCEDURE sp_Conghaiso(

@a INT,@b INT,@c INT OUTPUT)

ASSELECT @c=@a+@b

Page 69: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 69

• Thực hiện lời gọi thủ tục trong một tập các câu lệnh như sau:DECLARE @tong INT SELECT @tong=0EXECUTE sp_Conghaiso 100,200,@tong OUTPUTSELECT @tong• => câu lệnh “SELECT @tong” sẽ cho kết quả là: 300

Page 70: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 70

Tham số với giá trị mặc định:

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

CREATE PROC sp_TestDefault(ASBEGIN

@tenlop NVARCHAR(30)=NULL,@noisinh NVARCHAR(100)='Huế')

Page 71: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 71

IF @tenlop IS NULLSELECT hodem,ten

FROM sinhvien INNER JOIN lopON sinhvien.malop=lop.malopWHERE noisinh=@noisinh

ELSESELECT hodem,tenFROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malopWHERE noisinh=@noisinh AND

tenlop=@tenlopEND

Page 72: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 72

• Cho biết họ tên của các sinh viên sinh tại Huế:sp_testdefault

• Cho biết họ tên của các sinh viên lớp Tin K24 sinh tại Huế:sp_testdefault @tenlop='Tin K24'

• Cho biết họ tên của các sinh viên sinh tại Nghệ An:sp_testDefault @noisinh=N'Nghệ An'

• Cho biết họ tên của các sinh viên lớp Tin K26 sinh tại Đà Nẵng:sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'

Page 73: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 73

Biên dịch lại các thủ tục lưu trữ

Các thủ tục lưu trữ được biên dịch lại để phản ánh sự thayđổi tới các chỉ số.

Có ba cách để biên dịch lại các thủ tục: Sử dụng thủ tục hệ thống sp_recompile system Chỉ rõ WITH RECOMPILE với lệnh CREATE

PROCEDURE Chỉ rõ WITH RECOMPILE với lệnh EXECUTE

Page 74: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 74

Sửa các thủ tục lưu trữ

Câu lệnh ALTER PROCEDURE được sử dụng để sửachữa một thủ tục lưu trữ

Cú pháp giống như lệnh CREATE PROCEDURE Sự thay đổi này vẫn giữ lại các quyền người dùng Cp: ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]

[WITH RECOMPILE|ENCRYPTION| RECOMPILE,ENCRYPTION] AS

<Các_câu_lệnh_Của_thủ_tục>

Page 75: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 75

Các thông báo lỗi

Trả về các mã hoặc lệnh RAISERROR có thể được dùngđể đưa ra các lỗi của người dùng

Trả về mã trong thủ tục lưu trữ là các giá trị nguyên Lệnh RAISERROR statement ghi các lỗi và gán các cấp độ

nghiêm trọng của lỗi

Page 76: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 76

Xoá thủ tục

• Sử dụng câu lệnh DROP PROCEDURE với cú pháp như sau:

DROP PROCEDURE <tên_thủ_tục >

Page 77: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 77

Tóm tắt

Một thủ tục lưu trữ là một nhóm các câu lệnh SQL được biêndịch lại.Người phát triển CSDL hoặc người quản trị hệ thống viết thủ

tục để chạy các nhiệm vụ quản trị thông thường, hoặc để ứngdụng các luật giao dịch phức tạp. Thủ tục lưu trữ chứa các thaotác hoặc các câu lệnh truy vấn dữ liệu.Các thủ tục lưu trữ tăng tốc độ thực thi của truy vấn, hỗ trợ truy

cập dữ liệu nhanh, hỗ trợ việc lập trình theo mô đun, duy trìtính nhất quán, và tăng tính bảo mật.

Page 78: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 78

Tóm tắt <tiếp theo…>

Có hai kiểu thủ tục lưu trữ: Các thủ tục lưu trữ yêu cầu các cơ chế đối với CSDL quản

trị, và cập nhật các bảng. Các thủ tục người dùng định nghĩa.

Câu lệnh CREATE PROCEDURE được sử dụng để tạo lập mộtthủ tục lưu trữ người dùng dịnh nghĩa.Câu lệnh EXECUTE được sử dụng để chạy thủ tục lưu trữ.Các tham số có thể được sử dụng để truyền các giá trị vào và

ra từ thủ tục lưu trữ.

Page 79: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 79

Tóm tắt <tiếp theo…>

Có ba cách để biên dịch lại các thủ tục lưu trữ: Sử dụng thủ tục hệ thống sp_recompile Chỉ rõ WITH RECOMPILE với lệnh CREATE

PROCEDURE Chỉ rõ WITH RECOMPILE với lện EXECUTE

Câu lệnh ALTER PROCEDURE được sử dụng để sửa chữamột thủ tục lưu trữ.Trả về các mã hoặc lệnh RAISERROR được sử dụng để đưa ra

các lỗi của người sử dụng.

Page 80: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 80

Hàm

• Hàm là đối tượng cơ sở dữ liệu tương tự như thủtục.

• Điểm khác biệt giữa hàm và thủ tục: Hàm trả về mộtgiá trị thông qua tên hàm còn thủ tục thì không.

• Có thể sử dụng hàm như là một thành phần của mộtbiêu thức (chẳng hạn, trong dsách chọn của lệnhSELECT).

• Co hàm do HQT CSDL cung cấp sẵn• Người sử dụng có thể định nghĩa các hàm nhằm

phục vụ cho mục đích riêng của mình

Page 81: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 81

Hàm hệ thống

Page 82: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 82

Ba loại hàm

– Các hàm thao tác với tập bản ghi có thể được dùngthay cho tên các bảng trong SQL.

– Các hàm tập hợp tính toán cho ra kết quả là một giá trịđơn nhất (ví dụ tính tổng hay trung bình).

– Các hàm vô hướng thao tác trên một giá trị và trả vềmột giá trị. Các hàm này có thể được dùng trong cácbiểu thức.

Page 83: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 83

Các hàm chuyển đổi

Hàm chuyển đổi được dùng để chuyển 1 giá trị từ mộtkiểu dữ liệu sang kiểu dữ liệu khác. Ngoài ra nó cònđược dùng để định dạng ngày tháng. SQL Server cungcấp cho ta hàm chuyển đổi duy nhất là CONVERT().

Cú pháp:CONVERT(datatype[(length)], expression [,style])

Ví dụ:

SELECT ‘EMP ID:’ + CONVERT (CHAR(4), EMPLOYEEID FROM EMPLOYEES

Page 84: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 84

Date Parts

DatePart Từ viết tắt Giá trịHour hh 0-23Minute Mi 0-59Second Ss 0-59Millisecond Ms 0-999Day of year Dy 1-366Day Dd 1-31

Page 85: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 85

Date Parts (tiếp…)

Datepart Từ viết tắt Giá trị

Week wk 1-53Weekday dw 1-7Month mm 1-12Quarter qq 1-4Year yy 1753-9999

Page 86: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 86

Các hàm ngày tháng và số học

Các hàm ngày tháng

GETDATE()DATEADD(datepart,number,date)DATEDIFF(datepart,date1,date2)DATENAME(datepart,date)DATEPART(datepart,date)

Các hàm số học

ABS(num_expr)CEILING(num_expr)FLOOR(num_expr)POWER(num_expr,y)ROUND(num_expr,length)Sign(num_expr)Sqrt(float_expr)

Page 87: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 87

Các hàm hệ thống

Hàm

DB_ID([‘database_name’])DB_NAME([database_id])HOST_ID()HOST_NAME()ISNULL(expr,value)OBJECT_ID(‘obj_name’)OBJECT_NAME(object_id)SUSER_SID([‘login_name’])SUSER_ID([‘login_name’])SUSER_SNAME([server_user_id])SUSER_NAME([server_user_id])USER_ID([‘user_name’])USER_NAME([user_id])

Page 88: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 88

Các hàm tập hợp

Hàm Giá trị trả vềSum(col_name) Trả về giá trị tổng.Avg(col_name) Trả về giá trị trung bình.

COUNT(*) Hàm đếm các bản ghi trong bảng thỏamãn điều kiện

Max(col_name) Trả về giá trị lớn nhất trong một tập giá trị.Min(col_name) Trả về giá trị nhở nhất trong một tập hợp.

Page 89: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 89

Định nghĩa và sử dụng hàm

Cú pháp: CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS

(kiểu_trả_về_của_hàm)AS BEGIN

các_câu_lệnh_của_hàmEND

Page 90: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 90

VD: Định nghĩa hàm tính ngày trong tuần (thứ) củamột giá trị kiểu ngày

CREATE FUNCTION thu(@ngay DATETIME) RETURNS NVARCHAR(10)AS

BEGINDECLARE @st NVARCHAR(10)

SELECT @st=CASE DATEPART(DW,@ngay)WHEN 1 THEN 'Chu nhật'WHEN 2 THEN 'Thứ hai'WHEN 3 THEN 'Thứ ba'WHEN 4 THEN 'Thứ tư'WHEN 5 THEN 'Thứ năm'WHEN 6 THEN 'Thứ sáu'ELSE 'Thứ bảy' END

RETURN (@st) /* Trị trả về của hàm */END

Page 91: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 91

Sử dụng hàm

• Sử dụng như hàm do hqt csdl cung cấp: • SELECT masv,hodem,ten,dbo.thu(ngaysinh),ngaysinh

FROM sinhvienWHERE malop=’C24102’

Page 92: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 92

Hàm với giá trị trả về là “dữ liệu kiểubảng”

CREATE FUNCTION tên_hàm ([danh_sách_tham_số]) RETURNS TABLE

ASRETURN (câu_lệnh_select)

Page 93: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 93

Các qui tắc:

• Kiểu trả về của hàm được chỉ định bởi mệnh đề RETURNS TABLE.

• Trong phần thân của hàm chỉ có duy nhất một câu lệnhRETURN xác định giá trị trả về của hàm thông qua duy nhấtmột câu lệnh SELECT (không sử dụng bất kỳ câu lệnh nàokhác trong phần thân của hàm).

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 94: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 94

VD: Định nghĩa hàm func_XemSV

CREATE FUNCTION func_XemSV(@khoa SMALLINT) RETURNS TABLEAS

RETURN(SELECT masv,hodem,ten,ngaysinhFROM sinhvien INNER JOIN lop

ON sinhvien.malop=lop.malopWHERE khoa=@khoa)

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 95: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 95

Dùng hàm đã định nghĩa:• Để biết danh sách các sinh viên khoá 25, ta sử dụng câu lệnh như sau:SELECT * FROM dbo.func_XemSV(25)• Còn câu lệnh dưới đây cho ta biết được danh sách sinh viên khoá 26SELECT * FROM dbo.func_XemSV(26)

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 96: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 96

• Khi cần phải sử dụng nhiều câu lệnh trong phần thân hàm, cú phápđnghĩa hàm:

• CREATE FUNCTION <tên_hàm>([<danh_sách_tham_số>]) RETURNS @<biến_bảng> TABLE <định_nghĩa_bảng>

ASBEGIN

<các_câu_lệnh_trong_thân_hàm>RETURN

END

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 97: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 97

Lưu ý

• Cấu trúc bảng trả về bởi hàm được xác định dựa vào định nghĩa củabảng trong mệnh đề RETURNS.

• Biến @<biến_bảng> trong mệnh đề RETURNS có phạm vi sử dụngtrong hàm và được sử dụng như một tên bảng.

• Câu lệnh RETURN trong thân hàm không chỉ định giá trị trả về. Giá trị trảvề của hàm chính là các dòng dữ liệu trong bảng có tên là @<biếnbảng> được định nghĩa trong mệnh đề RETURNS

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 98: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 98

Ví dụ dưới đây minh hoạ cách sử dụng dạng hàmnày trong SQL

CREATE FUNCTION Func_Tongsv(@khoa SMALLINT) RETURNS @bangthongke TABLE

(makhoa NVARCHAR(5),tenkhoa NVARCHAR(50),tongsosv INT

) ASBEGIN

IF @khoa=0INSERT INTO @bangthongkeSELECT khoa.makhoa,tenkhoa,COUNT(masv)

Hàm với giá trị trả về là “dữ liệu kiểubảng”

Page 99: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 99

• FROM (khoa INNER JOIN lopON khoa.makhoa=lop.makhoa)

INNER JOIN sinhvienon lop.malop=sinhvien.malopGROUP BY khoa.makhoa,tenkhoa

ELSEINSERT INTO @bangthongke

SELECT khoa.makhoa,tenkhoa,COUNT(masv) FROM (khoa INNER JOIN lopON khoa.makhoa=lop.makhoa)

INNER JOIN sinhvienON lop.malop=sinhvien.malop

WHERE khoa=@khoaGROUP BY khoa.makhoa,tenkhoa

RETURN /*Trả kết quả về cho hàm*/END

Hàm với giá trị trả về là “dữ liệukiểu bảng”

Page 100: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 100

• SELECT * FROM dbo.func_TongSV(25)Sẽ cho kết quả thống kê tổng số sinh viên khoá 25 của mỗi khoa:

• Còn câu lệnh:SELECT * FROM dbo.func_TongSV(0)Cho ta biết tổng số sinh viên hiện có (tất cả các khoá) của mỗi khoa

Hàm với giá trị trả về là “dữ liệukiểu bảng”

Page 101: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 101

Các trigger

Page 102: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 102

Sử dụng Trigger

So sánh kiểu dữ liệu. Đọc dữ liệu từ các bảng nằm trong cơ sở dữ liệu khác. Thay đổi theo tầng hoặc xoá liên tục các bảng liên quan

trong một cơ sở dữ liệu Huỷ bỏ các thay đổi không đúng Tuân theo các giới hạn,các giới hạn đó phức tạp hơn việc

bắt lỗi bằng ràng buộc CHECK Thực thi các thủ tục lưu cục bộ và các thủ tục lưu từ xa

Page 103: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 103 103

- Trigger là một kiểu thủ tục được kích họat tự độngtheo các sự kiện (events).- Có 02 lọai triggers:

+ Data Modification Language –DML (For | After triggers, Instead-of triggers)

+ DDL triggers (For | After triggers)

Khái niệm về trigger

Page 104: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 104 104

Data Definition Language (DDL) Trigger

Cú pháp:CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH [

ENCRYPTION ] | [ EXECUTE AS CALLER | SELF | 'user_login' ] { FOR | AFTER } { event_type | event_group } [ ,...n ] AS { sql_statement [ ; ] [ ...n ] }

Execute As Caller là option mặc định.Execute As User = 'user'

Cú pháp: DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER } DISABLE TRIGGER { [ schema . ] trigger_name [ ,...n ] | ALL } ON {DATABASE | ALL

SERVER } [ ; ]DDL triggers là các triggers được tự động gọi sau khi máy thực hiện các lệnh

sau:Create Table, Drop Table, Alter Procedure, Drop Schema, Create Login, …

(Xem BOL: DDL triggers, events used for firing)

Page 105: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 105 105

DML Triggers

• Cú Pháp:-Tạo CREATE TRIGGER <trigger_name> ON

<table_name>|<view_name>[With encryption|EXECUTE AS { CALLER | SELF | 'user_name' } ]{[FOR| AFTER] [insert],[update],[delete] | Instead of}

AS Transact-SQL statements - Xoá Drop Trigger <trg_name>- DISABLE TRIGGER { trigger_name [ ,...n ] | ALL } ON object_name

ON: Chỉ ra rằng Trigger đang được viết cho bảng hoặc view nào. With encryption: nội dung của trigger sẽ được mã hóa.

Page 106: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 106 106

Các dạng họat động của DML trigger

• AFTER (FOR): các câu lệnh bên trong trigger sẽ được thựchiện sau khi các sự kiện tạo nên trigger đã xảy ra rồi.

• INSTEAD OF: sẽ bỏ qua sự kiện đã kích hoạt trigger mà thayvào đó sẽ thực hiện các dòng lệnh SQL bên trong Trigger

Ví dụ: ta có một Update trigger trên một table với câuINSTEAD OF: Khi đó nếu ta thực hiện việc update dữ liệutrong bảng thì thay vì update dữ liệu, SQL Server sẽ thựchiện các lệnh đã được viết sẵn bên trong trigger.

Page 107: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 107

- Trigger Insert: Trigger được phát biểu bởi For insert. Trigger được thực hiện khi tiến hành thêm một mẫu tin vào bảng. Mẫutin cần thêm sẽ được lưu trong một bảng tạm có tên là Inserted.- Trigger Delete: Trigger được phát biểu bởi For delete. Trigger được thực hiện khi tiến hành xóa một mẫu tin trong bảng. Mẫutin bị xóa sẽ được lưu trong một bảng tạm có tên là deleted.- Trigger Update: Trigger được phát biểu bởi for update. Trigger được thực hiện khi tiến hành sửa một mẫu tin trong bảng. Mẫutin bị thay đổi sẽ được lưu trong 2 bảng tạm có tên là Inserted (chứa giá trị mới) và Deleted (chứa giá trị cũ).

Các kiểu Trigger

Page 108: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 108 108

Chú ý

- Trigger không thể được tạo ra trên bảng tạm thời hay bảng hệthống. Trigger chỉ có thể được kích hoạt một cách tự động bởi một trong các event Insert, Update, Delete mà không thể chạy manually được. Có thể áp dụng trigger cho View.

- Inserted và Deleted là 2 table tạm chỉ chứa trên bộ nhớ và chỉ cógiá trị bên trong trigger mà thôi (nghĩa là chỉ nhìn thấy đượctrong trigger mà thôi). Ta có thể dùng thông tin trong 2 table nàyđể so sánh data cũ và mới hoặc kiểm tra xem data mới.

Page 109: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 109 109

Trigger dạng INSTEAD OF – Thay thế

Dạng INSTEAD OF sẽ bỏ qua sự kiện đã kích hoạt trigger mà thay vào đó sẽ thực hiện cácdòng lệnh SQL bên trong Trigger

INSTEAD OF được chia làm 3 loại nhỏ: INSTEAD OF INSERT, INSTEAD OF UPDATE vàINSTEAD OF DELETE.

Ví dụ:create database Test1 go use Test1 gocreate table HangHoa(MaHD int, NgayHD Datetime, GhiChu ntext,MaSP NVarchar(10), Soluong int, DonGia float) gocreate Table NhapHangHoa(MaHD int, NgayHD Datetime, GhiChu ntext) gocreate Table NhapHangHoaCT(MaHD int,MaSP NVarchar(10), Soluong int, DonGia float) goCREATE TRIGGER dbo.Trig_Instead ON HangHoa instead of INSERTAS Begin

insert into NhapHangHoa select MaHD , NgayHD , GhiChu from insertedinsert into NhapHangHoaCT select MaHD ,MaSP , Soluong , DonGia from inserted

End goinsert into HangHoa values(1,getdate() , 'GhiChu ntext','MaSP', 101, 12.1)select * from hanghoaselect * from NhapHangHoaselect * from NhapHangHoaCT--Drop database Test1

Page 110: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 110 110

Trigger dạng FOR

CREATE TRIGGER Ktra_DonGia1 ON [dbo].[Products] AFTER INSERT

ASIf exists( Select * from inserted i where

i.dongiamua>i.dongiaban)Begin

RollBack tranRaisError ('Khong hop le', 16,1)

End

Page 111: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 111 111

Hàm Update() trong các trigger

CREATE TRIGGER Ktra_DonGia2 ON [dbo].[Products] FOR UPDATE ASIf Update(dongiamua) or Update(dongiaban)Begin

If exists( Select 'true' from inserted i where i.dongiamua>i.dongiaban) Begin

RollBack tranRaisError ('Khong hop le', 16,1)

EndEnd

Page 112: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 112 112

Debug triggerĐể gỡ rối một trigger chúng ta phải viết một procedure có gọi các thao tác làm

phát sinh sự kiện để thực thi trigger. Ví dụ để kiểm tra các trigger Ktra_DonGia1 và Ktra_DonGia2 chúng ta viết thủ tục sau

CREATE PROCEDURE dbo.DebugTrigger as

insert into Products(Masp, Tensp, Mota, Donvitinh, Dongiamua, Dongiaban, VAT)

Values ( 'SP-01', ‘San Pham-01 ' , '@Mota' ,'@donvi', 20,10 , 1 )

GO

Page 113: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 113

Tổng kết

Các trigger là các thủ tục lưu mà được thực hiện tự động đểtương tác với các tác vụ thêm, cập nhật và xoá trên một bảng. Các trigger thường được sử dụng để thực hiện các quy tắc

nghiệp vụ đòi hỏi.Lệnh CREATE TRIGGER được sử dụng để tạo một trigger.Các trigger truy nhập tới các bảng logic Inserted và Deleted.

Các bảng này chứa các hình ảnh của dữ liệu trước đó, và sauquá trình cập nhật.

Page 114: CƠ SỞDỮLIỆU - fit.mta.edu.vnfit.mta.edu.vn/files/DanhSach/Chuong7-LaptrinhTSQL.pdf · • Các chuỗi ký tựtrong mã lệnh chươngtrình (còn được gọi là chú

Lý thuyết CSDL 114

Tổng kết

Các kiểu trigger: INSERT: Thực hiện mỗi khi xuất hiện việc thêm mới dữ

liệu vào bảng. Các trigger này đảm bảo rằng dữ liệu đượcchèn vào bảng là hợp lệ.

UPDATE: Thực hiện khi một tác vụ cập nhật xảy ra trênmột bảng. Các trigger này có thể được thi hành ở mứcbảng hoặc mức cột.

DELETE: Thực hiện khi dữ liệu được xoá khỏi một bảng.