Tải bản đầy đủ (.ppt) (78 trang)

SQL Server _04

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (622.25 KB, 78 trang )

Chương IV: Thủ tục
lưu trữ, hàm, trigger
Ths. Nguyễn Hồng Hạnh
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.1 Khái niệm thủ tục lưu trữ
Các thủ tục lưu trữ là một trong những đối tượng cơ sở dữ liệu. Có thể
xem chúng tương tự như những thủ tục trong các ngôn ngữ lập trình. Mỗi
một thủ tục lưu trữ có thể có các khả năng sau:

Nhận các tham số đầu vào, thực thi các câu lệnh bên trong thủ tục và trả
về các giá trị.

Bên trong mỗi thủ tục có thể chứa các câu lệnh nhằm thực hiện các thao
tác trên cơ sở dữ liệu (kể cả việc gọi đến các thủ tục lưu trữ khác)

Trả về một giá trị trạng thái thông qua đó có thể xác định việc thực thi thủ
tục là thành công hay bị lỗi.
Khi một thủ tục lưu trữ đã được định nghĩa, nó có thể được gọi thông
qua tên thủ tục, nhận các tham số truyền vào, thực thi các câu
lệnh SQL bên trong thủ tục và có thể trả về các giá trị sau khi thực hiện
xong.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.1 Khái niệm thủ tục lưu trữ
Lợi ích của Stored Procedure

Người lập trình và quản lý CSDL sẽ viết các thủ tục lưu trữ để thực
thi nhiều công việc khác nhau có liên quan đến quá trình truy xuất và
quản lý dữ liệu.


Sử dụng stored procedures đưa đến rất nhiều lợi ích thông qua
việc sử dụng các câu lệnh Transact-SQL. Như là:

Tăng khả năng bảo mật với hệ thống

Sử dụng lại kết quả biên dịch

Giảm thiểu sự lưu thông trên mạng

Module hóa công việc
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
Lợi ích của Stored Procedure

Tăng khả năng bảo mật với hệ thống:Thay vì cấp phát quyền
trực tiếp cho người sử dụng trên các câu lệnh SQL và trên các đối
tượng cơ sở dữ liệu, ta có thể cấp phát quyền cho người sử dụng
thông qua các thủ tục lưu trữ, nhờ đó tăng khả năng bảo mật đối
với hệ thống.

Sử dụng lại kết quả biên dịch: SQL Server chỉ biên dịch các thủ
tục lưu trữ một lần và sử dụng lại kết quả biên dịch này trong các
lần tiếp theo trừ khi người dùng có những thiết lập khác.
Việc sử dụng lại kết quả biên dịch không làm ảnh hưởng đến
hiệu suất hệ thống khi thủ tục lưu trữ được gọi liên tục nhiều
lần.

Giảm thiểu sự lưu thông trên mạng:.Thủ tục lưu trữ cho phép
thực hiện cùng một yêu cầu bằng một câu lệnh đơn giản thay
vì phải sử dụng nhiều dòng lệnh SQL. Điều này sẽ làm giảm thiểu

sự lưu thông trên mạng.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.1 Khái niệm thủ tục lưu trữ
Các thủ tục lưu trữ trả về kết quả theo 4 cách:

Sử dụng các tham số output

Sử dụng các lệnh trả về giá trị, các lệnh này luôn trả về giá trị số nguyên.

Tập các giá trị trả về của mỗi câu lệnh SELECT có trong thủ tục
lưu trữ hoặc của quá trình gọi một thủ tục lưu trữ khác trong một thủ tục
lưu trữ.

Một biến con trỏ toàn cục có thể tham chiếu từ bên ngoài thủ tục.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.2 Tạo thủ tục lưu trữ
Cú pháp:
CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)
(kiểu_dữ_liệu)]
[WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION]
AS
Các_câu_lệnh_của_thủ_tục
Trong đó:
Danh sách tham số: biến truyền vào cho thủ tục “@biến” để thực thi
Kiểu dữ liệu: Quy định kiểu dữ liệu cho biến
WITH RECOMPILE: yêu cầu SQL Server biên dịch lại thủ tục lưu trữ mỗi
khi được gọi.
WITH ENCRYPTION: yêu cầu SQL Server mã hóa thủ tục lưu trữ.

Các_câu_lệnh_của_thủ_tục: Các lệnh T-SQL. Các lệnh này có thể
nằm trong cặp BEGIN…END hoặc không.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.2 Tạo thủ tục lưu trữ

dụ
Thủ tục lưu trữ Thực thi thủ tục
01
CREATE PROCEDURE Show_Products
AS
SELECT * FROM Product
EXECUTE Show_Products
02
CREATE PROC sp_List @bten nchar(20)
AS
SELECT sid, sname, city
FROM Supplier
WHERE sname= @bten
EXEC sp_List ‘Lubber’
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.3 Lời gọi thủ tục lưu trữ
Thủ tục lưu trữ được gọi theo cấu trúc
Tên_thủ_tục_lưu _trữ [danh_sách_tham_số]
Lưu ý: danh sách tham số truyền vào trong lời gọi phải theo đúng thứ tự
khai báo các tham số trong thủ tục lưu trữ.
Nếu thủ tục được gọi từ một thủ tục khác, thực hiện bên trong một trigger
hay phối hợp với câu lệnh SELECT, cấu trúc như sau;
Exec Tên_thủ_tục_lưu _trữ [danh_sách_tham_số]

Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.4 Biến trong thủ tục lưu trữ
Trong thủ tục lưu trữ có thể có các biến nhằm lưu các kết quả tính toán hay
truy xuất từ CSDL. Các biến trong thủ tục được khai báo bằng từ khóa
DECLARE theo cấu trúc như sau:
DECLARE @tên_biến kiểu_dữ_liệu
Ví dụ:
create procedure sp_TimKHLonTuoiNhat
as
begin
declare @maxAge int
select @maxAge = max(year(getdate())-year(BIRTHDAY))
from customers
select CUSTOMERNAME, BIRTHDAY
from customers
where year(getdate())-year(BIRTHDAY)=@maxAge
end
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.5 Giá trị trả về trong thủ tục lưu trữ
Có 3 trường hợp trả về giá trị khi thực thi thủ tục lưu trữ:

Nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là “biến”
thì những thay đổi giá trị của biến trong thủ tục sẽ không được giữ lại khi
kết thúc quá trình thực hiện thủ tục. Ví dụ:
Tạo thủ tục lưu trữ Thực thi thủ tục
create procedure sp_TestOutput
@a int,
@b int,

@c int
as
select @c = @a + @b
Declare @tong int
set @tong = 0
exec sp_TestOutput 100, 200, @tong
select @tong as [gia tri tra ve]
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.5 Giá trị trả về trong thủ tục lưu trữ
Có 3 trường hợp trả về giá trị khi thực thi thủ tục lưu trữ:

Sử dụng tham số OUTPUT trong trường hợp cần phải giữ lại giá trị của
đối số sau khi kết thúc thủ tục. Phải khai báo tham số của thủ tục theo cú
pháp như sau:
@tên_tham_số kiểu_dữ_liệu OUTPUT
Tạo thủ tục lưu trữ Thực thi thủ tục
create procedure
sp_TestOutput
@a int,
@b int,
@tong int output
as
select @tong = @a + @b
Declare @tong int
set @tong = 0
exec sp_TestOutput 100, 200, @tong output
select @tong as [gia tri tra ve]
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)

4.1.5 Giá trị trả về trong thủ tục lưu trữ

Lưu ý khi sử dụng tham số OUTPUT
Nếu chúng ta chỉ định OUTPUT khi thực hiện một thủ tục nhưng tham số
tương ứng không được định nghĩa với OUTPUT thì khi tạo thủ tục thì sẽ bị
lỗi. Tuy nhiên, nếu ta định nghĩa OUTPUT cho một tham số trong thủ tục
nhưng không chỉ định OUTPUT khi thực hiện thì vẫn không bị lỗi (giá trị
tham số khi đó sẽ không được trả về).
Tạo thủ tục lưu trữ Thực thi thủ tục
create proc Chia @sobichia real,@sochia real,
@kqua real OUTPUT
as
if (@sochia =0)
print ‘Division by zero’
else
select @kqua = @sobichia / @sochia
1. declare @ketqua real
exec Chia 100, 2, @ketqua

OUTPUT
select @ketqua - - trả về 50
2. declare @ketqua real
exec Chia 100, 2, @ketqua
select @ketqua - - trả về null
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.5 Giá trị trả về trong thủ tục lưu trữ
Có 3 trường hợp trả về giá trị khi thực thi thủ tục lưu trữ:

Sử dụng lệnh RETURN

Tương nhự như việc sử dụng tham số OUTPUT, câu lệnh RETURN trả về
giá trị cho đối tượng thực thi stored procedure.
Tạo thủ tục lưu trữ Thực thi thủ tục
create procedure sp_TestReturn
as
begin
declare @out int
select @out = count(*)
from Supplier
return @out
End
declare @a int
exec @a = sp_TestReturn
select @a as [so luong nha cung cap]
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.6 Tham số với giá trị mặc định
Các tham số được khai báo trong thủ tục có thể nhận các giá trị
mặc định. Giá trị này, có thể là hằng bất kỳ, sẽ được lấy làm tham số của
thủ tục khi người sử dụng không cung cấp giá trị cho tham số khi gọi thủ
tục.Tham số với giá trị mặc định được khai báo theo cú pháp sau:
@tên_tham_số <kiểu_dữ_liệu> = giá_trị_mặc_định
Tạo thủ tục lưu trữ Thực thi thủ tục
create procedure sp_TestDefault
@size int = 70
as
begin
select * from Supplier
where size = @size
end

1. TH không truyền tham số cho thủ tục:
exec sp_TestDefault
2. TH truyền tham số cho thủ tục:
exec sp_TestDefault 80
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.6 Tham số với giá trị mặc định
Lưu ý:

Giá trị mặc định có thể NULL. Trong trường hợp này, nếu người sử dụng
không cung cấp tham số, SQL Server sẽ thi hành thủ tục theo các tham số
khác

Giá trị mặc định có thể bao gồm các ký tự đại diện (%, _, [ ], [^] ) nếu thủ
tục sử dụng tham số với từ khóa LIKE.
Tạo thủ tục lưu trữ Thực thi thủ tục
create procedure sp_TestDefault1
@sname nchar(20) = ‘Rusty’
as
begin
select * from Supplier
where sname = @sname
end
1. exec sp_TestDefault1
2. exec sp_TestDefault1 ‘Pitts’
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.6 Tham số với giá trị mặc định
Tạo thủ tục lưu trữ Thực thi thủ tục
CREATE PROC sp_list3 @bten

nchar(20)=NULL,@bdiachi nchar(30)
AS
SELECT *
FROM Supplier
WHERE sname=@bten AND
city=@bdiachi
exec sp_list3 @bdiachi = ‘London’
(câu lệnh này vẫn thực thi được mà
không báo lỗi dù tham số @bten
không được truyền giá trị)
CREATE PROC sp_list4
@bten nchar(20) =’P%’
AS
SELECT * FROM Supplier
WHERE sname LIKE @bten
exec sp_list4
(Thực thi câu lệnh với giá trị truyền
vào mặc định cho tham số @bten là
chuỗi bắt đầu bằng chữ P)
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.7 Sửa đổi thủ tục lưu trữ
Khi một thủ tục được tạo ra, có thể định nghĩa lại thủ tục bằng câu lệnh
ALTER, cú pháp như sau:
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
4.1.8 Xóa thủ tục lưu trữ
DROP PROCEDURE tên_thủ_tục

Khi xoá một thủ tục, tất cả các quyền đã cấp cho người sử dụng trên thủ
tục đó cũng đồng thời bị xoá bỏ.
Do đó, nếu tạo lại thủ tục, phải tiến hành cấp phát lại các quyền trên thủ
tục.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.9 Đổi tên thủ tục lưu trữ
Chỉ có thể đổi tên những thủ tục mà ta sở hữu. Người sở hữu CSDL có thể
thay đổi tên bất kỳ thủ tục nào của người sử dụng. Thủ tục được đổi tên
phải nằm trong CSDL hiện thời. Sử dụng thủ tục của hệ thống để đổi tên:
sp_rename tên_cũ, tên_mới
Lưu ý:

Nếu ta thay đổi tên của một đối tượng được tham chiếu bởi một thủ tục thì
phải xoá và tạo lại thủ tục đó.

Để có được báo cáo về những đối tượng được tham chiếu bởi một thủ
tục, ta sử dụng thủ tục hệ thống: sp_depends.

Để xem nội dung của định nghĩa một thủ tục, ta sử dụng thủ tục hệ thống:
sp_helptext.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
Một số ví dụ viết thủ tục lưu trữ
1.Tạo thủ tục hiển thị thông tin nhà cung cấp với mã nhà cung cấp được
truyền vào theo lời gọi của thủ tục. Trường hợp không truyền tham số cho
thủ tục thì sẽ trả về câu thông báo “ Mời nhập vào mã nhà cung cấp”.
create procedure sp_display_supplier_1 @mancc nvarchar(40)=NULL
as
begin

if @mancc is null
begin
print 'Moi nhap vao ma nha cung cap'
return
end
else
begin
select * from Supplier where SID = @mancc
end
end
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
Một số ví dụ viết thủ tục lưu trữ
2.Tạo thủ tục hiển thị số lượng lớn nhất của các mặt hàng đã được cung
ứng bởi các nhà cung cấp.
CREATE PROCEDURE Display_Suppliers_Quantity
@max_quantity int OUTPUT
AS
SELECT @max_quantity = MAX(Quantity) FROM SupplyProduct
Thực thi thủ tục
DECLARE @max_quantity int;
EXECUTE Display_Suppliers_Quantity @max_quantity OUTPUT;
PRINT @max_quantity;
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.1. Thủ tục lưu trữ (Stored Procedure)
4.1.10 Một số lưu ý sử dụng thủ tục lưu trữ

Câu lệnh CREATE PROCEDURE không thể kết hợp với các câu lệnh
SQL khác trong một khối lệnh đơn (single batch).


Định nghĩa CREATE PROCEDURE ngoại trừ những câu lệnh sau:
CREATE VIEW CREATE TRIGGER
CREATE DEFAULT CREATE PROCEDURE

Bên trong một thủ tục, ta không thể tạo một đối tượng, xoá nó và sau đó
tạo một đối tượng mới với cùng tên.

Ta có thể tham chiếu các bảng tạm thời bên trong một thủ tục.

Nếu ta tạo một bảng tạm thời riêng (private temporary table) bên trong
một thủ tục, bảng tạm thời chỉ tồn tại cho những mục đích của thủ tục đó;
nó sẽ mất đi khi thoát ra khỏi thủ tục.

Số tham số tối đa của một thủ tục là 255
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.2. Trigger (bẫy lỗi) – Các khái niệm cơ bản
4.2.1 Định nghĩa Trigger
Trigger là một dạng đặc biệt của thủ tục lưu trữ, được thực thi một cách tự
động khi có sự thay đổi dữ liệu (do tác động của câu lệnh INSERT,
UPDATE, DELETE – “sự kiện” ) trên một bảng nào đó.
Nói cách khác ,bất cứ khi nào các lệnh INSERT, DELETE, hay UPDATE
được sử dụng trên một đối tượng thì bẫy lỗi tương ứng với câu lệnh đó sẽ
được thực thi.
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.2. Trigger (bẫy lỗi) – Các khái niệm cơ bản
4.2.2 Đặc điểm của Trigger

Trigger thực thi tự động thông qua các sự kiện, chứ không thực hiện trực
tiếp.


Trigger sử dụng được với khung nhìn.

Khi Trigger thực thi theo các sự kiện Insert hoặc Delete thì dữ
liệu khi thay đổi sẽ được chuyển sang các bảng INSERTED và
DELETED (2 bảng tạm thời chỉ chứa trong bộ nhớ, các bảng này chỉ
được sử dụng với các lệnh trong trigger. Các bảng này thường được sử
dụng để khôi phục lại phần dữ liệu đã thay đổi (roll back)).

Trigger chia thành 2 loại INSTEAD OF và AFTER:
¨
INSTEAD OF trigger là loại mà hoạt động của sự kiện gọi
trigger sẽ bị bỏ qua và thay vào đó là các lệnh bên trong
trigger được thực hiện.
¨
AFTER trigger là loại ngầm định, loại trigger này sẽ thực hiện các
lệnh bên trong trigger sau khi đã thực hiện xong sự kiện kích hoạt
trigger
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.2. Trigger (bẫy lỗi) – Các khái niệm cơ bản
4.2.3 Các trường hợp sử dụng Trigger

Khi CSDL chưa được chuẩn hóa (Normalization) thì có thể xảy ra
dữ liệu thừa, chứa ở nhiều vị trí trong CSDL , khi cập nhật dữ liệu
thì việc cập nhật thống nhất trong mọi nơi.

Khi xảy ra thay đổi dây chuyền dữ liệu giữa các bảng với nhau (khi dữ
liệu bảng này thay đổi thì dữ liệu trong bảng khác cũng được thay đổi
theo).

Sử dụng Trigger khi các biện pháp bảo đảm toàn vẹn dữ liệu khác không

bảo đảm được. Các công cụ này sẽ thực hiện kiểm tra tính toán
vẹn trước khi đưa dữ liệu vào CSDL, còn Trigger thực hiện kiểm tra
tính toàn vẹn khi công việc đã thực hiện
Chương IV: Thủ tục lưu trữ, hàm, trigger
4.2. Trigger (bẫy lỗi) – Các khái niệm cơ bản
4.2.4. Khả năng của Trigger

Một trigger có thể nhận biết, ngăn chặn và huỷ bỏ được những thao tác
làm thay đổi trái phép dữ liệu trong cơ sở dữ liệu.

Các thao tác trên dữ liệu (xoá, cập nhật và bổ sung) có thể được trigger
phát hiện ra và tự động thực hiện một loạt các thao tác khác trên cơ sở dữ
liệu nhằm đảm bảo tính hợp lệ của dữ liệu.

Thông qua trigger, ta có thể tạo và kiểm tra được những mối quan hệ
phức tạp hơn giữa các bảng trong cơ sở dữ liệu mà bản thân các ràng
buộc không thể thực hiện được.
4.2.5 Các loại Trigger

Data Manipulation Language (DML) Triggers

Thực thi khi dữ liệu được thêm, sủa hoặc xóa trên bảng hay trên
khung nhìn, sử dụng các câu lệnh INSERT, UPDATE, DELETE.

Data Definition Language (DDL) Triggers

Thực thi khi bảng hoặc khung nhìn được tạo ra, sửa đổi hoặc xóa.
Sử dụng nhóm câu lệnh CREATE, ALTER or DROP statements.

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×