Câu trả lời:
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.
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 Employee
bảng
Employee ID Name Age Mobile
---------------------------------------
001 Sidheswar 25 9938885469
002 Pritish 32 9178542436
Đầu tiên tôi lấy Employee
bả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 Employee
bảng Name
kích thước của cột phải là varchar(30)
.
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:
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.
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.
Hãy nghĩ về một tình huống như thế này,
GHI CHÚ:
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ụ
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.
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
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
"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 procedures
hoặcnumbering stored procedures
.
Tham chiếu cú pháp
; number
theo đ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ả
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 :
THẬN TRỌNG
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ủ.
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
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)
Đả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à
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)
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;
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.
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.
ORM
muốnEntity Framework
thực hiện cácCRUD
hoạt động?