Thủ tục lưu trữ là gì?


298

Thế nào là một "thủ tục lưu trữ" và làm thế nào để họ làm việc?

Cấu tạo của một thủ tục được lưu trữ là gì (mỗi thứ phải là một thủ tục được lưu trữ)?

Câu trả lời:


243

Các thủ tục được lưu trữ là một loạt các câu lệnh SQL có thể được thực thi theo một vài cách. Hầu hết các DBM chính đều hỗ trợ các thủ tục được lưu trữ; Tuy nhiên, không phải tất cả làm. Bạn sẽ cần xác minh với tài liệu trợ giúp DBMS cụ thể của mình để biết chi tiết cụ thể. Vì tôi quen thuộc nhất với SQL Server, tôi sẽ sử dụng nó làm mẫu của mình.

Để tạo một thủ tục được lưu trữ, cú pháp khá đơn giản:

CREATE PROCEDURE <owner>.<procedure name>

     <Param> <datatype>

AS

     <Body>

Ví dụ:

CREATE PROCEDURE Users_GetUserInfo

    @login nvarchar(30)=null

AS

    SELECT * from [Users]
    WHERE ISNULL(@login,login)=login

Lợi ích của các thủ tục được lưu trữ là bạn có thể tập trung logic truy cập dữ liệu vào một nơi duy nhất để DBA dễ dàng tối ưu hóa. Các thủ tục được lưu trữ cũng có một lợi ích bảo mật ở chỗ bạn có thể cấp quyền thực thi cho một thủ tục được lưu trữ nhưng người dùng sẽ không cần phải có quyền đọc / ghi trên các bảng bên dưới. Đây là một bước đầu tiên tốt để chống lại SQL tiêm.

Các thủ tục được lưu trữ đi kèm với nhược điểm, về cơ bản là bảo trì liên quan đến CRUD cơ bản của bạn hoạt động . Giả sử với mỗi bảng bạn có một Chèn, Cập nhật, Xóa và ít nhất một lựa chọn dựa trên khóa chính, điều đó có nghĩa là mỗi bảng sẽ có 4 quy trình. Bây giờ có một cơ sở dữ liệu kích thước khá của 400 bảng, và bạn có 1600 thủ tục! Và đó là giả sử bạn không có bản sao mà bạn có thể sẽ làm.

Đây là nơi sử dụng ORM hoặc một số phương pháp khác để tự động tạo các hoạt động CRUD cơ bản của bạn có rất nhiều công đức.


1
Bạn có nghĩa là Thủ tục lưu trữ để đọc dữ liệu và ORMmuốn Entity Frameworkthực hiện các CRUDhoạt động?
shaijut

2
Phải đó là một cách tiếp cận có thể. Chúng tôi sử dụng ORM cho mọi thứ trừ báo cáo
JoshBerke

Để biết thêm chi tiết về thủ tục được lưu trữ, bạn có thể tham khảo URL techflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

150

Một thủ tục được lưu trữ là một tập hợp các câu lệnh SQL được biên dịch sẵn được sử dụng để thực hiện một tác vụ đặc biệt.

Ví dụ: Nếu tôi có một Employeebảng

Employee ID  Name       Age  Mobile
---------------------------------------
001          Sidheswar  25   9938885469
002          Pritish    32   9178542436

Đầu tiên tôi lấy Employeebảng:

Create Procedure Employee details
As
Begin
    Select * from Employee
End

Để chạy thủ tục trên SQL Server:

Execute   Employee details

--- (Employee details is a user defined name, give a name as you want)

Sau đó, tôi sẽ chèn giá trị vào Bảng nhân viên

Create Procedure employee_insert
    (@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
    Insert Into Employee
    Values (@EmployeeID, @Name, @Age, @Mobile)
End

Để chạy thủ tục tham số hóa trên SQL Server:

Execute employee_insert 003,’xyz’,27,1234567890

  --(Parameter size must be same as declared column size)

Thí dụ: @Name Varchar(30)

Trong Employeebảng Namekích thước của cột phải là varchar(30).


1
ví dụ dễ hiểu
HaFiz Umer

80

Một thủ tục được lưu trữ là một nhóm các câu lệnh SQL đã được tạo và lưu trữ trong cơ sở dữ liệu. Một thủ tục được lưu trữ sẽ chấp nhận các tham số đầu vào để một số thủ tục có thể được sử dụng qua mạng bởi nhiều khách hàng sử dụng dữ liệu đầu vào khác nhau. Một thủ tục được lưu trữ sẽ làm giảm lưu lượng mạng và tăng hiệu suất. Nếu chúng tôi sửa đổi một thủ tục được lưu trữ, tất cả các máy khách sẽ nhận được thủ tục lưu trữ được cập nhật.

Mẫu tạo thủ tục lưu trữ

CREATE PROCEDURE test_display
AS
    SELECT FirstName, LastName
    FROM tb_test;

EXEC test_display;

Ưu điểm của việc sử dụng các thủ tục lưu trữ

  • Một thủ tục lưu trữ cho phép lập trình mô-đun.

    Bạn có thể tạo thủ tục một lần, lưu trữ nó trong cơ sở dữ liệu và gọi nó bất kỳ số lần nào trong chương trình của bạn.

  • Một thủ tục được lưu trữ cho phép thực hiện nhanh hơn.

    Nếu hoạt động yêu cầu một lượng lớn mã SQL được thực hiện lặp đi lặp lại, các thủ tục được lưu trữ có thể nhanh hơn. Chúng được phân tích cú pháp và tối ưu hóa khi chúng được thực thi lần đầu tiên và một phiên bản được biên dịch của thủ tục được lưu trữ vẫn còn trong bộ nhớ cache để sử dụng sau. Điều này có nghĩa là thủ tục được lưu trữ không cần phải được sửa chữa và mở lại với mỗi lần sử dụng, dẫn đến thời gian thực hiện nhanh hơn nhiều.

  • Một thủ tục được lưu trữ có thể làm giảm lưu lượng mạng.

    Một hoạt động yêu cầu hàng trăm dòng mã Transact-SQL có thể được thực hiện thông qua một câu lệnh thực thi mã trong một thủ tục, thay vì gửi hàng trăm dòng mã qua mạng.

  • Thủ tục lưu trữ cung cấp bảo mật tốt hơn cho dữ liệu của bạn

    Người dùng có thể được cấp quyền để thực thi một thủ tục được lưu trữ ngay cả khi họ không có quyền thực hiện trực tiếp các câu lệnh của thủ tục.

    Trong SQL Server, chúng tôi có các loại thủ tục được lưu trữ khác nhau:

    • Thủ tục lưu trữ hệ thống
    • Thủ tục lưu trữ do người dùng định nghĩa
    • Thủ tục lưu trữ mở rộng
  • Các thủ tục được bảo vệ bởi hệ thống được lưu trữ trong cơ sở dữ liệu chủ và chúng bắt đầu bằng một sp_tiền tố. Các quy trình này có thể được sử dụng để thực hiện nhiều tác vụ khác nhau để hỗ trợ các chức năng Máy chủ SQL cho các cuộc gọi ứng dụng bên ngoài trong các bảng hệ thống

    Ví dụ: sp_helptext [StoredProcedure_Name]

  • Các thủ tục lưu trữ do người dùng định nghĩa thường được lưu trữ trong cơ sở dữ liệu người dùng và thường được thiết kế để hoàn thành các tác vụ trong cơ sở dữ liệu người dùng. Trong khi mã hóa các thủ tục này không sử dụng các sp_tiền tố bởi vì nếu chúng ta sử dụng sp_tiền tố đầu tiên, nó sẽ kiểm tra cơ sở dữ liệu tổng thể, và sau đó nói đến người dùng định nghĩa cơ sở dữ liệu.

  • Các thủ tục lưu trữ mở rộng là các thủ tục gọi các hàm từ các tệp DLL. Ngày nay, các thủ tục lưu trữ mở rộng không được chấp nhận vì lý do tốt hơn là tránh sử dụng các thủ tục lưu trữ mở rộng.


37

Nói chung, một thủ tục được lưu trữ là một "Hàm SQL." Họ có:

-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID

Đây là một ví dụ tập trung vào T-SQL. Các thủ tục được lưu trữ có thể thực thi hầu hết các câu lệnh SQL, trả về các giá trị vô hướng và dựa trên bảng và được coi là an toàn hơn vì chúng ngăn chặn các cuộc tấn công SQL SQL.


16

Hãy nghĩ về một tình huống như thế này,

  • Bạn có một cơ sở dữ liệu với dữ liệu.
  • Có một số ứng dụng khác nhau cần thiết để truy cập cơ sở dữ liệu trung tâm đó và trong tương lai một số ứng dụng mới cũng vậy.
  • Nếu bạn định chèn các truy vấn cơ sở dữ liệu nội tuyến để truy cập cơ sở dữ liệu trung tâm, bên trong từng mã của từng ứng dụng, thì có lẽ bạn phải lặp lại cùng một truy vấn trong mã của các ứng dụng khác nhau.
  • Trong tình huống đó, bạn có thể sử dụng các thủ tục được lưu trữ (SP). Với các thủ tục được lưu trữ, bạn đang viết số lượng truy vấn phổ biến (thủ tục) và lưu trữ chúng với cơ sở dữ liệu trung tâm.
  • Bây giờ việc sao chép công việc sẽ không bao giờ xảy ra như trước đây và việc truy cập dữ liệu và bảo trì sẽ được thực hiện tập trung.

GHI CHÚ:

  • Trong tình huống trên, bạn có thể tự hỏi "Tại sao chúng tôi không thể giới thiệu máy chủ truy cập dữ liệu trung tâm để tương tác với tất cả các ứng dụng? Có. Đó sẽ là một giải pháp thay thế khả thi. Nhưng,
  • Ưu điểm chính của SP so với cách tiếp cận đó là, không giống như mã truy cập dữ liệu của bạn với các truy vấn nội tuyến, SP là các câu lệnh được biên dịch trước, vì vậy chúng sẽ thực thi nhanh hơn. Và chi phí liên lạc (qua mạng) sẽ ở mức tối thiểu.
  • Ngược lại, SP sẽ thêm một số tải cho máy chủ cơ sở dữ liệu. Nếu đó là một mối quan tâm theo tình huống, một máy chủ truy cập dữ liệu tập trung với các truy vấn nội tuyến sẽ là lựa chọn tốt hơn.

9

Một thủ tục được lưu trữ chủ yếu được sử dụng để thực hiện các nhiệm vụ nhất định trên cơ sở dữ liệu. Ví dụ

  • Nhận tập kết quả cơ sở dữ liệu từ một số logic kinh doanh trên dữ liệu.
  • Thực hiện nhiều hoạt động cơ sở dữ liệu trong một cuộc gọi.
  • Được sử dụng để di chuyển dữ liệu từ bảng này sang bảng khác.
  • Có thể được gọi cho các ngôn ngữ lập trình khác, như Java.

7

Một thủ tục được lưu trữ không là gì ngoài một nhóm các câu lệnh SQL được biên dịch thành một kế hoạch thực hiện.

  1. Tạo một lần và gọi nó là n số lần
  2. Nó làm giảm lưu lượng mạng

Ví dụ: tạo một thủ tục được lưu trữ

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
      SET NOCOUNT ON;

      SELECT FirstName, LastName, BirthDate, City, Country
      FROM Employees 
      WHERE EmployeeID = @EmployeeID
END
GO

Thay đổi hoặc sửa đổi một thủ tục được lưu trữ:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
    SET NOCOUNT ON;

    SELECT FirstName, LastName, BirthDate, City, Country
    FROM Employees 
    WHERE EmployeeID = @EmployeeID
END
GO

Thả hoặc xóa một thủ tục được lưu trữ:

DROP PROCEDURE GetEmployee

6

Một thủ tục được lưu trữ được sử dụng để lấy dữ liệu, sửa đổi dữ liệu và xóa dữ liệu trong bảng cơ sở dữ liệu. Bạn không cần phải viết toàn bộ lệnh SQL mỗi lần bạn muốn chèn, cập nhật hoặc xóa dữ liệu trong cơ sở dữ liệu SQL.


4
  • Một thủ tục được lưu trữ là một tập hợp được biên dịch sẵn của một hoặc nhiều câu lệnh SQL thực hiện một số tác vụ cụ thể.

  • Một thủ tục được lưu trữ nên được thực hiện độc lập bằng cách sử dụng EXEC

  • Một thủ tục được lưu trữ có thể trả về nhiều tham số

  • Một thủ tục được lưu trữ có thể được sử dụng để thực hiện giao dịch


4

"Thủ tục lưu trữ là gì" đã được trả lời trong các bài viết khác ở đây. Những gì tôi sẽ đăng là một cách ít được biết đến bằng cách sử dụng thủ tục được lưu trữ. Nó là grouping stored procedureshoặcnumbering stored procedures .

Tham chiếu cú ​​pháp

nhập mô tả hình ảnh ở đây

; numbertheo điều này

Một số nguyên tùy chọn được sử dụng để nhóm các thủ tục cùng tên. Các thủ tục được nhóm này có thể được hủy bỏ cùng nhau bằng cách sử dụng một câu lệnh THỦ TỤC DROP

Thí dụ

CREATE Procedure FirstTest 
(
    @InputA INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO

CREATE Procedure FirstTest;2
(
    @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

Sử dụng

exec FirstTest 10
exec FirstTest;2 20,30

Kết quả

nhập mô tả hình ảnh ở đây

Một nỗ lực khác

CREATE Procedure SecondTest;2
(
     @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

Kết quả

Msg 2730, Cấp 11, Trạng thái 1, Quy trình Thứ hai, Dòng 1 [Bắt đầu hàng loạt 3] Không thể tạo quy trình 'Thứ hai' với số nhóm là 2 vì một quy trình có cùng tên và số nhóm 1 hiện không tồn tại kho dữ liệu. Phải thực hiện TẠO QUY TRÌNH 'Thứ hai'; 1 trước tiên.

Tài liệu tham khảo :

  1. TẠO QUY TRÌNH với cú pháp cho số
  2. Các thủ tục được lưu trữ được đánh số trong SQL Server - techie-friendly.blogspot.com
  3. Nhóm thủ tục lưu trữ - sqlmag

THẬN TRỌNG

  1. Sau khi bạn nhóm các thủ tục, bạn không thể thả chúng riêng lẻ.
  2. Tính năng này có thể bị xóa trong phiên bản tương lai của Microsoft SQL Server.

0

Một thủ tục được lưu trữ là một tập hợp có tên của các câu lệnh SQL và logic thủ tục, nghĩa là được biên dịch, xác minh và lưu trữ trong cơ sở dữ liệu máy chủ. Một thủ tục được lưu trữ thường được xử lý như các đối tượng cơ sở dữ liệu khác và được kiểm soát thông qua cơ chế bảo mật máy chủ.


0

Trong DBMS, một thủ tục được lưu trữ là một tập hợp các câu lệnh SQL với tên được gán được lưu trữ trong cơ sở dữ liệu ở dạng biên dịch để nó có thể được chia sẻ bởi một số chương trình.

Việc sử dụng một thủ tục được lưu trữ có thể hữu ích trong

  1. Cung cấp quyền truy cập được kiểm soát vào dữ liệu (người dùng cuối chỉ có thể nhập hoặc thay đổi dữ liệu, nhưng không thể viết thủ tục)

  2. Đảm bảo tính toàn vẹn dữ liệu (dữ liệu sẽ được nhập một cách nhất quán) và

  3. Cải thiện năng suất (các câu lệnh của một thủ tục được lưu trữ chỉ cần được viết một lần)


0

cho đơn giản,

Thủ tục lưu trữ là các chương trình được lưu trữ , một chương trình / chức năng được lưu trữ vào cơ sở dữ liệu.

Mỗi chương trình được lưu trữ chứa một phần thân bao gồm một câu lệnh SQL. Câu lệnh này có thể là một câu lệnh ghép được tạo thành từ một số câu lệnh được phân tách bằng ký tự dấu chấm phẩy (;).

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

0

Các thủ tục được lưu trữ trong SQL Server có thể chấp nhận các tham số đầu vào và trả về nhiều giá trị của các tham số đầu ra; trong SQL Server, các câu lệnh chương trình thủ tục được lưu trữ để thực hiện các hoạt động trong cơ sở dữ liệu và trả về một giá trị trạng thái cho một thủ tục gọi hoặc lô.

Lợi ích của việc sử dụng các thủ tục được lưu trữ trong SQL Server

Họ cho phép lập trình mô-đun. Họ cho phép thực hiện nhanh hơn. Họ có thể giảm lưu lượng mạng. Chúng có thể được sử dụng như một cơ chế bảo mật.

Dưới đây là một ví dụ về một thủ tục được lưu trữ có tham số, thực hiện truy vấn và trả về kết quả. Cụ thể, quy trình được lưu trữ chấp nhận BusinessEntityID làm tham số và sử dụng tham số này để khớp với khóa chính của bảng HumanResource.Employee để trả về nhân viên được yêu cầu.

> create procedure HumanResources.uspFindEmployee    `*<<<---Store procedure name`*
@businessEntityID                                     `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId,              <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId     <<<---parameter used as criteria
end

Tôi đã học được điều này từ Essential.com ... nó rất hữu ích.


0

Thủ tục lưu trữ sẽ giúp bạn tạo mã trong máy chủ. Bạn có thể truyền tham số và tìm đầu ra.

create procedure_name (para1 int,para2 decimal)
as
select * from TableName

0

Trong Thủ tục lưu trữ, các câu lệnh chỉ được viết một lần và giảm lưu lượng mạng giữa máy khách và máy chủ. Chúng tôi cũng có thể tránh các cuộc tấn công tiêm Sql.

  • Nếu bạn đang sử dụng chương trình của bên thứ ba trong ứng dụng của mình để xử lý thanh toán, ở đây cơ sở dữ liệu chỉ nên hiển thị thông tin cần thiết và hoạt động mà bên thứ ba này đã được ủy quyền, bằng cách này, chúng tôi có thể đạt được bảo mật dữ liệu bằng cách đặt quyền sử dụng Quy trình được lưu trữ.
  • Việc cập nhật bảng chỉ nên được thực hiện đối với bảng mà nó đang nhắm mục tiêu nhưng không nên cập nhật bất kỳ bảng nào khác, nhờ đó chúng ta có thể đạt được tính toàn vẹn dữ liệu bằng cách xử lý giao dịch và xử lý lỗi.
  • Nếu bạn muốn trả về một hoặc nhiều mục với kiểu dữ liệu thì tốt hơn là sử dụng tham số đầu ra.
  • Trong Thủ tục lưu trữ, chúng tôi sử dụng tham số đầu ra cho bất kỳ thứ gì cần trả về. Nếu bạn muốn chỉ trả về một mục chỉ có một kiểu dữ liệu số nguyên thì tốt hơn nên sử dụng giá trị trả về. Trên thực tế, giá trị trả về chỉ để thông báo thành công hay thất bại của Quy trình được lưu trữ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.