الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أيهما تفضل : الاستعلامات الديناميكية ام الاجرائيات المخزنة

استطلاع
بدأه sufian2020 في 9 مايو 2009 · 17 رد · 2,933 مشاهدة · في ADO.NET
مشاركة: واتساب X فيسبوك تيليجرام

مالذي تفضل sql الديناميكية ام الاجرائيات المخزنة

23 مشارك في التصويت

????? ????

??????????? ???????????8 صوت · 35%
?????????? ???????15 صوت · 65%
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

الرجاء من الاخوة الاعضاء المشاركة بابداء رائيهم حول موضوع الاجرائيات المخزنة والاستعلامات الديناميكية

رَبِّ أَوْزِعْنِي أَنْ أَشْكُرَ نِعْمَتَكَ الَّتِي أَنْعَمْتَ عَلَيَّ وَعَلَى وَالِدَيَّ وَأَنْ أَعْمَلَ صَالِحًا تَرْضَاهُ وَأَدْخِلْنِي بِرَحْمَتِكَ فِي عِبَادِكَ الصَّالِحِينَ

تلاوات خاشعة مؤثرة

#2

السلام عليكم ورحمة الله وبركاته

ممكن تكتبهم بالانجليزية يكون أفضل

المصطلحات العربية دي مشكلة في البرمجة

إذا أردت أن تـجـعـلـنـي سـعـيـداً ... فـعـلـمـنـي شـيـئـاً جـديـداً

#3

الاجرائيات المخزنة : Stored Procedures

الاستعلامات الديناميكية : هي استعلامات sql التي نستخدمها من داخل شيفرة لغة البرمجة مباشرة اي نرسل الاستعلام الى قاعدة البيانات عن طريق البرنامج.

رَبِّ أَوْزِعْنِي أَنْ أَشْكُرَ نِعْمَتَكَ الَّتِي أَنْعَمْتَ عَلَيَّ وَعَلَى وَالِدَيَّ وَأَنْ أَعْمَلَ صَالِحًا تَرْضَاهُ وَأَدْخِلْنِي بِرَحْمَتِكَ فِي عِبَادِكَ الصَّالِحِينَ

تلاوات خاشعة مؤثرة

#4

السلام عليكم ورحمة الله وبركاته

والله انا توقعت ان ده يكون قصدك ولكن فضلت انك تكتبهم احسن

--------------

بالطبع إن استخدام الـ Stored Procedures هو الأفضل والأسرع وذلك لعدة أسباب:

1- السيرفر لكي ينفذ الاستعلام يحتاج إلى ما يسمى بـ Excution Plan فعندما تقوم بعمل Stored Procedure فإنه يقوم بعمل هذه الخطة مباشرة وحفظها وعند التنفيذ يقوم بتنفيذ الأوامر مباشرة.

2- تقليل الترافيك الذي سيحدث على الشبكة ( خاص لو كانت قاعدة البيانات على سيرفر غير الذي عليه الموقع ).

3- التعامل مع المستخدم بصورة أفضل في حالة ادخال بيانات ضخمة, ففي الحالة العادية عندما تقوم بمحاولة تخزين صورة في قاعدة البيانات يتم تحويلها إلى character string وهذا يعني مضاعفة حجمها ثم اعادة تحويلها مرة أخرى إلى Binary لكي يتم تخزينها, أما في حالة Stored Procedures يمكنك حجز متغير من نوع Binary وترسل له الملف مباشرة وسيتم تخزينه في قاعدة البيانات دون الحاجة إلى تحويله وهذا ما يعني توفير الوقت و تخفيف الحمل على السيرفر.

4- توفير حماية أكبر عند ادخال او التعديل على البيانات مما يوفر أمان أكثر لمدير قاعدة البيانات.

5- يمكنك التعديل على الـ Stored Procedures بسهولة وبسرعة دون الحاجة للتعديل على برنامجك مع مراعاة أسماء المتغيرات.

أما عندما تقوم بتنفيذ جملة السيكوال من داخل برنامجك:

السيرفر يقوم بعمل Excution Plan أولا ثم يقوم بتنفيذ الاستعلام المطلوب

تفقد كل المميزات التي ذكرناها بالأعلى وبالتالي فإن المقارنة تحسم لصالح الـ Stored Procedure

----------------------

ملاحظة:

الـ Excution Plan هي عملية يتم فيها التأكد من وجود الجدول\ الجداول التي سيتم التعامل معها

والتأكد من وجود الحقول ثم التأكد من أن الحقول لها نفس الـ Data Type التي سيتم ادخالها...الخ

فإذا كانت جاهزة يتم التنفيذ مباشرة دون الحاجة لعملها من جديد وهذا ما يتوفر مع الـ Stored Procedures دون غيره.

=================================

أرجوا أن أكون أضفت شئ وهذه معلومات بسيطة حيث أنني لم أقم بدراسة الـ SQL Server بتعمق وطبعا خبراء السيكوال سيرفر يقدروا يفيدونا أكتر

تمنياتي بالتوفيق

ولا تنسونا من الدعاء

إذا أردت أن تـجـعـلـنـي سـعـيـداً ... فـعـلـمـنـي شـيـئـاً جـديـداً

#5

يعتمد الموضوع على طبيعة المشروع.

و لكنني شخصياً، و بشكل عام، أفضل الاستعلامات الديناميكية. إيجابياتها:

1. المرونة. يمكنني تشكيل الاستعلام حسب حاجتي من داخل الكود "عالطاير". و هذا موضوع مفيد، بالذات في المشاريع "المفتوحة المواصفات".

2. سهولة الصيانة. الكود يكون كله في مكان واحد مركزي. قد لا تمثل هذه مشكلة في المشاريع الصغيرة، و لكن في المشاريع الكبيرة تناثر الكود في أكثر من مكان يصعب عملية الصيانة و التوثيق.

3. سهولة الإنتقال إلى قاعدة بيانات أخرى. تغيير الاستعلامات الدينماكية أسهل بكثير من تغيير الإجراءات المخزنة في حالة انتقلنا من SQL Server إلى Oracle مثلاً.

نعم ستكون أبطأ من الإجراءات المخزنة، و لكن ليس كثيراً حسب تجاربي. و في رأيي هذا البطء هو ثمن زهيد مقابل المرونة الكبيرة التي أحصل عليها من الاستعلامات الديناميكية.

#6

السلام عليكم :

أخي System Down بالنسبة لسهولة الصيانة فأن الاجرائيات المخزنة أفضل بكثير وذلك لان يتم فصل شيفرة البرنامج عن طبقة البيانات وبذلك تصبح عملية التطوير اسهل وتقل الثغرات وبالنسبة للسرعة فهناك فرق شاسع بينهم .

رَبِّ أَوْزِعْنِي أَنْ أَشْكُرَ نِعْمَتَكَ الَّتِي أَنْعَمْتَ عَلَيَّ وَعَلَى وَالِدَيَّ وَأَنْ أَعْمَلَ صَالِحًا تَرْضَاهُ وَأَدْخِلْنِي بِرَحْمَتِكَ فِي عِبَادِكَ الصَّالِحِينَ

تلاوات خاشعة مؤثرة

#7

سبب قولي أن الاستعلامات الديناميكية أسهل في الصيانة يتلخص في هذه النقاط:

1. تعدد اللغات يصعب الصيانة. يجب عليك أن تعرف كلاً من #C (مثلاً) و T-SQL بكفاءة جيدة. و ليس أنت فقط بل كامل فريقك، بما فيه فريق الصيانة و الإختبار. تباين الكفاءة بين اللغات يؤدي أيضاً إلى تباين الجودة بين الأجزاء. لهذا السبب لا تجد الكثير من مشاريع الدوت نت يخلط بين كود #C وكود VB.NET في نفس المشروع رغم أن هذا نظرياً ممكن.

2. تتبع الأخطاء يصبح أصعب عندما تتعامل مع أكثر من بيئة. لنقل أنك استطعت تعلم تتبع الأخطاء بين Visual Studio و SQL Server الذي هو سهل (نسبياً) كون المنتجين مترابطين. و لكن ماذا لو انتقلنا إلى أوراكل؟

3. ميزة فصل كود الداتابيس عن الأكواد الأخرى ليس حكراً على الإجراءات المخزنة. يمكنني وضع أكواد الداتابيس في مشروع لوحده (و هو بالفعل الإجراء المنصوح به).

لهذه الأسباب تجد أن مديري المشاريع (أي مشاريع في الواقع، ليس البرمجة فقط) يفضلون الـHomogenous Environment، أو البيئة المتماثلة، في جميع أجزاء المشروع قدر الإمكان. هذا للتقليل من عناء "الترجمة" بين الأجزاء المختلفة البيئة.

#9

نقاش مفيد فعلا

شخصيا افضل الاستعلامات الديناميكية حيث انها تكون واضحة مباشرة امام المبرمج او المطور وبالتالي يمكن التعديل مباشرة دون الحاجة الى التعديل الاجراء من قاعدة البيانات ومن ثم العودة الى الكود ...

ورغم ذلك فانا اقر ان الاجراءات المخزنة اسرع بكثير خاصة عندما يكون مطلوب جلب كمية كبيرة من البيانات

#10

ثمة شئ لم تتنبه إليه

أن من اكبر عيوب الجمع بين الT-sql و الكود الخاص بك أنك بذلك جعلت قاعدة البيانات التى تتعامل معها حكرا عليك و لن يستطيع أن يتعامل معها أى أحد بعدك

علاوة على أنه يجب أن أبنى كافة الإستعلامات من جديد لو أنه تم الإنتقال إلى مطور أخر لكونه لن يستطيع أن يصل إلى الشيفرة المصدرية الخاصة بك

ثانيا

إن خلط الإثنين معا يؤدى إلى صعوبة شديدة جدا أثناء الصيانة و خصوصا لو أن بيئة العمل بها متخصصون

يعنى أنا مثلا كمطور سوف أطلب من متخصص الsqlServer أن يبنى لى إجراء يفعل كذا و يعطينى اسمه

كل الذى على أن أقوم بإستخدامه كما لو أننى أستدى دالة

يعنى استفدت من ال encapsulation الذى توفر لى فى الstored Pro

ثانيا سوف تكون قاعدة البيانات portable كل ما يخصها معها و لن تكون متناثرة و هذا يضمن إمكانية العمل بدون التوقف و الإنتظار من أجل الأجزاء الباقية

عموما أنا عملت بالأسلوبين و لم أقتنع بالأول و وجدت الثانى أفضل بكثير من الناحية العملية أثناء التطوير

لا إله إلا الله محمد رسول الله

アッラー以外に神はなし。ムハンマドはアッラーの使徒である

#11
اقتباس
سهولة الإنتقال إلى قاعدة بيانات أخرى. تغيير الاستعلامات الدينماكية أسهل بكثير من تغيير الإجراءات المخزنة في حالة انتقلنا من SQL Server إلى Oracle مثلاً.

و ماذا لو طلب منك ان تقوم بعمل تطبيق يستخدم MS SQL Server و نفس التطبيق و لكنه يعمل على Oracle ؟

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#12
طارق إبراهيم كتب:
و ماذا لو طلب منك ان تقوم بعمل تطبيق يستخدم MS SQL Server و نفس التطبيق و لكنه يعمل على Oracle ؟

عندها يصبح الموضوع شائكاً نوعاً ما و لكن غير مستحيل. ما قمت به في مشروع سابق هو عمل interface موحد.

أولاً ستكون الدوال الأساسية تعتمد على الكائنات الأب في الـADO.NET أي تستخدم الإنترفيس IDbConnection بدلاً من SQLConnection و OracleConnection ... إلخ.

ثانياً تكون الأوامر SQL قياسي بقدر الإمكان. في حالة عدم إمكانية ذلك، فلا مجال سوى استخدام الـstored procedures.

#13

أفضل أن أستخدم

stored procedures

وقد ذكر الأخوان الإجابيات لا داعي للتكرار

اقتباس
و ماذا لو طلب منك ان تقوم بعمل تطبيق يستخدم MS SQL Server و نفس التطبيق و لكنه يعمل على Oracle ؟

لم أفهم الفكرة وما علاقتها ب stored procedures

لكن

في N-tire

يمكننا تخصيص layer لستقبال stored procedures أو بمعنى الأتصال مع الداتا بيس

أين كان نوعها

أم تقصد طريقه أخرى ؟

تعلم فليس المرء يولد عالماً------ وليس أخو علماً كمن هو جاهلا

العلم نور وجمال يقتبس--------------- صاحبه مكرم اين ما جلس

من فاته العلم ساعة تظعظع ونتكس----شتان شتان بين حمار وفرس

#14

اذا لم تكن تحتاج الى استخدام غير نوع قواعد بيانات واحد فقط - وهي الحالة التي اعتقد انها الاكثر شيوعا - فاستخدام Stored Procedures سيكون افضل للأسباب التي ذكرها احد الاخوة في بداية الموضوع ، اما في الحالة الاخرى عندما ترغب في جعل برنامجك قد يعمل مع اي نوع فعندها استخدام الاستعلاامات الديناميكية ، الاهم في الموضوع ان تستخدم الباراميترات ؛Parameters ولا ترسل القيم مباشرة من متغيرات او كائنات لديك حتى لا تتسبب في ثغرات امنية كـ SQLInjection وهي نقطة يتجاهلها الكثيرون ممن رأيت .

#15

الإستخدام الصحيح للاستعلامات الديناميكية (مثل استخدام البرامترز) يمنع مشكلة الsql injection

#16

افضل مميزات ال Stored Procedures هى ال Server Side Caching و سهولة الادارة Ease Of Administration و ال Optimization و الامان فى تمرير المتغيرات

عند إنشاء تطبيق توده يعمل مع MS SQL Server و Oracle فبإمكانك توحيد اسماء ال Stored Procedures و المعاملات المستخدمه و استخدام ال DB Provider Factory لاختيار محرك قواعد البيانات الذى ستتعامل معه و الاوامر الخاصة بال CRUD Operations (ربما تواجه مشاكل مع ال Dynamic Query لان اوامر ال SQL قد تختلف تبعاً لمحركات قواعد البيانات و لا تتماشى مع ال SQL92 حيث ان كل شركة لها ال Implementation الخاص بها و الذى قد يختلف عن ال SQL92)

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#17

بأختصار شديد

أنا أتفق مع القول أن Stored Procedures أفضل

لكن ليس معنا ذلك أنى لا أستخدم Dynamic Query

***********

لا توجد مشكلة في Stored Procedures عندما نستخدم عدة محركات قواعد بيانات في المشروع الواحد

مجرد تعريف و توحيد كل شيء على أساس Object و بربتيز

وتوحيد أسماء Stored Procedures في كلا القاعدتين

وعيدكم مبارك ( مع أنها متأخرة قليلا )

تعلم فليس المرء يولد عالماً------ وليس أخو علماً كمن هو جاهلا

العلم نور وجمال يقتبس--------------- صاحبه مكرم اين ما جلس

من فاته العلم ساعة تظعظع ونتكس----شتان شتان بين حمار وفرس

#18

أرى ان الاستعلامات الديناميكية سهلة وآمنة وسريعة في نفس الوقت

وخصوصا عند التعامل مع الـ n-Tire فهي الأفضل .. طبعا اقصد هنا الـ Entity Framework ففكرة مايكروسوفت من الجيل الجديد للوصول لقواعد البيانات (EF) هو تجريد الكود لاستهداف قاعدة البيانات مباشرة

والتعامل مباشرة مع الـ (Business Logic) او (C-Space)عن طريق لغة LINQ او eSQL ومن ثم هناك Dynamic Layer يقوم بتحويل كل ما تكتبه الى لغة SQL تستهدف قاعدة البيانات بالتعامل مع الـ Provider الخاص بقاعدة البيانات

ومن هنا نستطيع بناء برنامج كامل من الألف للياء بدون كتابة سطر واحد بإستخدام الـ SQL

وكذلك تستطيع استخدام نفس البرنامج مع قاعدة بيانات Oracle او MS SQL فقط بتغير الـ Connection String

انصحكم بالانتقال الى الجيل الجديد من التعامل مع البيانات بإستخدام EF مع العلم انه لا يدعم الاكسس بسبب ان الأكسس ليس له Provider خاص به.

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…