كيفية منع حذف الصف الأول في الجدول (PostgreSQL)؟

StackOverflow https://stackoverflow.com/questions/810180

  •  03-07-2019
  •  | 
  •  

سؤال

هل من الممكن منع حذف الصف الأول في الجدول من جانب PostgreSQL؟

لدي جدول فئات وأريد منع حذف الفئة الافتراضية لأنها قد تؤدي إلى تعطيل التطبيق.بالطبع يمكنني القيام بذلك بسهولة في كود التطبيق، ولكن سيكون من الأفضل كثيرًا القيام بذلك في قاعدة البيانات.

أعتقد أن الأمر يتعلق بقواعد بيان الحذف، لكن لم أتمكن من العثور على أي شيء قريب من مشكلتي عن بعد في التوثيق.

هل كانت مفيدة؟

المحلول

وأفضل وسيلة أرى لتحقيق ذلك هو عن طريق إنشاء مشغل حذف في هذا الجدول. في الأساس، سيكون لديك لكتابة الإجراء المخزن للتأكد من أن هذه الفئة 'الافتراضية' سيكون موجودا دائما، ومن ثم تطبيقه باستخدام الزناد ON الحدث DELETE في هذا الجدول. وهناك طريقة جيدة للقيام بذلك هي إنشاء مشغل في الصف من شأنها أن تضمن على الأحداث DELETE لن يتم حذف الصف فئة "الافتراضي".

يرجى التحقق من الوثائق كيو حول المشغلات والإجراءات المخزنة:

http://www.postgresql.org/docs/8.3 /interactive/trigger-definition.html

http://www.postgresql.org/docs/8.3/interactive /plpgsql.html

وهناك أيضا أمثلة قيمة في هذا الويكي:

http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example

نصائح أخرى

ولقد كنت محقا في التفكير في نظام القواعد. هنا وصلة لمثال مطابقة مشكلتك. انها حتى أبسط من المشغلات:

create rule protect_first_entry_update as
  on update to your_table
  where old.id = your_id
  do instead nothing;
create rule protect_first_entry_delete as
  on delete to your_table
  where old.id = your_id
  do instead nothing;

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

تريد تحديد "قبل الحذف". مشغل على الطاولة.عند محاولة حذف الصف (إما مطابقته بواسطة PK أو الحصول على عمود منطقي منفصل "للحماية")، يرفع استثناء.

لست على دراية ببناء جملة PostgreSQL، لكن يبدو هذه هي الطريقة التي ستفعل بها ذلك:

CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
    BEGIN            
        IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
            RAISE EXCEPTION 'cannot delete default category';
        END IF;

    END;
$check_del_cat$ LANGUAGE plpgsql;

CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
    FOR EACH ROW EXECUTE PROCEDURE check_del_cat();

هل يمكن أن يكون صف في جدول (يسمى التخلف) أخرى الرجوع إلى الفئة الافتراضية. ان القيد FK تدع حذف الفئة الافتراضية يحدث.

ونضع في اعتبارنا كيف يؤدي العمل. وسوف النار قبالة لكل صف وبيان الحذف الخاص حذف. هذا لا يعني أنك يجب عدم استخدام مشغلات فقط تضع ذلك في الاعتبار، والأهم من ذلك اختبار سيناريوهات الاستخدام الخاصة بك والتأكد من أداء يلبي المتطلبات.

هل يجب استخدام قاعدة أو مشغل؟

ومن مستندات رسمية: "وبالنسبة للأشياء التي يمكن تنفيذها من قبل كل من، الذي هو أفضل يعتمد على استخدام قاعدة البيانات. يتم تشغيل فجرت أي صف المتضررين مرة واحدة. وهناك قاعدة تتلاعب الاستعلام أو يولد استعلام إضافية. لذلك إذا تأثرت العديد من الصفوف في بيان واحد، قاعدة إصدار أمر إضافي واحد من المرجح أن تكون أسرع من الزناد الذي يسمى لكل صف واحد ويجب تنفيذ عملياتها مرات عديدة. ومع ذلك، فإن نهج الزناد هو المفهوم أبسط بكثير من نهج القاعدة، وأسهل ل المبتدئين للحصول على حق ".

وانظر مستندات للحصول على التفاصيل.
http://www.postgresql.org/docs/8.3/interactive/ قواعد triggers.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top