الزناد للإضافة. محفزات

28.03.2019

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

يتم إنشاء المشغلات بشكل منفصل لكل جدول وتقع في Object Explorer في المجلد "Triggers". لنقم بإنشاء مشغلات لجدول "المعلمين". سيكون مجلد "المشغلات" جزءًا من جدول "المعلمين":

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

دعونا نلقي نظرة على هيكل المشغلات:

1) نطاق اسم الوظيفة (Trigger_Name)؛

2) المنطقة التي توضح الجدول الذي يتم إنشاء المشغل له (Table_Name)؛

3) منطقة توضح متى يتم تنفيذ المشغل (INSERT - عند إنشاء سجل في الجدول، DELETE - عند الحذف وUPDATE - عند التغيير) وكيفية تنفيذه (ALTER - بعد تنفيذ العملية، بدلاً من - بدلاً من التنفيذ العملية)؛

4) يحتوي نص المشغل على أوامر لغة برمجة استعلام TSQL.

في نافذة المشغل الجديدة، أدخل الرمز:

إنشاء مشغل tr_add

على dbo.teachers

طباعة "تم إضافة إدخال جديد"

من الشكل يمكنك أن ترى أن مشغل "إضافة مؤشر" الذي تم إنشاؤه يتم تنفيذه بعد إضافة سجل (بعد الإدراج) إلى جدول "dbo.teachers" (ON dbo.teachers). بعد إضافة إدخال، سيعرض المشغل الرسالة "تمت إضافة إدخال جديد" (اطبع "تمت إضافة إدخال جديد"). لننفذ التعليمات البرمجية المكتوبة بالنقر فوق الزر الموجود على شريط الأدوات. ستظهر الرسالة "تم إكمال الأوامر (الأوامر) بنجاح" في الجزء السفلي من نافذة التعليمات البرمجية.

دعونا نتحقق من كيفية عمل المشغل الجديد. لنقم بإنشاء استعلام فارغ جديد واكتب الأمر التالي فيه لإضافة سجل جديد إلى جدول "dbo.teachers":

أدخل في dbo.teachers

"سيدوروف"

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

يتم إنشاء المشغلات مع UPDATE وDELETE بطريقة مماثلة.

التعيين: وفقامع الموضوع الخاص بك خلق فيSQLالخادمإدارةاستوديوالعروض (3-4)،الاستعلامات (3-4)، الإجراءات المخزنة (3-4)، الوظائف المحددة من قبل المستخدم (3-4)، المشغلات (INSERT،تحديثويمسح). استخدم العبارات الشرطية والحلقات عند إنشاء عوامل التشغيل.

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

الزناد يعمل دائما مع حاضِرتسجيل وتنفيذ إجراء محدد.

يمكن تنفيذ المشغلات قبل وقوع الحدث (parameter قبل)أو بعد وقوع حدث (المعلمة بعد).

تتميز المشغلات حسب اتجاه العمل:

  • إدراج -لإضافة إدخال؛
  • تحديث- لتحرير السجل؛
  • يمسح- لحذف السجل.

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

عند العمل مع المشغلات، ضع في اعتبارك ما يلي:

  • عند التراجع عن المعاملات، يتم التراجع عن جميع التغييرات التي تم إجراؤها بواسطة المشغلات؛
  • يتم تنفيذ التغييرات المتتالية وعمليات الحذف المتتالية في الجداول الفرعية بسهولة؛
  • تعمل التغييرات التي يتم إجراؤها على نص التشغيل تلقائيًا مع كل تطبيق عميل، أي ليست هناك حاجة لإبلاغ التغييرات التي تم إجراؤها إلى كل مستخدم.

يتم إنشاء المشغل وفقًا لقواعد إنشاء الإجراءات المخزنة، على الرغم من وجود بعض الميزات الخاصة.

إنشاء الزناد

لإنشاء مشغل، استخدم عامل التشغيل إنشاء الزناد.

تنسيق المشغل

إنشاء الزناد ل

[ نشيط | غير نشط ]

[ قبل|بعد]

[إدراج | تحديث حذف]

[ موضع ]

الغرض من الخيارات:

نشيط- المشغل نشط، أي عند الوصول إلى الجدول المحدد، يتم تنفيذ الإجراء المكتوب في لوحة المشغل

غير نشط- المشغل سلبي، أي يتم إنشاء المشغل وتخزينه على الخادم، ولكن عند الوصول إلى الجدول المحدد، لا يتم تنفيذ عنصر المشغل>؛

قبل- قبلوقوع حدث ما؛

بعد -يحدد زمن الاستجابة بعدوقوع حدث ما؛

إدراج -يحدد للمشغل حدث إضافة سجل إلى الجدول؛

تحديث -يحدد حدث تحرير سجل في الجدول للمشغل؛

يمسح -يحدد للمشغل حدث حذف سجل من الجدول؛

موضع -يحدد رقم (موضع) المشغل ضمن حدث تشغيل محدد (قبلأو بعد).

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

عند كتابة شاهدة الزناد> يمكنك استخدامها بالإضافة إلى ذلك الكلمات الدالة قديم(قبل الحدث) و جديد(بعد الحدث) متبوعًا باسم الحقل.

نظرًا لأنه في قاعدة البيانات البعيدة، يتم إجراء جميع التغييرات في الجداول (إضافة السجلات وتحريرها وحذفها) في عينات (في ذاكرة الوصول العشوائي)، على سبيل المثال، عند تغيير قيمة حقل، يمكنك الوصول إلى قيمة الحقل القديمة (قبل التغيير) - ObO.fieldname>، وقيمة الحقل الجديدة (بعد التغيير) - NEW-fieldname إذا لم يكن هناك تم إجراء تغيير على الحقل المحدد، ثم سيكون حقل ObO.chmb> مساويًا لحقول NEW.chmb

مثال 6.10.إنشاء الزناد.

قم بإنشاء TRIGGER T_COMPCODE للملحنين

نشط قبل إدراج الموضع 0

new.code_composer=gen_id(g_composers, 1); إذا كانت بيانات COMPOSERS.data المولودة ليست فارغة) فابدأ

new.actuallyage = (CAST("NOW" AS DATE)-COMPOSERS.data_born)/365; إذا (يوم COMPOSERS.data ليس فارغًا) ثم COM POSERS.age =(COMPOSERS.data_day-COMPOSERS.data Born) /365; else new.age=null; نهاية

يتم تشغيل المشغل قبل حدث إضافة سجل جديد ويحسب عمر الملحن. العمر المحسوب مكتوب في الحقل "actly_age».

تغيير الزناد

لتغيير المشغل، استخدم الأمر تغيير الزناد، الذي له تنسيق مماثل ومبدأ تشغيل مماثل للأمر تغيير الإجراءلتغيير نص الإجراء المخزن.

تنسيق الأوامر

تغيير الزناد ل [ نشيطأنا غير نشط

قبلأنا بعد

إدراجأنا تحديث حذف

[ موضع 1

بعد تنفيذ البيان تغيير الزناديتم استبدال تعريف المشغل القديم بالتعريف الجديد. لا يمكن استعادة تعريف المشغل القديم.

مثال 6.11.تحرير الزناد.

قم بتغيير رمز T_COMPCODE للملحنين النشطين قبل إدراج الموضع 5 AS

new.code_composer=gen_id(g_composers, 1); إذا (COMPOSERS.data_born ليس فارغًا) فابدأ

new.actually_age = (CAST("NOW" AS DATE)-COMPOSERS.data_born)/365; إذا (COM POSERS.dataday ليس فارغًا) ثم COM POSERS.age =

(COMPOSERS.data_day-COMPOSERS.data ولد) /365؛ else new.age=null; نهاية

وإلا ابدأ new.age=null; new.actually_age=null; نهاية النهاية

تم تعديل المشغل الذي تم إنشاؤه في المثال 6.10 ليشمل موضعًا جديدًا ( موضع) تفعيل الزناد - 5.

إزالة الزناد

لإزالة المشغل استخدم الأمر

مثال 6.12.إزالة الزناد.

قم بإسقاط الزناد T_COMPCODE

لا يمكن استعادة المشغل المحذوف.

استخدام الزناد في الإجراءات المتتالية

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

مثال 6.13.تتالي حذف السجلات.

عند إزالة اسم العائلة من الجدول الأصل GAMمن الضروري حذف الألقاب المقابلة (بواسطة مفاتيح اللقب)

li) في جميع الجداول الفرعية (في جدول المثال مؤلفو كتاب).

قم بإنشاء TRIGGER DEL FAM لـ FAM ACTIVE

حذف من المؤلف

حيث FAM.KEYFAM = المؤلف. كيفام؛ حذف من الكتاب

حيث FAM.KEY FAM = BOOK.KEY FAM؛

مثال 6.14.التحرير المتتالي للسجلات.

عندما تتغير قيمة الحقل الرئيسي (مفتاح العائلة)في الجدول الأصل مألوفتحتاج إلى تغيير قيم المفاتيح الخارجية المقابلة في جميع الجداول الفرعية (في المثال، جدولي AUTHOR وBOOK).

إنشاء TRIGGER UPD FAM لـ FAM ACTIVE

قبل التحديث AS

إذا (OLD.KEYFAM NEW.KEY FAM) فابدأ

تحديث مجموعة المؤلف KEY FAM = NEW.KEY FAM

أين مفتاح العائلة - OLD.KEY FAM؛ تحديث مجموعة الكتب KEYFAM - N EW. كيفام

WHERE KEY FAM = OLD.KEY FAM;

ميزات استخدام التأثيرات المتتالية:

  • عند التراجع عن المعاملات، يتم إرجاع جميع التغييرات التي تم إجراؤها بواسطة المشغلات إلى قيمها الأصلية؛
  • يمكن لمشغل واحد الوصول إلى جداول متعددة؛
  • يمكن الوصول إلى الزناد فقط حاضِرإدخالات الجدول، أي يمنع الانتقال إلى إدخالات جدول أخرى.

التأكد من صحة البيانات باستخدام الزناد

نظرًا لأن الجدول الواحد يمكن أن يحتوي على عدة مشغلات لحدث واحد (إضافة سجل أو تحريره أو حذفه)، فمن الممكن ضمان موثوقية البيانات المدخلة في الجدول. لإنشاء مشغل لضمان موثوقية البيانات، يتم استخدام عوامل التشغيل والكلمات الرئيسية بالإضافة إلى ذلك.

أ. التأكد من أن قيمة الحقل فريدة

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

مثال 6.15.ملء الحقل المفتاح الأساسي.

اكتب مشغل إضافة قيمة فريدةالمفتاح الأساسي كيفام.مولد كهرباء GFAMتم إنشاؤه بالفعل.

قم بإنشاء مشغل للإطار من أجل FAM

جديد. KEYFAM = GEN_ID(G_FAM, 1);

مثال 6.16.تعبئة حقل المعلومات.

إنشاء مشغل TCOMPDATE للملحنين

نشط قبل تحديث الموضع 0

إذا كانت بيانات COMPOSERS.data المولودة ليست فارغة) فابدأ

new.actually_age = (CAST("NOW" AS

التاريخ)-COMPOSERS.data_born)/365؛ إذا (يوم COMPOSERS.data ليس فارغًا) فإن COM POSERS.age =

(COM POSERS.data_day-COMPOSERS.data_born)/365؛ else new.age=null; نهاية

وإلا ابدأ new.age=null; new.actually_age=null; نهاية

في في هذا المثاليتم حساب عمر الشخص وتعبئة الحقل العمر في الواقع.

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

في قواعد البيانات البعيدة، من المهم بشكل خاص الاحتفاظ بسجل التغييرات في جداول قاعدة البيانات لتحديد مصدر البيانات السيئة. عند الاحتفاظ بسجل التغيير، يتم تسجيل ما يلي في جدول خاص:

  • تم تنفيذ الإجراء على الطاولة؛
  • قيمة الحقل الجديدة؛
  • قيمة الحقل القديم؛
  • تاريخ التغيير؛
  • الاسم الأخير والاسم الأول والعائلي للمستخدم (اسم المستخدم);
  • رقم محطة العمل (الاسم).

مثال 6.17.الإكمال التلقائي لسجل التدقيق.

قم بإنشاء TRIGGER AFTJNS_DOGS FOR DOGS ACTIVE بعد إدراج الموضع 0 عند البدء

أدخل في قيم السجل (act, table_name,record_id) ("INSERT"، "DOGS"، DOGS.ID)؛ نهاية

قم بإنشاء TRIGGER AFT_UPD_DOGS FOR DOGS ACTIVE بعد تحديث الموضع 0 عند البدء

أدخل في قيم السجل (act,table_name,record_id)('UPDATE',DOGS',DOGS.ID);

إنشاء الزناد بعد DEL DOGS للكلاب النشطة بعد حذف الموضع 0 AS

أدخل في قيم السجل (act,table_name,record_id)('DELETE','DOGS',DOGS.ID); نهاية

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

في SQL الخادمهناك نوعان من المشغلات:

    المشغلات التي يتم تنفيذها بعد حدث يقع في جدول (تناظري كامل لإجراءات الحدث في Visual Basic)؛

    يتم تنفيذ المشغلات بدلاً من حدوث حدث على الطاولة. في هذه الحالة، الحدث (إضافة أو تغيير أو حذف الإدخالات) لم يتم تنفيذه، ولكن تم تنفيذه بدلاً من ذلك أوامر SQLالمحدد داخل الزناد.

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

تعليق: يتم إنشاء المشغلات لجدول معين ويتم تنفيذها تلقائيًا في حالة حدوث حدث (إضافة أو تغيير أو تغيير) في الجدول الذي تم إنشاؤها من أجله. حذف الإدخالات).

لإنشاء مشغل في علامة تبويب الطلب الجديدة، تحتاج إلى كتابة الأمر CREATE مشغل، مع ما يلي بناء الجملة:

إنشاء الزناد<Имя триггера>

على<Имя таблицы>

ل

مثل<Команды SQL>

    اسم المشغل هو اسم المشغل المراد إنشاؤه.

    اسم الطاولة - اسم الطاولة، الذي تم إنشاء المشغل من أجله.

    إذا تم استخدام المعلمة AFTER، فسيتم تنفيذ المشغل بعد الحدث، وإذا تم استخدام المعلمة INSTEAD OF، فسيتم تنفيذه بدلاً من الحدث.

    تحدد معلمات INSERT وUPDATE وDELETE الحدث الذي يتم تنفيذ المشغل عليه (أو بدلاً منه).

    مع معلمة التشفير - مخصصة للتمكين تشفير البياناتفي تنفيذ الزناد.

    أوامر SQL هي أوامر SQL يتم تنفيذها عند تشغيل المشغل.

دعونا نلقي نظرة على أمثلة لإنشاء مشغلات مختلفة للجدول "طلاب".

مثال: يخلق مشغل "إضافة"، وظهور رسالة على الشاشة "تم إضافة السجل"عند إضافة سجل جديد إلى الجدول "طلاب"

إنشاء إضافة الزناد

على الطلاب

بعد الإدراج

AS PRINT "تمت إضافة السجل"

مثال: يخلق مشغل "يتغير" "تم تغيير الإدخال"في تغيير سجلفي الطاولة "طلاب"

إنشاء تغيير الزناد

على الطلاب

بعد التحديث

AS PRINT "تم تعديل السجل"

مثال: يخلق مشغل "يمسح"، وظهور رسالة على الشاشة "تم حذف السجل"عند حذف سجل من الجدول "طلاب"

إنشاء مشغل حذف

على الطلاب

بعد الحذف

AS PRINT "تم حذف السجل"

مثال: في هذا المثال، بدلاً من إزالة الطالب من الجدول "طلاب"يتم تنفيذ الكود بين BEGIN و END. وهو يتألف من أمرين DELETE. أولاً فريقيحذف كافة السجلات من الجدول "درجات"، والتي ترتبط بالسجلات من الجدول "طلاب". وهذا هو، الذين لديهم الدرجات.[رمز الطالب]يساوي رمز الطالب الذي تتم إزالته. ثم من الجدول "طلاب"تتم إزالة الطالب نفسه.

إنشاء مشغل إزالة الطالب

على الطلاب

بدلاً من الحذف

حذف التقييمات

أين تم الحذف.[رمز الطالب]=الدرجات.[رمز الطالب]

حذف الطلاب

أين تم الحذف.[رمز الطالب]=الطلاب.[رمز الطالب]

تعليق: هنا ليتم حذفها سِجِلّيُشار إليها بكلمة الخدمة المحذوفة.

تعليق: ليزود تكامل البياناتتُستخدم المشغلات عادةً مع الرسوم البيانية، لكن يمكننا استخدام هذه المشغلات بدون مخططات، لكن لا يمكننا استخدام المخططات بدون مشغلات.

سؤال: أحتاج إلى مشغل يقوم بتحديث جدول واحد عند إضافة سجل إلى آخر


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

لا أفهم على الإطلاق كيفية تنظيم كل هذا(

إجابة:عند إضافة (!) سجل إلى جدول "المنتج"، فإن هذا المشغل سيضيف +1 إلى جدول "الشركة المصنعة":

كود T-SQL

بالطبع، هذا لا يأخذ في الاعتبار أنه يمكن أيضًا تعديل الإدخال أو حذفه.
ملاحظة.
وأقصد هنا وجود حقل "ManufacturerID" في كلا الجدولين.

تمت إضافتها بعد 10 دقائق
عندي عدم دقة... الزناد الجديدليس "تغيير الزناد..." ولكن "إنشاء الزناد..." أنا آسف.

سؤال: كيف يمكنني إضافة سجل إلى جدولين في وقت واحد في مشغل؟


مرحبًا!! كيفية استخدام مشغل لإضافة سجل إلى جدولين في وقت واحد؟
يوجد جدول للطلاب وTableForTriggers، هيكل جدول TableForTriggers هو نفس هيكل جدول الطلاب، والفرق الوحيد هو أن هناك عمودًا آخر يُظهر فيه قيمة الإجراء للسجل - إدراج، تحديث ، يمسح.
هذا هو المشغل الخاص بي لإضافة سجل إلى جدول واحد فقط:

ولم يتم حفظ الزناد بعد، ماذا علي أن أفعل حيال ذلك؟

تمت إضافتها بعد 40 دقيقة
حفظ الزناد حل كل شيء

إجابة:

رسالة من باكبولوت

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

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

سؤال: إنشاء نموذج لإضافة سجلات متعددة إلى جدول


يوم جيدعزيزي مستخدمي المنتدى.
ربما يبدو السؤال مشابهًا للآخرين ومبتذلاً لشخص ما، لكني لا أعرف من أي جانب أتناوله.
ليست جيدة في الوصول
الوصف العام: قاعدة بيانات في مرحلة مبكرة تحتوي على 3 جداول:
1. المركبات - تحتوي على حقول تحتوي على معلومات عن السيارات
2. المعدات الموجودة على متن الطائرة - تحتوي على حقول تحتوي على معلومات حول المعدات الموجودة على متن الطائرة
3. وقت تشغيل وسائل النقل.
يحتوي جدول "ساعات التشغيل" على الحقول التالية: السنة، والشهر، ورقم المركبة، والمسافة المقطوعة، والاستهلاك، وما إلى ذلك.
يمكنك ملء هذا الجدول، في أبسط الإصدارات، إما يدويًا مباشرة في الجدول نفسه أو عن طريق الإنشاء نموذج بسيطاستنادا إلى هذا الجدول وملء إدخال واحد في كل مرة.
لقد بحثت في المنتديات ولم أجد حتى الاتجاه الذي أحفر فيه.
السؤال هو: هل من الممكن إنشاء نموذج لإضافة سجلات متعددة؟
أولئك. يرى المستخدم، بعد فتح النموذج، الحقول في الأعلى: "YEAR" و"MONTH". افتراضيًا، يتم تعيين قيم السنة والشهر من التاريخ الحالي، على التوالي.
تحت هذه الحقول يجب أن يكون هناك جدول بقائمة المركبات (من جدول "المركبات") ولكل منها عربةيجب أن يحتوي هذا الجدول على حقول حول المسافة المقطوعة والاستهلاك وما إلى ذلك، أي حقول فارغة تحتوي على معلومات حول ساعات العمل، جاهزة للملء.
يقوم المستخدم بتحديد الشهر المطلوب، وتعبئة بيانات ساعات التشغيل لكل مركبة، وبعد ملء هذه البيانات، يجب إنشاء السجلات المقابلة في جدول "ساعات التشغيل"، حيث يتم أخذ السنة والشهر من الحقول المنفصلة العلوية (مع قوائم منسدلة)، وبيانات ساعات التشغيل من الجداول على التوالي لكل جهاز.
في هذه اللحظةلا يتم النظر في مسألة تنظيم التحقق من وجود السجلات في قاعدة البيانات للفترة المحددة - بل يتم إضافتها ببساطة أو فرضها بصمت على القديم.
ملاحظة. ليس عليك أن تفعل ذلك من أجلي، فقط أشر لي في الاتجاه الصحيح.

إجابة:

رسالة من xopek160183

هل من الممكن تعيين نفس شرط التحديد بطريقة أو بأخرى بحيث يتم تنفيذ كلا الاستعلامين عند إدخال قيمة التحديد مرة واحدة؟

نعم، استخدم مربع التحرير والسرد في نموذج الاختيار، وقم بالإشارة إلى هذا الحقل في الطلب.
على سبيل المثال:

كود T-SQL
1 2 3 4 حدد TS.GOS№TS، ساعات التشغيل.[ عدد الكيلومترات (وقت التشغيل)]، [ وقت التشغيل للفترة].[ مجموع الأميال (وقت التشغيل) ]، وقت التشغيل شهر من [ وقت التشغيل للفترة] INNER JOIN (TC INNER JOIN وقت التشغيل ON TC. GOS#TS = ساعات التشغيل. [State TS#]) ON [ساعات التشغيل للفترة] .GOS#TS = ساعات التشغيل.[State TS#] GROUP BY TS.GOS#TS , ساعات التشغيل.[عدد الأميال (ساعات التشغيل)] , [ساعات التشغيل لفترة] .[ مجموع الأميال (ساعات) ], ساعات.شهر HAVING (((Operations.Month) = Forms! yourform! yourfieldlist) ) ;

سؤال: إضافة سجل إلى جدول بناءً على السجل الموجود


مرحبًا!
لقد بدأت للتو في تعلم PHP وMySQL وبالطبع لم ينجح كل شيء.
لدي طاولة مع من قبل المستخدمين المستخدمين، يحتوي على الحقول 1) المعرف (pk، ai)، 2) جميع أنواع الحقول الأخرى، 3) حقل الصفحة، حيث يتم كتابة المسار إلى صفحة المستخدم.
أريد عند إضافة سجل إلى الجدول، أن أقوم بملء جميع الحقول باستثناء المعرف والصفحة وأن يتم تكوين قيمة حقل الصفحة بناءً على حقل المعرف. أي، على سبيل المثال ID=1, ..., PAGE=/userpage.php?id=1.
أدرك أنني بحاجة إلى إنشاء مشغل لهذا الغرض، لكنه يعطيني خطأ (لا يمكن تحديث الجدول "مستخدمي" في الوظيفة/المشغل المخزن لأنه مستخدم بالفعل بواسطة العبارة التي استدعت هذه الوظيفة/المشغل المخزن.) عند الإضافة خط وبالطبع لا يعمل.

لأن كل شيء آخر تم إعداده بواسطة php my admin.
شكرا لأولئك الذين سيساعدون في تصحيح الخطأ.
الإصدارات - PHP 5.5، MySQL 5.5.

إجابة:أتساءل لماذا لن يتم ملء حقل المعرف عند تكوين حقل PAGE على أساسه؟ وهذا يعني أنه يجب إنشاء قيمة المعرف بطريقة ما وتخزينها في مكان ما.

سؤال: تشغيل استعلام لإضافة سجلات


أعضاء المنتدى، يوم جيد!

من فضلك قل لي كيف يمكنني تشغيل استعلام لإضافة سجلات إلى جدول.
بهذا الكود:

كود SQL
1 2 3 4 ) . SQL CurrentDb. تنفيذ stDocName END Sub

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

إذا لم تتمكن من إضافة كافة السجلات، فليكن! ليست هناك حاجة للإخراج إعلان(لا يمكن إضافة كافة الإدخالات...)

بهذا الكود:

كود SQL
1 2 3 نموذج فرعي خاص_Close() DoCmd. تشغيل SQL CurrentDb. تعريفات الاستعلام( "gryCtryktyra_Izd_Berxn_Yrov_Kop_Modyli") . SQL النهاية الفرعية

يقسم مرة واحدة (لا يمكن إضافة كافة السجلات...)
قل لي كيف يمكنني تنفيذ الطلب؟

إجابة: متحرك، شكرًا لك!
اسمحوا لي أن أشرح بمزيد من التفصيل: في البداية، يتم إدخال البيانات المتعلقة بكل وحدة من وحدات تعبئة المكونات في الجدول 1 (ويتم لصق رمز شريطي فردي عليها)
ثم يتم وضع كل من هذه الحزم في "الإيصال" - أي نسخها إلى الجدول 2 (باستخدام الاستعلام الموضح أعلاه)، يتم إنشاء حقل فريد في هذا الجدول (table_code1).
أولئك. لم يعد من الممكن نسخ السجلات التي تم نسخها بالفعل إلى الجدول 2 من الجدول 1 أثناء النسخ اللاحق.
الحل سيئ، فمن الأفضل أن يتم نسخ السجلات التي تم إدخالها حديثًا (في الجدول 1) والموجودة في النموذج 1
لم ينجح شيء ما بسرعة - من الضروري إنشاء وحدة نمطية، وجعل وظيفة هذه الوحدة شرط اختيار في الطلب.... (أي، ما نصحني به، وتم إنشاء الإجراءات المقابلة، بما فيهم أنت). لا يعمل الآن، سأحاول ذلك لاحقًا.

سؤال: هل من الممكن إنشاء مشغل لنسخ المعاملة؟


تكوين النسخ المتماثل للمعاملات.
لقد تحققت: مشغل FOR INSERT لجدول المشترك لا يعمل عند إضافة سجل من خلال هذا النسخ المتماثل.

سؤال: هل من الممكن تتبع إدراج سجل جديد في جدول مشترك من خلال النسخ المتماثل للمعاملات؟
شيء مثل:
إنشاء مشغل لإدراج النسخ المتماثل
- كيف افعلها؟

إجابة:وهذا صحيح - لقد قمت بإزالة المشغل من الناشر وعمل كل شيء كما ينبغي للمشترك. - شكرًا لك!
هناك شيء واحد لا زلت لا أفهمه:
لماذا، مع اثنين من المشغلات، زادت قيمة N المضافة على الناشر
عند الوصول للمشترك بتاريخ 1 وليس بتاريخ 2

سؤال: تفعيل تغيير قيمة حقل عند إضافة سجل إلى آخر جدول ماي إس كيو إل


أنا أعمل في phpMyAdmin

يا رفاق، هذه مشكلة. لا أفهم ما الأمر، لأن... أنا مستجد MySQL.

في الأساس، أحتاج إلى تغيير القيمة في عمود "عدد الكتب" في جدول "الكتب" عند إضافة سجل بيع جديد إلى جدول "البيع" - افعل كل شيء باستخدام TRIGGER

إنشاء جدول في حالة عدم وجود "كتب" (
`المؤلف` فارتشار(100) غير فارغة,
`الاسم` varchar(100) ليس فارغًا،
تاريخ "سنة النشر" ليس فارغًا،
`المعرف` int(11) ليس NULL AUTO_INCREMENT،
`الناشر` varchar(100) ليس فارغًا،
`عدد الكتب` int(11) ليس فارغًا،
`السعر` int(11) ليس فارغًا،
المفتاح الأساسي (`المعرف`)،

) المحرك=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

أدخل في `الكتب` (`المؤلف`، `العنوان`، `سنة النشر`، `المعرف`، `الناشر`، `عدد الكتب`، `السعر`) القيم("Feoktistov Leonid"، " موسوعة عظيمةعلم الفلك"، "01/01/2009"، 2، "روسمان برس"، 10، 310)؛
أدخل في `الكتب` (`المؤلف`، `العنوان`، `سنة النشر`، `المعرف`، `الناشر`، `عدد الكتب`، `السعر`) القيم ("إيار إلتيروس"، "أصداء الفضة" الرياح سوف - "،" 2009-01-01"، 3، "ألفا - كتاب"، 10، 735)؛
أدخل في "الكتب" ("المؤلف"، "العنوان"، "سنة النشر"، "المعرف"، "الناشر"، "عدد الكتب"، "السعر") القيم ("ليف نيكولاييفيتش تولستوي"، "الحرب والسلام" "، "01-01-1996"، 4، "المفردات"، 10، 1300)؛
أدخل في `الكتب` (`المؤلف`، `العنوان`، `سنة النشر`، `المعرف`، `الناشر`، `عدد الكتب`، `السعر`) القيم ("ميخائيل أفاناسيفيتش بولجاكوف"، "السيد و مارغريتا"، "01/01/2009"، 5، "AST"، 10، 185)؛

إنشاء جدول إذا لم يكن موجودًا "بيع" (
`BookID` int(11) ليس فارغًا،
`رقم كتاب عمل البائع` int(11) ليس فارغًا،
تاريخ "تاريخ البيع" ليس فارغًا،
`رقم التجارة` int(11) ليس فارغًا AUTO_INCREMENT،
`Sum` int(11) ليس فارغًا،
المفتاح الأساسي ("رقم المعاملة")،
المفتاح `معرف الكتاب` (`معرف الكتاب`)،
المفتاح `عدد البائعين في دفتر العمل` (`عدد البائعين في دفتر العمل`)،

) المحرك=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

أدخل في `البيع` (`معرف الكتب`، `رقم كتاب عمل البائعين`، `تاريخ البيع`، `رقم المعاملة`) VALUES(3, 70113047, "2016-01-01"، "");

المحدد |

لكل صف
يبدأ
تحديث "دليل 1". "الكتب".

WHERE `books`.`ID` = `sale`.`BooksID`;
نهاية؛

إذا قمت بذلك بطريقة تجعلني أكتب الخطأ "#1054 - عمود غير معروف "sale.BooksID" في "حيث الشرط" عند إضافة سجل إلى جدول "المبيعات".

-----
المحدد |
قم بإنشاء مشغل `update_knigi` بعد الإدراج في `manual1`.`sale`
لكل صف
يبدأ
تحديث "دليل 1". "الكتب".
SET `عدد الكتب` = (`عدد الكتب` - 1)
أين `الكتب`.`المعرف`؛
نهاية؛

إذا كان الأمر كذلك، فسيتم طرح القيم من جميع قيم "عدد الكتب".

لا أعرف ماذا أفعل، الرجاء المساعدة: s

إجابة:لماذا هذا العدد الكبير معلومات غير ضرورية؟ تم طرح السؤال بوضوح.
في مشغل befor_insert لجدول المبيعات، قم بتنفيذ الاستعلام:
تحديث مجموعة book_table number_of_books = number_of_books - NEW.number_of_books_sold حيث table_book.book_code = NEW.book_code

سؤال: تحديث مربع التحرير والسرد بعد إضافة إدخال إلى الجدول


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

إجابة:ليس لدي أي علاقة بوحدات الماكرو، لذلك لا أستطيع مساعدتك. ولكن في VBA سيكون الأمر على هذا النحو - راجع الكود الموجود على إجراء الزر في نموذج الإضافة

سؤال: القيمة الافتراضية هي وقت إضافة السجل


إذا قمت بوضع القيمة الافتراضية Now() في الحقل، فسيتم تعيين وقت الإضافة الإدخال السابق، أي. لا يتم تحديث القيمة عند إضافة سجل. إذا قمت بتعيين ماكرو لتغيير في حقل التعليمات البرمجية، فلن يحدث شيء. ماذا علي أن أفعل؟

إجابة: 14,

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

السؤال: الترقيم في استعلام واختيار السجلات استناداً إلى شروط الترقيم


مرحبًا! لا أستطيع حل المشكلة. يوجد استعلام يتم فيه تحديد السجلات بناءً على بعض الشروط. من الضروري أن يكون لهذا الطلب ترقيم مستقل للأسطر، أي. 1 2 3 4 5 6 إلخ. اعتمادا على عدد السجلات في الطلب.
ومن الضروري أيضًا تحديد السجلات الثلاثة الأولى فقط وفقًا للحالة.

إجابة:شكرًا جزيلاً! للقرار. الآن أخبرتني بكيفية اختيار أول 3 سجلات من الطلب.
كانت المهمة الرئيسية هي تحديد السجلات الثلاثة الأولى في الاستعلام. ليس من الضروري إنشاء حقل مرقم؛ كنت بحاجة إلى تحديد السجلات الثلاثة الأولى من الاستعلام بناءً على الشرط. افترضت أنه إذا قمت بتعيين شرط في حقل الترقيم حول اختيار السجلات<4 я выберу первые три записи в запросе, а вы мне подсказали как эту проблему решить гораздо проще SELECT top 3 * спасибо.

مشغلهو روتين فرعي مشابه لإجراء قاعدة البيانات، يتم استدعاؤه تلقائيًا بواسطة نظام إدارة قواعد البيانات (DBMS) عند تغيير أو حذف أو إضافة سجل في الجدول. لا يمكن الوصول إلى المشغلات من البرنامج، أو تمرير المعلمات إليها، أو تلقي النتائج منها. في أغلب الأحيان، يتم استخدام المشغلات للحفاظ على التكامل المرجعي والعمليات المتتالية في قاعدة البيانات. يتم أيضًا تنفيذ المواصفات المرجعية، التي تحدد إجراءات الحذف والتحديث المتتالية والتي يتم إنشاؤها عند الإعلان عن الجداول، من خلال المشغلات، ولكن نص هذه المشغلات غير قابل للتحرير.

الغرض من المشغلات

منع التغييرات (على سبيل المثال، منع تغيير الفواتير بعد إرسالها).
. تسجيل التغييرات (على سبيل المثال، الاحتفاظ بنسخ من البيانات القديمة).
. تدقيق التغييرات (على سبيل المثال، الاحتفاظ بسجل للمستخدمين والأدوار المشاركة في التغييرات).
. التقاط التغييرات (على سبيل المثال، التأكد من أن جميع التغييرات مؤرخة وفقًا لساعة الخادم، وليس ساعة العميل).
. تنفيذ قواعد العمل.
. النسخ المتماثل للبيانات (على سبيل المثال، تخزين سجل بجميع التغييرات التي سيتم إرسالها إلى قاعدة بيانات أخرى في إصدار لاحق).
. زيادة الإنتاجية (على سبيل المثال، تحديث الرصيد بعد كل تفاصيل المعاملة، لتسريع الاستعلامات).

الإعلان عن المحفزات

إنشاء الزناد {قبل|بعد} {حذف|إدراج|تحديث [ل ]} على مرجع {قديم {[صف]|طاولة [مثل] } جديد {الصف|الجدول} [مثل] }] [لكل {بيان|الصف [متى ]}]
[ابدأ الذرية]

[نهاية]

الكلمات الدالة

. قبل|بعد- وقت بدء التشغيل - قبل | بعد عملية التحديث.
. حذف|إدراج|تحديث= حدث الزناد.
. لكل صف- لكل سطر (مشغل الخط، ثم متى).
. لكل بيان- للفريق بأكمله (صالح بشكل افتراضي).
. مرجع– يسمح لك بتعيين ما يصل إلى 4 أسماء مستعارة إلى القديم و | أو خطوط جديدة و | أو الجداول التي يمكن الوصول إليها عن طريق المشغلات.

قيود الزناد

لا يمكن أن يحتوي نص المشغل على العبارات التالية:
. تعريف وحذف وتغيير كائنات قاعدة البيانات (الجداول والمجالات وما إلى ذلك)
. معالجة المعاملات (الالتزام، التراجع)
. الاتصالات وقطع الاتصال بقاعدة البيانات (الاتصال، قطع الاتصال)

ميزات التطبيق
. يتم تنفيذ المشغل بعد تطبيق جميع عمليات التحقق من السلامة (التصريحية) الأخرى ويكون مفيدًا عندما يكون معيار الاختبار معقدًا للغاية. إذا رفضت عمليات التحقق التصريحية عملية التحديث، فلن يتم تنفيذ المشغلات. يعمل المشغل في سياق المعاملة، لكن قيد FK لا يعمل.
. إذا تسبب المشغل في تعديل إضافي لجدوله الأساسي، فغالبًا لن يؤدي ذلك إلى تنفيذه العودي، ولكن يجب توضيح ذلك. في نظام إدارة قواعد البيانات خادم قاعدة البياناتيوفر 2005 القدرة على تحديد ما يصل إلى 255 مستوى من مستويات التكرار باستخدام الكلمة الأساسية OPTION (MAXRECURSIV 3).
. لا يتم عادةً تنفيذ المشغلات عند معالجة الأعمدة الثنائية الكبيرة (BLOBs).
. يجب أن نتذكر أنه عندما يتم تحديث البيانات، يقوم نظام إدارة قواعد البيانات تلقائيًا بإنشاء ما يسمى بالجداول الافتراضية المشغلة، والتي لها أسماء مختلفة في أنظمة إدارة قواعد البيانات المختلفة. في InterBase وOracle – هذه جديدة وقديمة. في SQL Server - تم إدراجه وحذفه. علاوة على ذلك، عندما تتغير البيانات، يتم إنشاء كليهما. تحتوي هذه الجداول على نفس عدد الأعمدة، بنفس الأسماء والمجالات مثل الجدول الذي يتم تحديثه. يوفر SQL Server 2005 DBMS القدرة على تحديد جدول، بما في ذلك جدول مؤقت، حيث يجب إدراج البيانات باستخدام OUTPUT Inserted.ID،... INTO @ الكلمة الأساسية.
. في عدد من أنظمة إدارة قواعد البيانات، يجوز الإعلان عن مشغلات لعدة إجراءات في وقت واحد. لتنفيذ ردود فعل مختلفة على إجراءات مختلفة، توفر Oracle مسندات للحذف والإدراج والتحديث، والتي تُرجع True لنوع التحديث المقابل.
. في Oracle DBMS، يمكنك تحديد قائمة الأعمدة (بعد التحديث) لمشغلات التحديث، والتي ستضمن استدعاء المشغل فقط عند تغيير قيم هذه الأعمدة فقط.
. يمكن الإعلان عن مشغلات متعددة لكل حدث مشغل (تحتوي Oracle على 12 مشغلًا لكل جدول) وعادةً ما يتم تحديد الترتيب الذي يتم إطلاقها به من خلال الترتيب الذي تم إنشاؤه به. في بعض أنظمة إدارة قواعد البيانات، مثل InterBase، يتم تحديد ترتيب بدء التشغيل باستخدام الكلمة الأساسية POSITION الإضافية. بشكل عام، يجب تنفيذ المشغلات لكل أمر أولاً، ثم لكل سطر.
. يمكن تضمين المشغلات داخل بعضها البعض. وبالتالي، يسمح SQL Server بـ 32 مستوى تداخل (يمكنك استخدام المتغير العام @@NextLevel لتحديد مستوى التداخل).

عيوب المشغلات

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

تحرير وحذف المشغلات

لإزالة أحد المشغلات، استخدم عبارة DROP TRIGGER
. لتغيير مشغل، استخدم عبارة ALTER TRIGGER....
. تعطيل المشغلات
في بعض الحالات، على سبيل المثال، أثناء التحميل المجمع، يجب تعطيل المشغلات. يوفر عدد من أنظمة إدارة قواعد البيانات (DBMS) إمكانيات مقابلة. في Oracle وSQL Server، تكون الكلمات الأساسية DISABLE|ENABLE، وفي InterBase INACTIVE|ACTIVE في عبارة ALTER TRIGGER.

مميزات الخوادم الصناعية

1) إنترباس/فايربيرد

إنشاء الزناد ل {نشط|غير نشط} {قبل|بعد} {إدراج|حذف|تحديث} [موضع ]
مثل [أعلن المتغير [()]]
يبدأ

نهاية

مثال:

قم بإنشاء TRIGGER BF_Del_Cust للعميل
نشط قبل حذف الموضع 1 AS
يبدأ
حذف من الطلبات حيث Orders.CNum=Customer.CNum;
نهاية؛

2) خادم SQL

إنشاء الزناد على [مع التشفير] {لـ|بعد|بدلاً من} {إدراج|تحديث|حذف}
مثل

استخدم B1؛
يذهب
قم بإنشاء مشغل InUpCust1 على العميل بعد الإدراج والتحديث
AS RAISEERROR("تم تغيير جدول العميل");

أنواع إضافية من المشغلات

يوفر Oracle وSQL Server القدرة على إنشاء مشغلات (استبدال) لطرق العرض التي لم يتم تحديثها. لهذا، يتم توفير الكلمات الرئيسية بدلاً من ذلك:

إنشاء مشغل بدلاً من إدراج باسم...

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

زناد التراجع