csdl3_btl_trigger

1.Giới thiệu chung về thủ tục thường trú (Store Procedure)

 1.1. Khái niệm thủ tục thường trú:

- Thủ tục thường trú là 1 đối tượng trong cơ sở dữ liệu (CSDL), bao gồm nhiều câu lệnh T-SQL được tập hợp lại với nhau thành 1 nhóm, và tất cả các lệnh này sẽ được thực thi chương trình được thực thi. Một thủ tục có thể nhận các tham số truyền vào cũng như có thể trả về các giá trị thông qua các tham số (như trong ngôn ngữ lập trình). Khi 1 thủ tục thường 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.

- Các thành phần có thể có của thủ tục thường trú:

   + Các câu lệnh điều khiển như IF…ELSE, FOR, WHILE…

   + Các biến để lưu trữ các giá trị tính toán được, lưu trữ các giá trị được truy xuất từ CSDL.

   + Các tham số nhận giá trị truyền giá trị vào

- Các đặc điểm cơ bản của thủ tục thường trú:

  + Truyền tham số

  + Gọi thủ tục khác

  + Truyền về các giá trị tham số, chuyển giá trị tham số cho các thủ tục được gọi

  +Trả về giá trị trạng thái thủ tục là thành công hay không thành công

  1.2. Các loại thủ tục thường trú

   Thủ tục thường trú có thể được chia thành 5 nhóm như sau:

   1.2.1. Thủ tục thường trú của hệ thống (System Stored Procedure):

Là những thủ tục thường trú chứa trong CSDL Master và thường bắt đầu bằng sys.sp_. Các thủ tục này thường được sử dụng trong quản trị CSDL và an ninh bảo mật. Chúng ta có thể xem các thử tục thường trú hệ thống bằng cách vào System Database -> Master -> Programmability -> System Store Procedure

Ví dụ 1.1:

              sp_configure: Muốn biết cấu hình của SQL Server đang dùng.

              sp_tables: Cung cấp thông tin về bảng.

              sp_password: Cho phép thay đổi password của 1 user.

              sp_helptext: Hiển thị nội dung của View và thủ tục thường trú.

              sp_helpdb: Hiển thị nội dung của CSDL.

              sp_dropuser: Xóa 1 user.

              sp_adduser: Thêm 1 user vào CSDL.

              sp_addlogin: Tạo mới 1 user.

   Muốn biết tất cả tiến trình đang được thực hiện bởi user nào thì dùng thủ tục: sp_who @loginame=’sa’

Kết quả:

   1.2.2. Thủ tục thường trú người dùng tự định nghĩa ( Local Stored Procedure) :

Đây là loại thường sử dụng nhất. Chúng được chứa trong CSDL do người dùng tạo ra. Thủ tục loại này hường được tạo bởi DBA( Database Aministrator) hoặc người lập trình.

   1.2.3. Thủ tục thường trú tạm thời ( Temporary Stored Procedure)

Là những thủ tục tương tự như thủ tục thường trú người dùng tự định nghĩa nhưng do được tạo ra trên TempDB của SQL Server nên sẽ bị xóa khi kết nối đã tạo ra chúng bị đóng lại hoặc SQL Server Shutdown.

   1.2.4. Thủ tục thường trú mở rộng ( Extended Stored Procedure):

Đây là 1 loại thủ tục thường trú sử dụng 1 chương trình ngoại vi (extended program) vốn được biên dịch thành 1 DLL để mở rộng chức năng hoạt động của SQL Server. Loại này thường được bắt đầu bằng xp_. Ví dụ xp_sendmail dùng để gửi mail cho 1 người nào đó hay xp_cmdshell dùng để chạy 1 lệnh DOS. Nhiều loại thủ tục thường trú mở rộng được xem như thủ tục thường trú hệ thống và ngược lại.

   1.2.5. Thủ tục thường trú truy cập từ xa (Remote Stored Procedure) :

Những thủ tục thường trú gọi thủ tục thường trú ở server khác

Trong phạm vi của bài tập, chúng ta sẽ tập trung nghiên cứu về thủ tục thường trú người dùng tự định nghĩa.

  1.3. Lợi ích của việc sử dụng thủ tục thường trú

  - Đảm bảo hiệu suất làm việc của hệ thống khi thủ tục thường trú được gọi liên tục nhiều lần: vì SQLServerchỉbiêndịchcácthủtụcthườngtrúmộtlầnvàsửdụnglạikếtquảbiêndịchnàytrongcáclầntiếptheotrừkhingườidùngcónhữngthiếtlậpkhác.

  - Thực thi nhanh hơn: vì thủtụcthườngtrúđượcphântích,tốiưukhitạoranênviệcthựcthichúngnhanhhơnnhiềusovớiviệcphảithựchiệnmộttậprờirạccáccâulệnhSQLtươngđương theocáchthôngthường.

              - Giảm thiểu sự lưu thông trên mạng: vì thủtụcthườngtrúchophépchúngtathựchiệncùngmộtyêucầubằngmộtcâulệnhđơngiảnthayvìphảisửdụngnhiềudònglệnhSQL.

               - Tăng khả năng bảo mật đối với hệ thống: thayvìcấpphátquyềntrựctiếpchongườisửdụngtrêncáccâulệnhSQLvàtrêncácđốitượngcơsởdữliệu,tacóthểcấpphátquyềnchongườisửdụngthôngqua cácthủtụcthườngtrú.

  1.4 Cách trả về kết quả của thủ tục thường trú:

  Các thủ tục thường 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 thường trú hoặc của quá trình gọi 1 thủ tục thường trú khác trong một thủ tục thường trú.

-         Một biến con trỏ toàn cục có thể tham chiếu từ bên ngoài thủ tục.

2. Tạo 1 thủ tục thường trú trong CSDL

 2.1. Thủ tự thường trú được tạo ra thông qua câu lệnh CREATE PROCEDURE

   CREATE 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

   Trong đó:

   2100 tham số có thể được sử dụng trong 1 thủ tục thường trú, tham số bắt đầu bằng @ và phải chỉ ra kiểu dữ liệu của tham số.

   WITH RECOMPILE : yêu cầu SQL Server biên dịch lại thủ tục thường trú mỗi khi được gọi

   WITH ENCRYPTION : yêu cầu SQL Server mã hóa thủ tục thường 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.

   Dung lượng tối đa của thủ tục thường trú là 128MB

    Ví dụ 2.1: Giả sử cần thực hiện các công việc theo thứ tự sau:

     Nhập 1 đơn đặt hàng mới của khách hàng có mã khách hàng là 3

     Nhập các chi tiết đơn đặt hàng cho đơn đặt hàng trên. Giả sử đơn đặt hàng có mã là 4 và khách hàng đặt 1 mặt hàng có mã là 1

     Cách 1: Dùng các câu lệnh T-SQL riêng lẻ.

     Để thực hiện các công việc trên chúng ta cần các câu lệnh  như sau:

     Insert into orders values (3,’11/30/2011’)

     Insert into orderdetail values (4,1,10)

     Cách viết như trên có hạn chế là trong quá trình làm việc sẽ có rất nhiều đơn đặt hàng mới, do đó người dùng sẽ phải viết đi viết lại những câu lệnh tương tự nhau cho các khách hàng khác nhau. Để giải quyết vấn đề này ta dùng cách thứ 2 là dùng thủ tục thường trú và dùng tham số để nhận các thông tin thay đổi.

    Cách 2: Dùng thủ tục thường trú:

     Xác định các thông tin cần thiết để tạo thủ tục thường trú:

     Nơi tạo thủ tục thường trú: CSDL NORTHWIND

     Loại thủ tục thường trú: người dùng tự định nghĩa

     Tên thủ tục thường trú: sp_InsertOrderAndOrderDetail:

     use northwind

  create procedure sp_InsertOrderAndOrderDetail

  (@customerid nchar(5),

   @orderdate datetime,

   @orderid int,

   @quantity int)

  as

  begin

  insert into Orders (CustomerID,OrderDate)

  values(@customerid,@orderdate)

  insert into OrderDetails (OrderID,Quantity)

  values(@orderid,@quantity)

  end

    Thực hiện thủ tục thường trú này như sau:
sp_InsertOrderAndOrderDetail'3','11/11/2011','4','10'

 2.2. Lời gọi thủ tục thường trú

  Thủ tục thường trú được gọi theo cấu trúc:

  Tên_thủ_tục_thường_trú [danh_sách_tham_số]

  Chú ý: 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 thường trú.

  Ví dụ 2.2: Gọi thủ tục thường trú sp_InsertOrderAndOrderDetail

sp_InsertOrderAndOrderDetail'3','11/11/2011','4','10'   

  Nếu thủ tục thường trú được gọi từ 1 thủ tục khác, thực hiện bên trong 1 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_thường_trú [danh_sách_tham_số]

  Ví dụ 2.3: Tạo thủ tục thường trú trên CSDL NorthWind, có tên là sp_hienthi để chọn ra các khách hàng có id kết thúc bằng chữ A từ bảng customers

  use northwind

 create procedure sp_hienthi

 as

 begin

 select * from customers where customerid like '%A'

 end

 go

 Khi gọi thủ tục:

  exec sp_hienthi

 Kết quả như sau:

Ví dụ 2.4: Tương tự như ví dụ 2.3 nhưng tạo thủ tục với tham số để có thể hiển thị ra thông tin các khách hàng từ bảng customers có id kết thúc bằng bất kỳ chữ cái nào mà bạn muốn.   

  Tạo thủ tục thường trú có tên là sp_hienthi1 trên CSDL NorthWind

use northwind

create procedure sp_hienthi1

@val varchar(20)

as

begin

select * from customers where customerid like '%'+@val

end

Thực thi thủ tục: chọn ra các khách hàng có id kết thúc bằng chữ cái B

exec sp_hienthi1'B'

Kết quả thu được là:

Ví dụ 2.5: Tạo thủ tục thường trú trên CSDL Pubs, tên thủ tục: au_info_all, để liệt kê tất cả tác giả, sách, nhà xuất bản mà tác giả viết sách:

use pubs

create procedure au_info_all

as

select au_lname, au_fname, title, pub_name

from authors a inner join titleauthor ta

on a.au_id=ta.au_id inner join titles t

on t.title_id=ta.title_id inner join

publishers p on t.pub_id=p.pub_id

Go

Exec au_info_all

Kết quả như sau:

 Ví dụ 2.6: Tạo thủ tục thường trú có tên là au_info trên CSDL Pubs để lọc tìm các tác giả có tên họ truyền theo tham số.

Tạo thủ tục:

create procedure au_info

@lastname varchar(40),@firstname varchar(20)

as

select au_lname, au_fname, title, pub_name

from authors a inner join titleauthor ta

on a.au_id=ta.au_id inner join titles t

on t.title_id=ta.title_id inner join

publishers p on t.pub_id=p.pub_id

where au_fname=@firstname

and au_lname=@lastname

go

Thực thi thủ tục: có thể sử dụng 3 cách truyền tham số:

-         Gán giá trị theo thứ tự:

exec au_info 'Dull','Ann'

-         Gán giá trị theo tên biến:

exec au_info @lastname='Dull',@firstname='Ann'

-         Gán gí trị theo tên biến, không theo thứ tự

 exec au_info @firstname='Ann',@lastname='Dull'

Cho dù dùng cách nào ta cũng có được kết quả là:

 2.3.Biến trong thủ tục thường trú

  Như đã giới thiệu ở phần khái niệm về thủ tục thường trú, trong thủ tục thường 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 dược khai báo bằng từ khóa DECLARE theo cấu trúc sau:

  DECLARE @tên_biến kiểu_dữ_liệu

 2.4. Giá trị trả về của tham số trong thủ tục thường trú

  Trong các ví dụ trước, nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là biến, 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ụ 2.7: Có thủ tục thường trú sau:

   create procedure sp_TestOutput

  (@a int,@b int,@c int)

  as

  select @c=@a+@b

  Thực thi thủ tục:

  Declare @tong int

 set @tong=0

 exec sp_TestOutput 100,200,@tong

 select @tong

 Khi đó kết quả nhận được là: 0

Như vậy kết quả không được giữ lại khi kết thúc quá trình thực hiện thủ tục.

  2.4.1 Sử dụng tham số OUTPUT


  Trong trường hợp này, để có thể giữu lại giá trị của đối số sau khi kết thúc thủ tục, ta phải khai báo tham số của thủ tục theo cú pháp sau:

  @tên_tham_số  kiểu_dữ_liệu OUTPUT

  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ừ khóa OUTPUT

  Ví dụ 2.7 được viết lại nhu sau:

  create procedure sp_TestOutput

 (@a int, @b int, @c int output)

  as

  select @c=@a+@b

 Khi thực thi:

 declare @tong int

 set @tong=0

 exec sp_TestOutput 100,200,@tong output

 select @tong

 Kết quả là: 300 

  2.4.2.Sử dụng lệnh RETURN

  Tương tự 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 thủ tục thường trú.

  Ví dụ 2.8: Tạo thủ tục thường trú

  create procedure sp_TestOutput2

(@a int, @b int)

 as

 begin

 declare @c int

 select @c=@a+@b

 return @c

 end

 Thực thi thủ tục:

  declare @tong int

 exec @tong=sp_TestOutput2 '100','200'

 select @tong

 Kết quả là 300

  Ví dụ 2.9: Taọ thủ tục thường trú có tên là sp_TestReturn trên CSDL NorthWind để đếm số khách hàng trong bảng customer

  Tạo thủ tục:

create procedure sp_TestReturn

as

begin

  declare @out int

  select @out=count(*)

  from customers

  return @out

end

 Thực thi thủ tục:

declare @a int

exec @a=sp_TestReturn

select @a

 Kết quả thu được là 91:

 2.5. 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ị mặc định sẽ được gán cho tham số trong trường hợp không truyền đối số cho tham số khi có lời gọi đến thủ tục.

  Tham số với giá trị mặc định được khái báo theo cú pháp:

  @tên_tham_số  kiểu_dữ_liệu=giá_trị_mặc_định

 Ví dụ 2.10: Tạo thủ tục thường trú có tên là sp_InsertShipper trên CSDL NorthWind để thêm mới 1 bản ghi vào bảng Shippers, trong đó có dùng tham số với giá trị mặc định.

Tạo thủ tục:

create procedure sp_InsertShipper

@company varchar(20)='N/A',

@phone varchar(20)='N/A'

as

begin

Insert into Shippers (CompanyName,Phone)

values(@company,@phone)

end

go

Thực thi thủ tục:

  -Nếu có giá trị truyền vào, thủ tục sẽ lấy các giá trị được truyền vào

exec sp_InsertShipper 'Bui Thi Mai Phuong','0978955940'

  -Nếu không truyền vào giá trị thì CompanyName và Phone sẽ được lấy mặc định là rỗng.

Cả CompanyName và Phone đều rỗng:

exec sp_InsertShipper 

Hoặc điện thoại rỗng nhận giá trị mặc định:

exec sp_InsertShipper 'Nguyen Huyen Nga'

Kết quả cho các trường hợp như sau


Ví dụ 2.11: Tạo thủ tục thường trú có tên là sp_au_info2 trên CSDL Pubs để lọc tìm thông tin tác giả có tên truyền theo tham số, trong đó có dùng tham số với giá trị mặc định với lastname bắt đầu bằng chữ D

Tạo thủ tục thường trú:

create procedure au_info12

@lastname varchar(40)='D%',

@firstname varchar(20)='%'

as

select au_lname, au_fname, title, pub_name

from authors a inner join titleauthor ta

on a.au_id=ta.au_id inner join titles t

on t.title_id=ta.title_id inner join

publishers p on t.pub_id=p.pub_id

where au_fname like '%'+ @firstname

and au_lname like '%'+ @lastname

Thực thi thủ tục thường trú:

-         Không truyền tham số:

exec au_info12

Kết quả thu được như sau: Lọc ra thông tin các tác giả có au_lastname bắt đầu bằng chữ D, au_firstname tùy ý


-         Chỉ truyền tham số đầu, tham số sau sẽ nhận giá trị ngầm định

exec au_info1 'WH%'

Kết quả thu được như sau:  Lọc ra các tác giả có au_lastname bắt đầu bằng chữ Wh, au_firstname tùy ý

-         Chỉ truyền 1 tham số, tham số còn lại nhận giá trị ngầm định

exec au_info1 @firstname='A%'

Kết quả thu được là: Lọc ra các tác giả có au_firstname bắt đầu bằng chữ A, au_lastname nhận giá trị mặc định nên bắt đầu bằng chữ D

-         Xác định rõ giá trị tham số:

exec au_info1 'Hunter','Sheryi'

Kết quả thu được là: tác giả có au_lastname Hunter và au_firstname là Sheryl

 2.6.Biên dịch lại thủ tuc thường trú:

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

Có 3 cách để biên dịch lại các thủ tục thường trú:

 - Sử dụng thủ tục hệ thống sp_recomplie system

 - Chỉ rõ lệnh WITH RECOMPILE với lệnh CREATE PROCEDURE
 - Chỉ rõ lệnh WITH RECOPLILE với lệnh EXECUE

3. Thay đổi 1 thủ tục thường trú:

  Cho phép định nghĩa lại thủ tục thường trú đã tồn tại

  Cú pháp:

  ALTER PROCEDURE tên_thủ_tuc_thường_trú[(Danh_sách_tham_số)]

  [WITH RECOMPILE/ENCRYPTION/RECOMPILE,ENCRYPTION]

  AS
  Các_câu_lệnh_của_thủ_tục

Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại 1 thủ tục thường trú đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như không tác động đén các thủ tục khác hay trigger phụ thuộc vào thủ tục này.

Những lưu ý khi thay đổi nội dung của 1 thủ tục thường trú:

-         Thủ tục đó phải tồn tại

-         Tùy thuộc vào quyền hạn của người dùng đó có thể thay đổi thủ tục hay không

-         Kiểm tra tất cả các thông tin có liên quan đến các đối tượng khác trong khi bị thay đổi.

4. Xóa 1 thủ tục thường trú

  Để xóa 1 thủ tục thường trú đã có ta dùng câu lệnh DROP PROCEDURE với cú pháp

  DROP PROCEDURE tên_thủ_tục

  Khi xóa 1 thủ tục thường trú, 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ị xóa bỏ. Do đó, trước khi xóa cần phải kiểm tra chắc chắn các thông tin của thủ tục kể cả về nội dung và ảnh hưởng của thủ tục đó đối với hệ thống. Và nếu tạo lại thủ tục, ta phải tiến hành cấp phát lại các quyền trên thủ tục đó.

5. Vai trò của các thành viên trong nhóm:

  Nhóm trưởng: Bùi Thị Mai Phương CQ46/41.01:

-         Tìm hiểu chung về thủ tục thường trú Store Procedure Sql Server

-         Tạo thủ tục thường trú bằng lệnh CREATE PROCEDURE

-         Lời gọi thủ tục thường trú, truyền giá trị vào các tham số

Thành viên: Nguyễn Quang Ngọc CQ46/41.01:

-         Tìm hiểu chung về thủ tục thường trú Store Procedure Sql Server

-         Giá trị trả về trong thủ tục thường trú:

+ Sử dụng tham số OUTPUT

+ Sử dụng lệnh Return

Thành viên: Nguyễn Huyền Nga CQ46/41.01

-    Tìm hiểu chung về thủ tục thường trú

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

-         Lệnh ALTER PROCEDURE

-         Lệnh DROP PROCEDURE

Bạn đang đọc truyện trên: AzTruyen.Top

Tags: