0Pricing
SQL Academy · درس

العروض القابلة للتحديث ومشغلات INSTEAD OF

اجعل العروض قابلة للتحديث مباشرة، أو استخدم مشغلات INSTEAD OF عندما يجمع العرض البيانات أو يربطها

العروض القابلة للتحديث ومشغلات INSTEAD OF درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

العروض القابلة للتحديث تلقائيًا

يجعل PostgreSQL العروض البسيطة قابلة للتحديث تلقائيًا. ويُعاد كتابة INSERT/UPDATE/DELETE على العرض بوصفه العملية نفسها على الجدول الأساسي:

CREATE VIEW active_users AS
  SELECT id, email, full_name FROM users WHERE deleted_at IS NULL;

UPDATE active_users SET full_name = 'Alice' WHERE id = 1;
-- Translates to UPDATE on the users table.

متطلبات التحديث التلقائي

يجب أن يستوفي العرض الشروط التالية:

  • الإشارة إلى جدول أساسي واحد بالضبط
  • ألا يحتوي على تجميعات أو GROUP BY أو HAVING أو DISTINCT
  • ألا يحتوي على LIMIT أو OFFSET
  • ألا يحتوي على عمليات مجموعات، مثل UNION وغيرها
  • ربط الأعمدة مباشرةً، من دون تعبيرات في قائمة SELECT — أو باستخدام بعضها فقط

WITH CHECK OPTION

امنعوا عمليات الكتابة التي قد تنشئ صفوفًا غير مرئية في العرض:

CREATE VIEW active_users AS
  SELECT * FROM users WHERE deleted_at IS NULL
  WITH CHECK OPTION;

INSERT INTO active_users (email, deleted_at) VALUES (..., NOW());
-- ERROR — would create a row outside the view's WHERE.

العروض المعقدة تحتاج إلى INSTEAD OF

لا تكون العروض التي تحتوي على عمليات ضم أو تجميعات أو تعبيرات قابلة للتحديث تلقائيًا. ويجب أن تكتبوا مشغّل INSTEAD OF يحدّد معنى عملية الكتابة:

CREATE VIEW user_with_address AS
  SELECT u.id, u.email, a.city, a.country
  FROM users u JOIN addresses a ON a.user_id = u.id;

CREATE TRIGGER user_addr_update
INSTEAD OF UPDATE ON user_with_address
FOR EACH ROW EXECUTE FUNCTION update_user_addr();

دالة مشغّل INSTEAD OF

تحدّد الدالة الجداول الأساسية التي ستُجرى عليها الكتابة:

CREATE FUNCTION update_user_addr() RETURNS TRIGGER AS $$
BEGIN
  UPDATE users SET email = NEW.email WHERE id = NEW.id;
  UPDATE addresses SET city = NEW.city, country = NEW.country WHERE user_id = NEW.id;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

متى يتفوّق INSTEAD OF على منطق التطبيق

إذا كان العديد من المستهلكين يحدّثون العرض، فإن تركيز منطق التحديث في مشغّل يضمن الاتساق. أما إذا كان تطبيق واحد فقط هو الذي يجري التحديث، فأبقوا المنطق في شيفرة التطبيق.

SECURITY BARRIER

امنعوا المخطِّط من تمرير شروط التصفية إلى مستهلكي العرض غير الموثوقين، مما قد يؤدي إلى تسريب المعلومات عبر التكلفة:

CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);

أمان الصفوف كبديل

يدعم PostgreSQL الحديث أيضًا أمان الصفوف (RLS) على الجداول الأساسية — وغالبًا ما يكون ذلك أوضح من إنشاء عروض الأمان.

ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());

العروض العودية

يدعم PostgreSQL العروض العودية، أي التسلسل الهرمي الذي يمكنكم تنفيذ SELECT عليه:

CREATE RECURSIVE VIEW tree (id, parent_id, depth) AS
  SELECT id, parent_id, 0 FROM nodes WHERE parent_id IS NULL
  UNION ALL
  SELECT n.id, n.parent_id, t.depth + 1
  FROM nodes n JOIN tree t ON n.parent_id = t.id;

الصلاحيات

امنحوا الصلاحية على العرض، لا على الجداول الأساسية:

GRANT SELECT, UPDATE ON active_users TO app_user;

ملاحظة حول الأداء

يُنفّذ مشغّل INSTEAD OF مرة لكل صف. لذلك يكون بطيئًا عند تنفيذ DML جماعي. وغالبًا ما يكون من الأفضل أن تكتب الجهات المستدعية مباشرةً إلى الجداول الأساسية.

مراجعة

يمكن أن تكون العروض قابلة للكتابة.

  • العروض البسيطة: قابلة للتحديث تلقائيًا
  • العروض المعقدة: تحتاج إلى مشغلات INSTEAD OF
  • يفرض WITH CHECK OPTION بقاء الصفوف مرئية
  • غالبًا ما يكون RLS نموذجًا أمنيًا أوضح

تحقق سريع

عرّفتم عرضًا يضم جدولين. هل يمكنكم تنفيذ UPDATE من خلاله افتراضيًا؟

الأسئلة الشائعة

هل درس «العروض القابلة للتحديث ومشغلات INSTEAD OF» مجاني؟

نعم — نص درس «العروض القابلة للتحديث ومشغلات INSTEAD OF» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «العروض القابلة للتحديث ومشغلات INSTEAD OF»؟

اجعل العروض قابلة للتحديث مباشرة، أو استخدم مشغلات INSTEAD OF عندما يجمع العرض البيانات أو يربطها تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «العروض القابلة للتحديث ومشغلات INSTEAD OF»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. العروض العادية: إعادة الاستخدام المنطقية
  2. العروض القابلة للتحديث ومشغلات INSTEAD OF
  3. العروض المادية واستراتيجيات REFRESH
  4. متى يجب التجميع المسبق
← العودة إلى SQL Academy