SQL Server 2005 السيارات تحديث التاريخ والوقت عمود - LastUpdated

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

سؤال

لدي جدول (انظر التعليمات البرمجية المتكررة أدناه).كيف يمكنني إضافة قيد أو أيا كان بحيث LastUpdate عمود يتم تحديثها تلقائيا في أي وقت الصف تغير ؟

CREATE TABLE dbo.Profiles
(
        UserName                                varchar(100)            NOT NULL,
        LastUpdate                              datetime                NOT NULL  CONSTRAINT DF_Profiles_LastUpdate DEFAULT (getdate()),
        FullName                                varchar(50)             NOT NULL,
        Birthdate                               smalldatetime           NULL,
        PageSize                                int                     NOT NULL CONSTRAINT DF_Profiles_PageSize DEFAULT ((10)),
        CONSTRAINT PK_Profiles PRIMARY KEY CLUSTERED (UserName ASC),
        CONSTRAINT FK_Profils_Users FOREIGN KEY (UserName) REFERENCES dbo.Users (UserName) ON UPDATE CASCADE ON DELETE CASCADE  
)
هل كانت مفيدة؟

المحلول

افتراضي القيد يعمل فقط على إدراجات ؛ للحصول على تحديث استخدام الزناد.

نصائح أخرى

وأنا أتفق مع الآخرين-تعيين قيمة افتراضية GetDate() على LastUpdate عمود ثم استخدام الزناد للتعامل مع أي تحديثات.

مجرد شيء بسيط مثل هذا:

CREATE TRIGGER KeepUpdated on Profiles
FOR UPDATE, INSERT AS 
UPDATE dbo.Profiles 
SET LastUpdate = GetDate()
WHERE Username IN (SELECT Username FROM inserted)

إذا كنت ترغب في الحصول على حقا الهوى ، يكون ذلك تقييم ما يجري تغيير مقابل ما في قاعدة البيانات فقط تعديل LastUpdate إذا كان هناك فرق.

النظر في هذا...

  • الساعة 7 صباحا - المستخدم 'jsmith' يتم إنشاؤه مع اسم آخر من 'Smithe' (عفوا), LastUpdate التخلف إلى الساعة 7 صباحا

  • الساعة 8 صباحا - 'jsmith' رسائل البريد الإلكتروني أن نقول له اسم غير صحيح.لك على الفور إجراء التحديث ، لذلك الاسم الأخير هو الآن 'Smith' و (بفضل الزناد) LastUpdate يظهر الساعة 8 صباحا

  • 2 - الخاص بك المتهرب زميل أخيرا يحصل بالملل مع StumbleUpon و التحقق من البريد الإلكتروني.يرى في وقت سابق رسالة من 'jsmith بخصوص تغيير الاسم.إنه يعمل: تحديث ملفات تعريف مجموعة LastName='Smith' WHERE Username='jsmith' ثم يذهب العودة إلى تصفح الإنترنت ماي سبيس.الزناد لا يهمني أن الاسم الأخير تم بالفعل 'Smith' ، ومع ذلك ، حتى LastUpdate يظهر الآن الساعة 2 ظهرا.

إذا كنت مجرد عمياء تغيير LastUpdate كلما تحديث بيان يدير انها صحيحة من الناحية الفنية لأن التحديث لم يحدث, ولكن ربما من المنطقي أن في الواقع مقارنة التغييرات والتصرف وفقا لذلك.هذا الطريق ، 2 التحديث بيان زميل العمل سوف لا تزال تعمل ، ولكن LastUpdate سوف لا تزال تظهر الساعة 8 صباحا.

كيفين

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

عليك استخدام مسببات ذلك.

سيكون اقتراحي إلى إنشاء إجراء مخزن الذي التخلف lastUpdate إلى getdate().

حاولت تجنب يتسبب في الماضي لأن ما قبل SQL2005 تحديد وتحرير منهم كان الألم في الردف.خاصة للمطورين الذين جديدة إلى المشروع الخاص بك.

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

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