ما هي الـ Stored Procedures في SQL؟
الـ Stored Procedures هي مجموعة من التعليمات (SQL Statements) يتم تخزينها داخل قاعدة البيانات ويتم تنفيذها بمجرد استدعائها. تشبه الـ Functions من حيث إعادة الاستخدام، لكنها أكثر قوة ومرونة، حيث يمكنها تنفيذ أي نوع من العمليات بما في ذلك DQL (SELECT)، DML (INSERT, UPDATE, DELETE)، وحتى DDL (CREATE, DROP, ALTER).
هو عبارة عن Precompiled Queries، بس فيه Tradeoff انه رغم انه بيزود السرعة بس بيأثر على المساحة أكيد، وكمان بستخدمه في حالات الـ Insert, Update, Delete والكلام دا بمعنى اني ممكن أغير فيها الداتا
لماذا نستخدم الـ Stored Procedures؟
- المرونة:
- يمكنها التعامل مع أي نوع من العمليات (DQL, DML, DDL) بخلاف الـ Functions التي تقتصر على DQL فقط.
- إعادة الاستخدام:
- تُكتب مرة واحدة ويمكن استدعاؤها في أي مكان، مما يقلل من تكرار الكود ويُبسط الصيانة.
- الديناميكية:
- تدعم Parameters لتخصيص العمليات وفقًا للاحتياجات المختلفة.
- تحسين الأداء:
- يتم تنفيذ الـ Procedure على السيرفر مباشرة، مما يقلل الحمل على الشبكة بين التطبيق وقاعدة البيانات.
- الأمان:
- تُستخدم للتحكم في الوصول إلى البيانات، حيث يمكن إعطاء صلاحيات محدودة للمستخدمين لاستدعاء الإجراء فقط دون الوصول المباشر إلى الجداول.
أنواع الـ Stored Procedures:
1. System Stored Procedures:
-
تأتي مدمجة مع SQL Server وتُستخدم لتنفيذ عمليات خاصة بالنظام مثل إدارة قواعد البيانات أو الجداول.
-
أمثلة:
EXEC sp_help; -- لعرض تفاصيل عن الجدول أو الكائن EXEC sp_who; -- لعرض المستخدمين المتصلين
2. User-Defined Stored Procedures:
-
تُكتب بواسطة المستخدم لتنفيذ منطق مخصص.
-
مثال:
CREATE PROCEDURE GetEmployeeDetails @employee_id INT AS BEGIN SELECT employee_name, department, salary FROM employees WHERE employee_id = @employee_id; END;
-
استدعاء:
EXEC GetEmployeeDetails 101;
3. Temporary Stored Procedures:
-
يتم إنشاؤها مؤقتًا وتُحذف تلقائيًا بعد انتهاء الجلسة.
-
مثال:
CREATE PROCEDURE #TempProcedure AS BEGIN SELECT * FROM employees; END;
مميزات الـ Stored Procedures:
- أداء أعلى:
- يتم ترجمة الإجراءات المخزنة مرة واحدة (Compiled)، مما يجعل تنفيذها أسرع مقارنة بالاستعلامات العادية.
- تقليل تكرار الكود:
- بدلاً من كتابة نفس الكود في أماكن متعددة، يتم تجميعه في إجراء مخزن يُستدعى حسب الحاجة.
- إمكانية التعامل مع Parameters:
- تدعم Input Parameters لإدخال بيانات وOutput Parameters لإرجاع نتائج.
- تنفيذ جميع أنواع العمليات:
- بخلاف الفيوز والفانكشنز، يمكن للـ Stored Procedures تنفيذ DML و DDL، مما يجعلها أداة شاملة لإدارة البيانات.
- تعزيز الأمان:
- يمكن حصر المستخدمين في استدعاء الإجراء فقط دون التفاعل مع الجداول مباشرة.
مقارنة مع الفيوز والفانكشنز:
الميزة | Stored Procedures |
---|---|
قبول Parameters | نعم، تدعم Input و Output Parameters. |
نوع العمليات | تدعم DQL, DML, و DDL. |
إمكانية التخصيص | مرنة جدًا بفضل دعم Parameters المتعددة. |
التخزين | لا تخزن بيانات فعلية، لكن يمكن تنفيذ عمليات على البيانات. |
إعادة الاستخدام | تُكتب مرة واحدة وتُستخدم في أي مكان. |
أمثلة على استخدام الـ Stored Procedures:
1. إجراء لتنفيذ عملية إدخال (Insert):
CREATE PROCEDURE AddNewEmployee
@name NVARCHAR(100),
@department NVARCHAR(50),
@salary DECIMAL(10, 2)
AS
BEGIN
INSERT INTO employees (employee_name, department, salary)
VALUES (@name, @department, @salary);
END;
-
الاستخدام:
EXEC AddNewEmployee 'Ali', 'IT', 5000;
2. إجراء لتحديث بيانات:
CREATE PROCEDURE UpdateSalary
@employee_id INT,
@new_salary DECIMAL(10, 2)
AS
BEGIN
UPDATE employees
SET salary = @new_salary
WHERE employee_id = @employee_id;
END;
-
الاستخدام:
EXEC UpdateSalary 101, 6000;
3. إجراء لحذف بيانات:
CREATE PROCEDURE DeleteEmployee
@employee_id INT
AS
BEGIN
DELETE FROM employees
WHERE employee_id = @employee_id;
END;
-
الاستخدام:
EXEC DeleteEmployee 102;
مقارنة بين الـ Functions، الـ Views، والـ Stored Procedures في SQL
الميزة | Functions | Views | Stored Procedures |
---|---|---|---|
الغرض الأساسي | إعادة قيمة واحدة (Scalar) أو جدول (Table-Valued) بناءً على منطق مخصص باستخدام Parameters. | جدول وهمي (Virtual Table) يعتمد على استعلام ثابت يتم استدعاؤه عند الحاجة. | تنفيذ منطق معقد أو سلسلة من العمليات (DQL, DML, وحتى DDL) باستخدام Parameters. |
قبول Parameters | نعم، يمكنها قبول Parameters لتخصيص النتائج. | لا، ثابتة ولا تدعم المدخلات. | نعم، تقبل Parameters لتخصيص العمليات وتدعم أكثر من Parameter. |
إعادة الاستخدام | نعم، تُكتب مرة واحدة وتُستخدم في أماكن متعددة. | نعم، يمكن استدعاؤها كجدول في استعلامات أخرى. | نعم، تُكتب مرة واحدة ويمكن استخدامها لتنفيذ العمليات بشكل مركزي. |
نوع العمليات (DDL/DML/DQL) | تدعم DQL فقط (SELECT). لا تدعم DML (INSERT, UPDATE, DELETE) أو DDL (CREATE, DROP). | تدعم DQL (SELECT) فقط، ولكن يمكن إجراء DML على بعض الفيوز البسيطة. | تدعم DQL, DML, وDDL بالكامل، مما يجعلها مرنة للغاية. |
نوع النتائج | - Scalar: قيمة واحدة (مثل عدد أو نص). - Table-Valued: جدول كامل بناءً على منطق الاستعلام. | جدول يعرض البيانات بناءً على الاستعلام المُخزن (SELECT). | يمكن أن تُعيد بيانات (SELECT)، أو لا تُعيد شيء (مثل تنفيذ العمليات فقط). |
الأداء مع DML | لا يمكن تنفيذ DML داخل Functions. | يمكن تنفيذ INSERT, UPDATE, DELETE على Views البسيطة بشرط توافق الشروط. | تدعم تنفيذ أي عملية DML مثل INSERT, UPDATE, وDELETE. |
إخفاء التعقيد | يمكنها إخفاء العمليات المعقدة داخل الكود مع مرونة تخصيص النتائج. | تستخدم لإخفاء تعقيدات استعلامات SELECT عن المستخدمين النهائيين. | تُستخدم لتجميع العمليات المعقدة وإخفائها عن المستخدمين، مع دعم عمليات أكثر تعقيدًا. |
إمكانية التخزين (Data Storage) | لا تخزن بيانات فعلية، فقط منطق تنفيذ الاستعلام. | لا تخزن بيانات فعلية، تعرض البيانات مباشرة من الجداول الأساسية عند استدعائها. | لا تخزن بيانات، ولكن يمكنها تنفيذ عمليات تؤثر على الجداول وتغيير البيانات. |
التعامل مع البيانات الحساسة | يمكن التحكم في نوع البيانات المُرجعة باستخدام المنطق المكتوب. | تُستخدم لإظهار أعمدة محددة أو بيانات مختارة من الجدول الأساسي. | يمكنها التحكم الكامل في العمليات المنفذة بما يناسب مستوى الأمان المطلوب. |
الأداء | أسرع مع العمليات الديناميكية بسبب قبول Parameters وتخصيص النتائج. | أسرع مع الاستعلامات الثابتة التي لا تحتاج إلى تخصيص أو تغيير أثناء التنفيذ. | قد تكون أبطأ نسبيًا بسبب إمكانية تنفيذ عمليات معقدة. |
التعديل والصيانة | التعديل يتم مرة واحدة على السيرفر، ويؤثر على جميع الأماكن التي تستخدم الـ Function. | التعديل يتم مرة واحدة على الاستعلام المُخزن، ويؤثر على جميع المستخدمين المرتبطين بالفيو. | التعديل يتم مرة واحدة ويؤثر على جميع الأماكن التي تستخدم الـ Procedure. |
سهولة الاستخدام | تُستخدم داخل الاستعلامات أو في العمليات المخزنة (Stored Procedures). | تُستخدم كأنها جدول في استعلامات SELECT فقط. | تُستخدم لتنفيذ العمليات بشكل مباشر أو تلقائي عن طريق استدعاء الإجراء. |
إمكانية الاستدعاء داخل استعلام | يمكن استدعاء الـ Function داخل استعلام (SELECT) أو في عبارات مثل WHERE و JOIN. | تُستدعى كجدول داخل جملة SELECT أو الاستعلامات الأخرى. | لا يمكن استخدامها مباشرة في استعلام SELECT، ولكن يمكن استدعاؤها بشكل مستقل. |
القيود | - لا تدعم DML أو DDL. - محدودة بتقديم بيانات منطقية فقط (Deterministic). | - لا تدعم Parameters. - تتأثر قيود DML بطبيعة الاستعلام الأساسي للفيو. | لا توجد قيود تقريبًا: تدعم جميع العمليات، ولكن تنفيذها قد يؤثر على الأداء إذا كانت معقدة. |
متى تستخدم Stored Procedures؟
- عندما تحتاج إلى تنفيذ سلسلة من العمليات (مثل INSERT ثم UPDATE ثم SELECT).
- إذا كنت تحتاج إلى التعامل مع بيانات ديناميكية باستخدام Parameters متعددة.
- عند الحاجة لتجميع العمليات المعقدة في إجراء واحد لتقليل التكرار.
- إذا كنت تحتاج إلى تنفيذ أوامر DDL (مثل إنشاء جداول أو حذفها) أو DML بشكل مباشر.
الخلاصة:
- Functions: مناسبة للعمليات التي تحتاج إلى منطق ديناميكي ثابت يُعيد قيمة واحدة أو جدول بناءً على المدخلات.
- Views: مفيدة لعرض البيانات بشكل مبسط وإخفاء تعقيدات الاستعلامات، لكنها ثابتة ولا تدعم Parameters.
- Stored Procedures: الخيار الأكثر مرونة لتنفيذ عمليات معقدة على قواعد البيانات، تدعم DML وDDL، مع إمكانية قبول Parameters متعددة.
الخلاصة:
الـ Stored Procedures أداة قوية في SQL لإدارة العمليات المعقدة والتعامل مع جميع أنواع البيانات والعمليات داخل قواعد البيانات. تتميز بمرونتها ودعمها الكامل للـ Parameters وإمكانية تنفيذ أي نوع من العمليات (DQL, DML, DDL)، مما يجعلها الخيار المثالي للتطبيقات التي تحتاج إلى تنفيذ عمليات متكررة أو معقدة مع الحفاظ على الأداء.