"ขั้นตอนการจัดเก็บ"คืออะไรและทำงานอย่างไร
การแต่งหน้าของกระบวนงานที่เก็บไว้คืออะไร (สิ่งที่แต่ละอย่างจะต้องเป็นขั้นตอนการจัดเก็บ)
"ขั้นตอนการจัดเก็บ"คืออะไรและทำงานอย่างไร
การแต่งหน้าของกระบวนงานที่เก็บไว้คืออะไร (สิ่งที่แต่ละอย่างจะต้องเป็นขั้นตอนการจัดเก็บ)
คำตอบ:
กระบวนงานที่เก็บเป็นชุดของคำสั่ง SQL ที่สามารถดำเนินการได้สองวิธี DBM สำคัญส่วนใหญ่สนับสนุนการจัดเก็บ; อย่างไรก็ตามไม่ได้ทำทั้งหมด คุณจะต้องตรวจสอบกับเอกสารช่วยเหลือของ DBMS เฉพาะสำหรับข้อมูลเฉพาะ เนื่องจากฉันคุ้นเคยกับ SQL Server มากที่สุดฉันจะใช้มันเป็นตัวอย่างของฉัน
ในการสร้างโพรซีเดอร์ที่เก็บไว้ไวยากรณ์นั้นค่อนข้างง่าย:
CREATE PROCEDURE <owner>.<procedure name>
<Param> <datatype>
AS
<Body>
ตัวอย่างเช่น:
CREATE PROCEDURE Users_GetUserInfo
@login nvarchar(30)=null
AS
SELECT * from [Users]
WHERE ISNULL(@login,login)=login
ข้อดีของขั้นตอนการจัดเก็บคือคุณสามารถรวมศูนย์ตรรกะการเข้าถึงข้อมูลไว้ในที่เดียวซึ่งง่ายสำหรับ DBA ในการเพิ่มประสิทธิภาพ กระบวนงานที่เก็บไว้ยังมีประโยชน์ด้านความปลอดภัยซึ่งคุณสามารถให้สิทธิ์ดำเนินการกับกระบวนงานที่เก็บไว้ได้ แต่ผู้ใช้ไม่จำเป็นต้องมีสิทธิ์อ่าน / เขียนบนตารางต้นแบบ นี่เป็นขั้นตอนแรกที่ดีสำหรับการฉีด SQL
ขั้นตอนการจัดเก็บจะมาพร้อมกับข้อเสียโดยทั่วไปการบำรุงรักษาที่เกี่ยวข้องกับการดำเนินงานCRUDขั้นพื้นฐานของคุณ สมมติว่าแต่ละตารางคุณมีการแทรกอัปเดตลบและเลือกอย่างน้อยหนึ่งรายการตามคีย์หลักนั่นหมายความว่าแต่ละตารางจะมี 4 ขั้นตอน ตอนนี้ใช้ฐานข้อมูลขนาดที่เหมาะสม 400 ตารางและคุณมี 1600 ขั้นตอน! และนั่นคือสมมุติว่าคุณไม่มีข้อมูลซ้ำที่คุณอาจต้องการ
นี่คือที่ใช้ORMหรือวิธีอื่นเพื่อสร้างการดำเนินงาน CRUD ขั้นพื้นฐานของคุณโดยอัตโนมัติมีข้อดีมากมาย
กระบวนงานที่เก็บไว้เป็นชุดของคำสั่ง SQL ที่คอมไพล์แล้วที่ใช้ในการทำงานพิเศษ
ตัวอย่าง: ถ้าฉันมีEmployee
ตาราง
Employee ID Name Age Mobile
---------------------------------------
001 Sidheswar 25 9938885469
002 Pritish 32 9178542436
ก่อนอื่นฉันจะดึงEmployee
ตาราง:
Create Procedure Employee details
As
Begin
Select * from Employee
End
ในการรันโพรซีเดอร์บน SQL Server:
Execute Employee details
--- (Employee details is a user defined name, give a name as you want)
จากนั้นข้อที่สองฉันใส่ค่าลงในตารางพนักงาน
Create Procedure employee_insert
(@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
Insert Into Employee
Values (@EmployeeID, @Name, @Age, @Mobile)
End
ในการรันโพรซีเดอร์ที่เป็นพารามิเตอร์บน SQL Server:
Execute employee_insert 003,’xyz’,27,1234567890
--(Parameter size must be same as declared column size)
ตัวอย่าง: @Name Varchar(30)
ในEmployee
ตารางขนาดของคอลัมน์ต้องName
varchar(30)
กระบวนงานที่เก็บไว้เป็นกลุ่มของคำสั่ง SQL ที่ถูกสร้างขึ้นและเก็บไว้ในฐานข้อมูล โพรซีเดอร์ที่เก็บไว้จะยอมรับพารามิเตอร์อินพุตเพื่อให้โพรซีเดอร์เดี่ยวสามารถใช้ผ่านเครือข่ายโดยไคลเอนต์หลายรายโดยใช้ข้อมูลอินพุตที่แตกต่างกัน โพรซีเดอร์ที่เก็บไว้จะลดทราฟฟิกเครือข่ายและเพิ่มประสิทธิภาพ หากเราแก้ไขขั้นตอนการจัดเก็บลูกค้าทั้งหมดจะได้รับขั้นตอนการจัดเก็บที่ปรับปรุง
ตัวอย่างการสร้างกระบวนงานที่เก็บไว้
CREATE PROCEDURE test_display
AS
SELECT FirstName, LastName
FROM tb_test;
EXEC test_display;
ข้อดีของการใช้กระบวนงานที่เก็บไว้
ขั้นตอนการจัดเก็บช่วยให้การเขียนโปรแกรมแบบแยกส่วน
คุณสามารถสร้างโพรซีเดอร์ได้หนึ่งครั้งเก็บไว้ในฐานข้อมูลและเรียกมันว่าจำนวนครั้งใด ๆ ในโปรแกรมของคุณ
ขั้นตอนการจัดเก็บช่วยให้ดำเนินการได้เร็วขึ้น
หากการดำเนินการต้องการรหัส SQL จำนวนมากที่ทำซ้ำขั้นตอนการจัดเก็บอาจเร็วขึ้น พวกเขาจะถูกแยกวิเคราะห์และปรับให้เหมาะสมเมื่อพวกเขาถูกดำเนินการครั้งแรกและรุ่นที่รวบรวมของขั้นตอนการจัดเก็บยังคงอยู่ในแคชหน่วยความจำสำหรับใช้ในภายหลัง ซึ่งหมายความว่าขั้นตอนการจัดเก็บไม่จำเป็นต้องทำการแยกวิเคราะห์ซ้ำและนำกลับมาใช้ใหม่ในแต่ละครั้งซึ่งจะส่งผลให้เวลาในการประมวลผลเร็วขึ้นมาก
ขั้นตอนการจัดเก็บสามารถลดปริมาณการใช้เครือข่าย
การดำเนินการที่ต้องการโค้ด Transact-SQL หลายร้อยบรรทัดสามารถดำเนินการผ่านคำสั่งเดียวที่เรียกใช้งานโค้ดในโพรซีเดอร์แทนที่จะส่งโค้ดหลายร้อยบรรทัดผ่านเครือข่าย
ขั้นตอนการจัดเก็บให้ความปลอดภัยกับข้อมูลของคุณดีขึ้น
ผู้ใช้สามารถได้รับอนุญาตให้ดำเนินการขั้นตอนการจัดเก็บแม้ว่าพวกเขาจะไม่ได้รับอนุญาตให้ดำเนินการตามคำสั่งของขั้นตอนโดยตรง
ใน SQL Server เรามีวิธีการเก็บประเภทต่าง ๆ :
กระบวนงานที่เก็บไว้ในระบบจะถูกเก็บไว้ในฐานข้อมูลหลักและเริ่มต้นด้วยส่วนsp_
นำหน้า ขั้นตอนเหล่านี้สามารถใช้เพื่อทำงานที่หลากหลายเพื่อรองรับฟังก์ชั่น SQL Server สำหรับการเรียกใช้แอปพลิเคชันภายนอกในตารางระบบ
ตัวอย่าง: sp_helptext [StoredProcedure_Name]
โดยทั่วไปขั้นตอนการจัดเก็บที่ผู้ใช้กำหนดจะถูกเก็บไว้ในฐานข้อมูลผู้ใช้และโดยทั่วไปแล้วได้รับการออกแบบเพื่อให้งานในฐานข้อมูลผู้ใช้เสร็จสมบูรณ์ ในขณะที่การเข้ารหัสขั้นตอนเหล่านี้ไม่ได้ใช้sp_
คำนำหน้าเพราะถ้าเราจะใช้sp_
คำนำหน้าแรกก็จะตรวจสอบฐานข้อมูลหลักและแล้วก็มาถึงฐานข้อมูลที่ผู้ใช้กำหนด
ขั้นตอนการจัดเก็บขยายเป็นกระบวนการที่เรียกใช้ฟังก์ชันจากไฟล์ DLL ทุกวันนี้โพรซีเดอร์ที่เก็บแบบขยายถูกเลิกใช้เนื่องจากเหตุผลที่ดีกว่าที่จะหลีกเลี่ยงการใช้โพรซีเดอร์ที่เก็บแบบขยาย
โดยทั่วไปกระบวนงานที่เก็บไว้เป็น "ฟังก์ชัน SQL" พวกเขามี:
-- 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
นี่คือตัวอย่างที่เน้น T-SQL กระบวนงานที่เก็บไว้สามารถดำเนินการคำสั่ง SQL ส่วนใหญ่ส่งคืนค่าสเกลาร์และค่าที่อิงกับตารางและได้รับการพิจารณาว่ามีความปลอดภัยมากกว่าเนื่องจากป้องกันการโจมตีจากการฉีด SQL
คิดถึงสถานการณ์เช่นนี้
บันทึก:
กระบวนงานที่เก็บไว้ส่วนใหญ่จะใช้เพื่อดำเนินงานบางอย่างกับฐานข้อมูล ตัวอย่างเช่น
โพรซีเดอร์ที่เก็บคืออะไร แต่กลุ่มของคำสั่ง SQL ที่คอมไพล์ลงในแผนปฏิบัติการเดี่ยว
ตัวอย่าง: การสร้างกระบวนงานที่เก็บไว้
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
แก้ไขหรือแก้ไขโพรซีเดอร์ที่เก็บ:
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
ปล่อยหรือลบโพรซีเดอร์ที่เก็บไว้:
DROP PROCEDURE GetEmployee
โพรซีเดอร์ที่เก็บไว้ใช้เพื่อดึงข้อมูลแก้ไขข้อมูลและลบข้อมูลในตารางฐานข้อมูล คุณไม่จำเป็นต้องเขียนคำสั่ง SQL ทั้งหมดทุกครั้งที่คุณต้องการแทรกอัปเดตหรือลบข้อมูลในฐานข้อมูล SQL
กระบวนงานที่เก็บไว้เป็นชุดที่คอมไพล์แล้วของคำสั่ง SQL อย่างน้อยหนึ่งคำสั่งซึ่งทำงานบางอย่างที่เฉพาะเจาะจง
ขั้นตอนการจัดเก็บควรดำเนินการแบบสแตนด์อโลนโดยใช้ EXEC
โพรซีเดอร์ที่เก็บสามารถส่งคืนพารามิเตอร์หลายตัว
ขั้นตอนการจัดเก็บสามารถใช้ในการทำธุรกรรม
"ขั้นตอนการจัดเก็บคืออะไร" ได้รับคำตอบแล้วในโพสต์อื่น ๆ ที่นี่ สิ่งที่ฉันจะโพสต์เป็นวิธีที่รู้จักกันน้อยในการใช้ขั้นตอนการจัดเก็บ มันเป็นหรือgrouping stored procedures
numbering stored procedures
การอ้างอิงไวยากรณ์
; number
ตามนี้
จำนวนเต็มเผื่อเลือกที่ใช้กับโพรซีเดอร์กลุ่มที่มีชื่อเดียวกัน โพรซีเดอร์ที่จัดกลุ่มเหล่านี้สามารถรวมเข้าด้วยกันโดยใช้คำสั่ง DROP PROCEDURE หนึ่งคำสั่ง
ตัวอย่าง
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
ใช้
exec FirstTest 10
exec FirstTest;2 20,30
ผลลัพธ์
ความพยายามอื่น
CREATE Procedure SecondTest;2
(
@InputA INT,
@InputB INT
)
AS
BEGIN
SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO
ผลลัพธ์
ข่าวสารเกี่ยวกับ 2730, ระดับ 11, สถานะ 1, กระบวนงาน SecondTest, บรรทัด 1 [Batch Start Line 3] ไม่สามารถสร้างขั้นตอน 'SecondTest' ด้วยหมายเลขกลุ่ม 2 เนื่องจากกระบวนงานที่มีชื่อเดียวกันและหมายเลขกลุ่ม 1 ไม่มีอยู่ใน ฐานข้อมูล ต้องดำเนินการ CREATE PROCEDURE 'SecondTest'; 1 ก่อน
การอ้างอิง :
ข้อควรระวัง
กระบวนงานที่เก็บไว้คือชุดชื่อของคำสั่ง SQL และตรรกะเชิงกระบวนงานเช่นรวบรวมตรวจสอบและเก็บไว้ในฐานข้อมูลเซิร์ฟเวอร์ โดยทั่วไปขั้นตอนการจัดเก็บจะได้รับการปฏิบัติเหมือนวัตถุฐานข้อมูลอื่นและควบคุมผ่านกลไกความปลอดภัยของเซิร์ฟเวอร์
ใน DBMS กระบวนการที่เก็บไว้คือชุดของคำสั่ง SQL ที่มีชื่อที่กำหนดซึ่งเก็บไว้ในฐานข้อมูลในรูปแบบที่คอมไพล์เพื่อให้สามารถใช้ร่วมกันได้หลายโปรแกรม
การใช้โพรซีเดอร์ที่เก็บไว้จะมีประโยชน์ใน
การให้การควบคุมการเข้าถึงข้อมูล (ผู้ใช้สามารถป้อนหรือเปลี่ยนแปลงข้อมูลได้ แต่ไม่สามารถเขียนขั้นตอนได้)
การรับรองความถูกต้องของข้อมูล (ข้อมูลจะถูกป้อนในลักษณะที่สอดคล้องกัน) และ
ปรับปรุงประสิทธิภาพการผลิต (งบของขั้นตอนการจัดเก็บจะต้องเขียนเพียงครั้งเดียว)
เพื่อความเรียบง่าย
Stored ProcedureคือStored Programs , โปรแกรม / ฟังก์ชั่นที่เก็บไว้ในฐานข้อมูล
แต่ละโปรแกรมที่เก็บไว้มีเนื้อหาที่ประกอบด้วยคำสั่ง SQL คำสั่งนี้อาจเป็นคำสั่งผสมที่ประกอบด้วยหลายคำสั่งคั่นด้วยเครื่องหมายอัฒภาค (;)
CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
SET @x = 0;
REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;
โพรซีเดอร์ที่เก็บใน SQL Server สามารถยอมรับพารามิเตอร์อินพุตและส่งคืนพารามิเตอร์เอาต์พุตหลายค่า ใน SQL Server คำสั่งโปรแกรมโพรซีเดอร์ที่เก็บไว้เพื่อดำเนินการในฐานข้อมูลและส่งคืนค่าสถานะไปยังโพรซีเดอร์การโทรหรือแบตช์
ประโยชน์ของการใช้กระบวนงานที่เก็บไว้ใน SQL Server
อนุญาตการเขียนโปรแกรมแบบแยกส่วน อนุญาตให้ดำเนินการได้เร็วขึ้น พวกเขาสามารถลดปริมาณการใช้เครือข่าย สามารถใช้เป็นกลไกความปลอดภัยได้
นี่คือตัวอย่างของกระบวนงานที่เก็บไว้ที่ใช้พารามิเตอร์ดำเนินการแบบสอบถามและส่งกลับผลลัพธ์ กระบวนการที่เก็บไว้ยอมรับ BusinessEntityID เป็นพารามิเตอร์และใช้สิ่งนี้เพื่อจับคู่คีย์หลักของตาราง HumanResources.Employee เพื่อส่งคืนพนักงานที่ร้องขอ
> 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
ฉันได้เรียนรู้สิ่งนี้จาก essential.com ... มันมีประโยชน์มาก
ขั้นตอนการจัดเก็บจะช่วยให้คุณสร้างรหัสในเซิร์ฟเวอร์คุณสามารถส่งพารามิเตอร์และค้นหาผลลัพธ์
create procedure_name (para1 int,para2 decimal)
as
select * from TableName
ในงบโพรซีเดอร์ Stored เขียนเพียงครั้งเดียวและลดทราฟฟิกเครือข่ายระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ นอกจากนี้เรายังสามารถหลีกเลี่ยงการโจมตีของ SQL Injection
ORM
ชอบEntity Framework
ที่จะทำCRUD
การดำเนินงาน?