w3school - trigger in sql server شرح



كيف يمكنني أن أفعل قبل المشغل المحدث مع خادم مزود؟ (6)

أنا أستخدم Sqlserver express ولا يمكنني فعله before updated المشغل. هل هناك طريقة أخرى للقيام بذلك؟


Answer #1

MSSQL لا يدعم BEFORE مشغلات. الأقرب لديك هو INSTEAD OF المشغلات ولكن سلوكهم يختلف عن سلوك المشغلات السابقة في MySQL.

يمكنك معرفة المزيد عنها here ، ولاحظ أن INSTEAD OF المشغلات "تحدد أن المشغل قد تم تنفيذه بدلاً من عبارة SQL المشغلة ، وبالتالي تجاوز تصرفات عبارات التشغيل." وبالتالي ، قد لا يتم تنفيذ الإجراءات المتعلقة بالتحديث إذا لم يتم كتابة / معالجة المشغل بشكل صحيح. تتأثر الإجراءات المتتالية أيضًا.

قد ترغب بدلاً من ذلك في استخدام طريقة مختلفة لما تحاول تحقيقه.


Answer #2

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


Answer #3

كافة المشغلات "العادية" في SQL Server هي مشغلات "AFTER ...". لا توجد مشغلات "قبل ...".

للقيام بشيء ما قبل التحديث ، تحقق من مشغلات التحديث .


Answer #4

لا يمكنك التأكد من تطبيق هذا على SQL Server Express ، ولكن لا يزال بإمكانك الوصول إلى البيانات "السابقة" حتى إذا كان المشغل يحدث بعد التحديث. تحتاج إلى قراءة البيانات من الجدول المحذوف أو المدرج الذي تم إنشاؤه على الطاير عندما يتم تغيير الجدول. هذا هو ما تقوله @ Stamen بشكل أساسي ، لكن ما زلت بحاجة لاستكشاف المزيد لفهم الإجابة (المفيدة!).

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

يخزن الجدول المدرج نسخًا من الصفوف المتأثرة أثناء عبارات INSERT و UPDATE. أثناء عملية إدراج أو تحديث ، تتم إضافة صفوف جديدة إلى كل من الجدول المدرج وجدول المشغل ...

https://msdn.microsoft.com/en-us/library/ms191300.aspx

بحيث يمكنك إنشاء المشغل لقراءة البيانات من أحد هذه الجداول ، على سبيل المثال

CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
  BEGIN
    INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
    SELECT <columns...>, getdate()
    FROM deleted;
  END;

مثالي قائم على المثال التالي:

http://www.seemoredata.com/en/showthread.php?134-Example-of-BEFORE-UPDATE-trigger-in-Sql-Server-good-for-Type-2-dimension-table-updates

sql-server triggers


Answer #5

مثال كامل:

CREATE TRIGGER [dbo].[trig_020_Original_010_010_Gamechanger]
   ON  [dbo].[T_Original]
   AFTER UPDATE
AS 
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @Old_Gamechanger int;
    DECLARE @New_Gamechanger int;

    -- Insert statements for trigger here
    SELECT @Old_Gamechanger = Gamechanger from DELETED;
    SELECT @New_Gamechanger = Gamechanger from INSERTED;

    IF @Old_Gamechanger != @New_Gamechanger

        BEGIN

            INSERT INTO [dbo].T_History(ChangeDate, Reason, Callcenter_ID, Old_Gamechanger, New_Gamechanger)
            SELECT GETDATE(), 'Time for a change', Callcenter_ID, @Old_Gamechanger, @New_Gamechanger
                FROM deleted
            ;

        END

END

Answer #6

يدعم T-SQL فقط بعد وبدلاً من المشغلات ، فإنه لا يتميز بوجود مشغل قبل ، كما هو موجود في بعض RDBMSs الأخرى.

أعتقد أنك سوف ترغب في استخدام بدلاً من الزناد.





sql-server-express