1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Microsoft SQL server - Bài 12: Thủ tục lưu trú, hàm và trigger

85 43 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 85
Dung lượng 6,42 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài giảng Microsoft SQL server - Bài 12: Thủ tục lưu trú, hàm và trigger được biên soạn giúp người học nắm được về thủ tục lưu trú; hàm do người dùng định nghĩa, bẫy lỗi. Mời các bạn cùng tham khảo bài giảng để nắm chi tiết hơn nội dung nghiên cứu.

Trang 1

1

Trang 2

Mục tiêu:

- Kỹ băng:

- Viết thủ tục lưu trú để giải quyết một vấn đề được đăt ra về CSDL

Bao gồm cả việc kiểm chứng dữ liệu khi cần thiết

- Viết các hàm kiểu vô hướng dựa trên một biểu thức hoặc công thức

- Viết hàm kiểu bảng để thay thế cho câu lệnh SELECT có điều kiện

WHERE

- Viết trigger để ngăn chặn lỗi CSDL gây ra bởi một truy vấn hành

động (Insert, Update, Delete)

- Viết trigger ngăn chặn các lỗi CSDL gây ra bởi một câu lệnh định

nghĩa dữ liệu (create, alter, v.v…)

Trang 3

- Mô tả hai kiểu hàm do người dùng định nghĩa

- Mô tả hai loại triggers

- Giải thích ảnh hưởng của các mệnh đề WITH ENCRYPTION và WITH

CHEMABINDING trong thủ tục, hàm và triger

- Giải thích tại sao chúng ta nên sử dụng câu lệnh ALTER hơn là xóa và tạo

lại một thủ tục, hàm hoặc trigger

2

Trang 4

- Chúng ta có thể dùng T-SQL để viết các chương trình có tính thủ tục như

scripts (tập lệnh/tệp lệnh), Store Procedures (Thủ tục lưu trú), User-defined

functions (hàm do người dùng định nghĩa) và triggers (bẫy lỗi)

- Các tệp lệnh hữu ích cho các NSD truy cập SQL Server thông qua các công

cụ của Client như Management Studio Các công cụ Client thường chỉ được

dùng bởi những người lập trình SQL và quản trị CSDL, không được dùng

bởi các chương trình ứng dụng hay NSD cuối

- Store Procedures (Thủ tục lưu trú), User-defined functions (hàm do người

dùng định nghĩa) và triggers (bẫy lỗi) là các đối tượng CSDL chứa các câu

lệnh SQL và có khả năng thực thi trên server Các đối tượng này điều khiển

và thực hiện tốt hơn tệp lệnh

- Bảng trên slide so sánh sự khác nhau của các chương trình có tính thủ tục

trong SQL

- Script: nhiều bó lệnh, được lưu trữ trên ổ đĩa, được thực hiện bởi các

công cụ phía client, không có tham biến

- Store procedure (thủ tục lưu trú): một bó lệnh, được lưu trữ như một

đối tượng trong CSDL, được thực hiện bởi một chương trình hoặc

trong một script, có tham biến

- User- defined function (hàm do người dùng định nghĩa): một bó

lệnh, được lưu trữ như một đối tượng trong CSDL, được thực hiện

3

Trang 5

bởi một chương trình hoặc trong một script, có tham biến

- Trigger: một bó lệnh, được lưu trữ như một đối tượng trong CSDL, được tự

động thực hiện bởi server khi một truy vấn hành động được thực hiện,

không có tham biến

3

Trang 6

- Thủ tục lưu trú được sử dụng bởi:

- Các lập trình viên SQL để điều khiển ai sẽ truy cập CSDL và truy

cập như thế nào

- Các lập trình viên ứng dụng để làm đơn giản hóa việc sử dụng

CSDL của họ

- Hàm do NSD định nghĩa:

- Được sử dụng thường xuyên bởi các lập trình viên SQL ở trong các

thủ tục hoặc các trigger mà họ viết

- Cũng có thể được sử dụng bởi lập trình viên ứng dụng và NSD

CSDL

- Các trigger được sử dụng bởi:

- Các lập trình viên SQL để ngăn chặn các lỗi CSDL khi một truy vấn

hành động được thực hiện

- Các lập trình viên SQL để cung cấp các view có thể cập nhật dữ

liệu

4

Trang 8

Ví dụ cách tạo và thực thi thủ tục spInvoiceReport

- Thủ tục spInvoiceReport có nhiệm vụ là thực hiện một câu lệnh Select (như

trên slide) Câu lệnh này lọc ra các hóa đơn còn nợ tiền Thông tin trong kết

quả lấy từ hai bảng Invoices và bảng Vendors Kết quả được sắp xếp theo

chiều tăng dần của VendorName

- Sau khi viết script như trên slide, chạy script để thủ tục spInvoiceReport

được tạo ra và lưu trú trong CSDL AP (xem kết quả trong mục

Programmability trong cửa sổ Object exprole) Chi tiết câu lệnh tạo thủ tục

sẽ giới thiệu trong phần tiếp theo

6

Trang 9

Để thực hiện (chạy) thủ tục chúng ta dùng câu lệnh EXEC Như trên slide, sau

khi thực hiện thủ tục spInvoiceReport chúng ta thu được kết quả là một bảng

dữ liệu các hóa đơn chưa trả hết tiền (kết quả của câu lệnh select trong thủ

tục)

Trong lần chạy đầu tiên, các câu lệnh SQL trong thủ tục sẽ được biên dịch và

thực thi để tạo một kế hoạch thực thi (execution plan) Sau đó, thủ tục sẽ được

lưu trữ dưới dạng thực thi trong CSDL và ở những lần chạy thủ tục sau thì các

câu lệnh SQL trong nó không cần phải biên dịch lại Do vậy, quá trình trình

thực thi của thủ tục lưu trú nhanh hơn quá trình thực thi của têp lệnh SQL

tương đương

Chúng ta thấy rằng, NSD hay một chương trình khi gọi thủ tục

spInvoiceReport không cần phải biết không cần biết cấu trúc của CSDL sử

dụng trong thủ tục và cũng không nhất thiết phải biết câu lệnh SQL Đây cũng

là một cách để tăng tính bảo mật cho CSDL

7

Trang 10

Cú pháp của câu lệnh tạo thủ tục CREATE PROCE:

- procedure_name: tên của thủ tục được tạo, tên đặt tùy ý theo nguyên tắc đặt

tên trong SQL server, tuy nhiên nên thêm hai kí tự „sp‟ vào phí trước tên để

phân biệt với hàm

- Parameter_declarations: khai báo tham biến (tùy chọn)

- RECOMPILE: thủ tục được biên dịch lại khi được chạy

- ENCRYPTION: thủ tục bị mã hóa không được xem bởi thủ tục sp_helptext

- EXECUTE_AS_clause:

- Sql_statements: tập hợp các câu lệnh SQL được sử dụng để giải quyết

nhiệm vụ của thủ tục

Phía bên dưới slide là ví dụ tạo thủ tục spCopyInvoices thực hiện nhiệm vụ sao

chép bảng dữ liệu Invoices vào bảng InvoiceCopy bằng câu lệnh

Select…Into…From

8

Trang 12

- Cú pháp khai báo các tham biến trong thủ tục:

- @tên_biến kiểu_dữ_liệu [= giá_trị_mặc_định] [OUTPUT], các biến

ngăn cách nhau bởi dấu cách

- Có 3 loại tham biến cho thủ tục:

- Tham biến (tham trị) bắt buộc: luôn luôn phải có trong lời gọi thủ

tục Ví dụ @DateVar smalldatetime

- Tham biến (tham trị) tùy chọn: biến được gán giá trị mặc định trong

câu lệnh khai báo biến, do đó nó có thể không cần xuất hiện trong

lời gọi thủ tục Ví dụ, VendorVar varchar(40) = NULL

- Tham biến biến: biến truyền giá trị ra ngoài thủ tục, trong khai báo

có thêm từ khóa OUTPUT Ví dụ, @InvTotal money OUTPUT

Chú ý: Nên khai báo các biến bắt buộc trước các biến không bắt buộc trong

định nghĩa thủ tục

10

Trang 13

Ví dụ tạo thủ tục spInvotal1 có một tham trị bắt buộc (@DateVar) và một tham

biến biến (@InvTotal)

Thủ tục thực hiện nhiệm vụ: Tính tổng tiền của các hóa đơn có ngày lập hóa

đơn (InvoiceDate) >= ngày của tham trị @DateVar rồi gán giá trị tổng này cho

tham biến biến @InvTotal

11

Trang 14

Ví dụ tạo thủ tục spInvTotal2 có một tham trị tùy chọn (@DateVar)

Thủ tục thực hiện nhiệm vụ: kiểm tra xem nếu tham trị @DateVar nhận giá trị

NULL thì sẽ gán lại giá trị cho tham trị này bằng giá trị của hóa đơn có ngày

lập nhỏ nhất Sau đó mới thực hiện lệnh Select đư ra tổng tiền của tất cả các

hóa đơn có ngày lập hóa đơn (InvoiceDate) lớn hơn giá trị biến @DateVar

12

Trang 15

Ví dụ định nghĩa thủ tục spInvTotal3 có 3 tham biến: 1 tham biến biến và 2

tham biến tùy chọn

Thủ tục thực hiện nhiệm vụ:

- Kiểm trs biến @DateVar nhận giá trị Null thì gán lại giá trị mới như trong

thủ tục spInvTotal2

- Gán giá trị cho tham biến biến @InvTotal bằng tổng tiền các hóa đơn có

ngày lập >= giá trị biến @DateVar và có VendorName LIKE @VendorVar

13

Trang 16

Ví dụ các lời gọi thực hiện thủ tục khác nhau của thủ tục spInvTotal3:

EXEC spInvTotal3 @MyInvTotal OUTPUT, '2012-02-01', 'P%';  lời gọi có

đủ 3 biến

EXEC spInvTotal3 @DateVar = '2012-02-01',

@VendorVar = 'P%', @InvTotal = @MyInvTotal OUTPUT;

 lời gọi tường minh gán từng giá trị cho từng biến (không cần quan tâm đến

thứ tự các biến trong khai báo thủ tục)

EXEC spInvTotal3 @VendorVar = 'M%',

@InvTotal = @MyInvTotal OUTPUT;

 Lời gọi chỉ truyền giá trị cho biến tham trị tùy chọn và tham biến biến

EXEC spInvTotal3 @MyInvTotal OUTPUT;

 Lời gọi chỉ truyền giá trị cho tham biến biến

14

Trang 18

- Thủ tục cũng có thể trả ra một giá trị kiểu số nguyên Khi đó trong

định nghĩa thủ tục có câu lệnh RETURN

- Ví dụ tạo thủ tục spInvCount:

- Thủ tục có hai tham trị tùy chọn

- Nhiệm vụ của thủ tục: đếm số hóa đơn có InvoiceDate >=

@DateVar và VendorName LIKE @VendorVar rồi gán tổng số hóa

đơn này cho biến @InvCount Sau đó, thủ tục thủ tục sẽ trả ra giá trị

của biến @InvCount bằng câu lệnh Return (câu lệnh được tô vàng)

17

Trang 19

- Thủ tục cũng có thể trả ra một giá trị kiểu số nguyên Khi đó trong

định nghĩa thủ tục có câu lệnh RETURN

- Ví dụ tạo thủ tục spInvCount:

- Thủ tục có hai tham trị tùy chọn

- Nhiệm vụ của thủ tục: đếm số hóa đơn có InvoiceDate >=

@DateVar và VendorName LIKE @VendorVar rồi gán tổng số hóa

đơn này cho biến @InvCount Sau đó, thủ tục thủ tục sẽ trả ra giá trị

của biến @InvCount bằng câu lệnh Return (câu lệnh được tô vàng)

18

Trang 20

Trên slide là ví dụ cách thực hiện thủ tục spInvCount ở slide trước Giá trị trả

ra của thủ tục được gán cho một biến @InvCount khai báo trước đó

19

Trang 22

- Ví dụ tạo thủ tục spInsertInvoice kiểm tra giá trị của một khóa ngoài

- Thủ tục có 6 tham trị bắt buộc (tương ứng các cột trong bảng

Invoices

- Nhiệm vụ của thủ tục: kiểm tra xem đã có giá trị VendorID nào

trong bảng Vendor có trùng với giá trị của tham biến @VendorID

không (Kiểm tra giá trị khóa ngoài VendorID định chèn vào bảng

Invoices đã tồn tại bên cột VendorID ở bảng Vendor chưa) Nếu tồn

lại rồi thì cho phép chèn thêm bản ghi mới vào bảng Invoices (câu

lệnh Insert) Nếu không (else), đưa ra thông báo lỗi “Not a valid

VendorID!” bằng câu lệnh THROW

21

Trang 23

Ví dụ một script có lời gọi thủ tục spInsertInvoice Đầu tiên, câu lệnh thực

hiện thủ tục spInsertInvoice trong khối TRY sẽ được thực hiện trước Nếu thủ

tục không có lỗi thì khối CATH được bỏ qua, nếu thủ tục có lỗi thì các câu

lệnh trong khối CATCH được thực hiện để in thông báo lỗi được định nghĩa

trong thủ tục bằng câu lệnh THROW

Kết quả hiện ra trong trường hợp này là thủ tục chạy bị lỗi vì có mã VendorID

=799 của bản ghi muốn thêm vào bảng Invoices (bảng khóa ngoài) chưa tồn tại

trong cột VendorID ở bảng Vendor (bảng khóa chính) Do đó các lệnh trong

khối CATCH được thực hiện để in thông báo lỗi

22

Trang 24

Chú ý: câu lệnh THROW trong khối lệnh BEGIN…END phải có ; ở phía

trước

23

Trang 25

Từ slide 21 đến 24 là ví dụ định nghĩa thủ tục spInsertInvoice Thủ tục này mở

rộng của ví dụ trong slide trước

24

Trang 29

Ví dụ script chạy thủ tục spInsertInvoice trong slide 21-24

28

Trang 30

Kết quả sau khi chạy script

29

Trang 32

- Cú pháp định nghĩa kiểu dưc liệu Table(bảng dữ liệu)

- Ví dụ tạo một kiểu dữ liệu bảng LineItems Mỗi biến thuộc kiểu dữ liệu này

là một bảng có năm cột và cột InvoiceID và InvoiceSequence là khóa chính

cho bảng

31

Trang 33

Ví dụ khai báo tham biến @LineItems có kiểu dữ liệu bảng LineItems định

nghĩa ở slide trước

32

Trang 34

Ví dụ thực hiện thủ tục spInsertLineItems

33

Trang 35

- Dùng câu lệnh DROP PROC để xóa một thủ tục lưu trú khỏi CSDL

- Dùng lệnh ALTER PROC để sửa định nghĩa một thủ tục

- Chú ý: khi một thủ tục bị xóa, tất cả các quyền bảo mật được gán cho thủ

tục cũng bị xóa theo

34

Trang 36

Silde 21 và 22 là ví dụ định nghĩa thủ tục spVendorState sau đó dùng câu lệnh

Alter proc để sửa thủ tục và câu lệnh Drop proc để xóa thủ tục

35

Trang 38

Một số thủ tục đĩnh nghĩa sẵn trong hệ thống SQL Server 2012

37

Trang 39

Ví dụ dùng thủ tục sp_HelpText để xem định nghĩa thủ tục spInvoiceReport

38

Trang 41

Hàm do NSD định nghĩa bao gồm 3 kiểu:

- Scalar-valued function type: hàm trả ra giá trị vô hướng (int, float, char,

v.v…)

- Simple table-valued function: hàm trả ra giá trị là một bảng dựa trên một câu

truy vấn Select

- Multi-statement table-valued function: hàm trả ra giá trị là một bảng dựa trên

nhiều câu truy vấn

40

Trang 42

- Trên cùng slide là ví dụ tạo hàm fnVendorID có giá trị trả ra thuộc kiểu vô

hướng (int) Nhiệm vụ của hàm này là trả ra giá trị của VendorID (kiểu int)

của vendor có VendorName = @VendorName

- Ở giữa là ví dụ lời gọi thực hiện hàm fnVendorID Giá trị trả ra của hàm

fnVendorID là VendorID của vendor có tên là „IBM‟ và giá trị VendorID

này được sử dụng làm điều kiện lọc cho câu lệnh SELECT

- Ở dưới cùng slide là ví dụ khác thực hiện lời gọi hàm fnTopVendorsDue

giống như một bảng nguồn dữ liệu cho truy vấn vì hàm này trả ra giá trị là

một bảng dữ liệu

Chú ý: các lời gọi thực hiện hàm đều phải có thêm tên lược đồ quản lý nó

(dbo) ở phía trước

41

Trang 43

Trên slide là cú pháp tạo một hàm trả ra giá trị kiểu vô hướng Kiểu hàm này

cũng có các tham biến trị bắt buộc và trùy chọn

- RETURNS data_type là định nghĩa kiểu dữ liệu vô hướng mà hàm sẽ trả ra

- RETURN scalar_expression là lệnh trả giá trị trong định nghĩa hàm thuộc

kiểu vô hướng đã được xác định ở câu lệnh RETURNS phía trên

42

Trang 44

- Phía trên slide là ví dụ tạo hàm fnBalancedue() có kiểu dữ liệu trả ra là

money Hàm này trả ra tổng tiền của các hóa đơn chưa thanh toán hết (còn

nợ tiền)

- Bên dưới là ví dụ cách gọi thực hiện hàm fnBalanceDue() và kết quả

43

Trang 46

- Phía trên slide là cú pháp tạo hàm trả ra giá trị kiểu bảng đơn giản Sau câu

lệnh RETURN thứ hai là một câu lệnh SELECT

- Phía bên dưới slide là một ví dụ tạo hàm fnTopVendorsDue() trả ra giá trị

bảng đơn giản Hàm này có nhiệm vụ trả ra một bảng gồm có hai cột

VendorName và ToTalDue (tổng tiền nợ) của các vendor có tổng tiền nợ các

hóa đơn lớn hơn giá trị của biến @CutOff

45

Trang 47

- Trên slide là ví dụ lời gọi thực hiện hàm fnTopVendorsDue với giá trị của

tham biến trị @CutOff= 50000 và kết quả

46

Trang 48

Vì hàm fnTopVendorsDue() trả ra một bảng dữ liệu nêm có có thể xuất hiện

trong mệnh đề FROM và liên kết với bảng dữ liệu khác (bảng Vendors)

47

Trang 50

- Trên slide là cú pháp câu lệnh tạo hàm trả ra bảng dữ liệu dựa trên nhiều

Trang 51

Ví dụ tạo hàm fnCreditAdj():

- Biến @OutTable là một biến bảng bao gồm bảy cột (như trên phần khai

báo) Biến bảng này sẽ được cập nhật dữ liệu trong khối BEGIN…END

- Trong khôi BEGIN…END: câu lệnh INSERT đầu tiên là thêm vào bảng

@OutTable các hóa đơn còn nợ tiền Các hóa đơn này là kết quả của câu

lệnh SELECT Sau đó, câu lệnh lặp WHILE cập nhật giá trị cột CreditTotal

lên 1% chừng nào tổng tiền nợ của các hóa đơn >=@HowMuch Kết thúc là

câu lệnh RETURN

50

Trang 52

Ví dụ thực hiện hàm fnCreditAdj() trong một câu lệnh SELECT với giá trị

biến @HowMuch = 25000

51

Trang 54

- Dùng câu lệnh DROP FUNCTION để xóa hàm ra khỏi CSDL

- Chú ý: khi xóa một hàm, tất cả các quyền bảo mật gán cho hàm + tất cả các

phụ thuộc giữa hàm và các bảng dữ liệu và các view mà nó sử dụng cũng bị

xóa theo

53

Trang 55

- Để sửa hàm dùng câu lệnh ALTER FUNCTION có cú pháp như trên slide để

sửa hàm trả ra giá trị kiểu vô hướng

54

Trang 56

- Để sửa hàm dùng câu lệnh ALTER FUNCTION có cú pháp như trên slide để

sửa hàm trả ra giá trị kiểu bảng đơn giản

55

Trang 57

- Để sửa hàm dùng câu lệnh ALTER FUNCTION có cú pháp như trên slide để

sửa hàm trả ra giá trị kiểu bảng dựa trên nhiều câu lệnh

56

Trang 63

- Ví dụ tạo DML trigger Vendor_INSERT_UPDATE trên bảng Vendors

Trigger này được thực hiện tự động khi có các câu lệnh INSERT hoặc

UPDATE xảy ra trên bảng Vendors Nhiệm vụ của trigger

Vendor_INSERT_UPDATE là cập nhật trường VendorState thành chữ hoa

của bản ghi vừa mới được chèn thêm hoặc cập nhật

- Phía dưới là câu lệnh ví dụ chèn một dòng mới vào bảng Vendors có trường

VendorState = „Oh‟ (không in hoa) Nhưng khi thực hiện câu lệnh:

SELECT * FROM Vendors WHERE VendorName = 'Peerless Uniforms, Inc.„

thì nhìn thấy ở kết quả giá trị „Oh‟ ở cột VendorState đã được chuyển thành

chữ hoa „OH‟ Đó là kết quả của trigger Vendor_Insert_Update tự động thực

hiện bởi hệ thống khi có câu lệnh Insert được thực hiện trên bảng Vendors

62

Trang 64

- Trên slide là cú pháp câu lệnh tạo DML trigger

CREATE TRIGGER trigger_name

 đặt tên cho trigger

ON {table_name|view_name}

 Tên bảng hoặc tên view mà trigger gắn với nó

[WITH [ENCRYPTION] [,] [EXECUTE_AS_clause]]

 ENCRYPTION: dùng khi không muốn cho NSD đọc định nghĩa trigger (câu

lệnh tạo trigger)

 EXECUTE_AS_clause: thực hiện trigger trong một ngữ cảnh bảo mật cụ

thể

{FOR|AFTER|INSTEAD OF}  Kiểu trigger

[INSERT] [,] [UPDATE] [,] [DELETE]  xác định những hành động

(Insert, Update , Delete) nào trên bảng hoặc view xảy ra thì trigger sẽ tự kích

hoạt thực hiện

AS sql_statements  các câu lệnh Sql định nghĩa trigger

63

Ngày đăng: 09/05/2021, 04:05

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w