0Pricing
SQL Academy · درس

تدقيق الجداول باستخدام المشغلات

أنشئ سجل تدقيق باستخدام مشغلات AFTER INSERT/UPDATE/DELETE التي تكتب إلى جدول audit_log

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

لماذا التدقيق؟

تجيب سجلات التدقيق عن أسئلة «من غيّر ماذا ومتى». وهي مطلوبة للامتثال، مثل HIPAA وSOX وتحقيقات حق محو البيانات بموجب GDPR، كما تُستخدم في التحليل الجنائي للعمليات.

جدول التدقيق

يلتقط جدول مركزي واحد كل تغيير:

CREATE TABLE audit_log (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  user_name TEXT NOT NULL DEFAULT CURRENT_USER,
  table_name TEXT NOT NULL,
  action TEXT NOT NULL,             -- INSERT, UPDATE, DELETE
  row_id TEXT,
  old_data JSONB,
  new_data JSONB
);

دالة مشغّل التدقيق

دالة واحدة قابلة لإعادة الاستخدام عبر العديد من الجداول:

CREATE OR REPLACE FUNCTION audit_row()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO audit_log (table_name, action, row_id, old_data, new_data)
  VALUES (
    TG_TABLE_NAME,
    TG_OP,
    COALESCE(NEW.id::TEXT, OLD.id::TEXT),
    CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
    CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END
  );
  RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;

إرفاق المشغّل بالجداول

شغّلوا المشغّل بعد INSERT/UPDATE/DELETE:

CREATE TRIGGER trg_audit_users
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION audit_row();

to_jsonb(NEW)

تلتقط حيلة to_jsonb الصف بأكمله بطريقة عامة — من دون كتابة شيفرة لكل عمود. وتعمل مع أي جدول يحتوي على عمود id.

تتبّع المنفّذ

إذا كان التطبيق يعمل كمستخدم واحد لقاعدة البيانات، فلن يكون CURRENT_USER كافيًا. مرّروا مستخدم التطبيق عبر GUC للجلسة:

-- App sets:
SET LOCAL app.user_id = '42';

-- Trigger reads:
INSERT INTO audit_log (... actor_id ...) VALUES (..., current_setting('app.user_id', true)::BIGINT);

تدقيق أعمدة محددة

استخدموا عبارة WHEN الخاصة بالمشغّل للتدقيق الانتقائي:

CREATE TRIGGER trg_audit_role_change
AFTER UPDATE OF role ON users
FOR EACH ROW WHEN (OLD.role IS DISTINCT FROM NEW.role)
EXECUTE FUNCTION audit_role_change();

جداول تدقيق لكل جدول

بديل آخر: إنشاء جدول تدقيق واحد لكل جدول فعلي، مثل users_audit، بالمخطط نفسه مع بيانات التدقيق الوصفية. يكون الاستعلام أسهل، لكن صيانة DDL تصبح أكبر.

التدقيق للفروقات فقط

خزّنوا الأعمدة التي تغيّرت فقط:

INSERT INTO audit_log (table_name, action, changes)
VALUES (
  TG_TABLE_NAME, TG_OP,
  (SELECT jsonb_object_agg(key, value)
   FROM jsonb_each(to_jsonb(NEW))
   WHERE NEW.* IS DISTINCT FROM OLD.* AND to_jsonb(NEW)->key IS DISTINCT FROM to_jsonb(OLD)->key)
);

أداء جدول التدقيق

ينمو جدول التدقيق بسرعة في الأنظمة كثيرة الاستخدام. قسّموه إلى أقسام حسب الوقت:

CREATE TABLE audit_log (...) PARTITION BY RANGE (ts);
CREATE TABLE audit_log_2024_q1 PARTITION OF audit_log
  FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');

مقايضة الأداء

تكتب كل عملية insert/update/delete الآن صفًا ثانيًا. وفي الجداول التي تنفّذ عمليات كتابة كثيفة جدًا، قد يضاعف ذلك عمليات الإدخال والإخراج. اختبروا الأداء وراقبوه، ثم قرروا ما إذا كانت هذه المقايضة تستحق ذلك.

متى لا تستخدموا مشغلات قاعدة البيانات

إذا كنتم تحتاجون إلى التكامل مع ناقل أحداث، أو إلى وضع الأحداث في قائمة انتظار باستخدام NOTIFY أو LISTEN، أو إلى النسخ المنطقي / أدوات CDC مثل Debezium، فاستخدموا تلك البدائل بدلًا من المشغلات.

مراجعة

تُعد مشغلات التدقيق أبسط طريقة لالتقاط السجل التاريخي.

  • دالة عامة واحدة مع to_jsonb(NEW/OLD)
  • إرفاقها بكل جدول تتم مراجعته
  • تقسيم جداول التدقيق إلى أقسام حسب الوقت
  • تتبّع منفّذ التطبيق صراحةً عبر GUCs

تحقق سريع

داخل دالة مشغّل التدقيق، كيف تلتقطون الصف الجديد بصيغة JSONB بطريقة عامة؟

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

هل درس «تدقيق الجداول باستخدام المشغلات» مجاني؟

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

ماذا ستتعلم في «تدقيق الجداول باستخدام المشغلات»؟

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

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

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

كم من الوقت يستغرق درس «تدقيق الجداول باستخدام المشغلات»؟

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

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

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

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

  1. تشريح المشغلات: BEFORE/AFTER، وFOR EACH ROW
  2. أساسيات دوال PL/pgSQL
  3. كتل DO والتعليمات البرمجية المجهولة
  4. تدقيق الجداول باستخدام المشغلات
← العودة إلى SQL Academy