ورود

View Full Version : سوال: مشکل تریگر Update



shaghaghi
شنبه 25 خرداد 1387, 13:49 عصر
سلام
جدولی داریم که هنگام Update شدن فیلد های آن توسط کاربر، با کمک یک تریگر اطلاعات رکوردها را قبل و بعد از اعمال دستور Update در جدول دیگری ذخیره می نماییم.
مشکل کار اینجاست که زمانیکه دستور Update بر روی رکوردهای جدول اتفاق می افتد، صرف نظر از اینکه آیا این دستور Update شامل رکورد های محدودی می شود، از تمامی رکورد ها Log گرفته می شود (ملاک کار Affected شدن هر رکورد است نه به روز شدن واقعی آن رکورد)
به همین خاطر تعداد کثیری از اطلاعات رکوردها جدول Log مان بی اساس هستند، چون آن رکوردها فقط Affect شده اند نه Update!!
به نظر می رسد ریشه ی اصلی این مشکل از اینجا ناشی می شود که نمی توان از طریقی بررسی کرد که اگر اطلاعات قبل و بعد از تغییر که در دو جدول Inserted و Deleted نوشته می شوند یکسان هستند (به این معنی که اتفاقی بر روی اطلاعات رکورد نیافتاده است) در نوشتن Log استثناء شوند.
ممنون می شوم اگر راهکاری را پیشنهاد نمایید.

AminSobati
شنبه 25 خرداد 1387, 14:28 عصر
دوست عزیزم،
منظورتون این هست که رکوردهایی که حائز شرط Update نیستند در جداول Inserted و Deleted حضور دارند؟

ASKaffash
شنبه 25 خرداد 1387, 15:29 عصر
با سلام
دوست عزیز شما درون تریگر میتوانید همواره اختلاف بین جدول Deleted و Inserted را تحلیل کنید واگر نیازی باشد Log بردارید درضمن و با استفاده از تابع Update() برای تشخیص ستونهای تغییر کرده نیز میتوان استفاده کرد تنها کافیست یکی از فیلدهای جدول مورد نظر تغییر کند تریگر اجرا میشود وکل رکوردهای تحت تعییرات با کل ستونها جدول شما برای تریگر ارسال میشود و بقیه تصمیم گیری باید توسط شما درون تریگر انجام شود.

shaghaghi
شنبه 25 خرداد 1387, 18:14 عصر
دوست عزیزم،
منظورتون این هست که رکوردهایی که حائز شرط Update نیستند در جداول Inserted و Deleted حضور دارند؟
نه منظورم این است که رکوردهایی هم که انجام Update تاثیری به حال آنها ایجاد نمی کند و همچنان بر روی مقدار قبلی شان باقی می مانند، هم Log می شوند این مثال را دقت نمایید:
جدول t1 را در نظر بگیرید:
Name Code
------------------
A------ 1
1 ------B
3 ----- C
زمانیکه این دستور را Run می کنیم: Update t1 Set Name='A' Where Code=1
پیغام (2row(s) affected)ظاهر شده و بجای اینکه یک رکورد در Log ثبت شود، کلیه رکوردهایی که در این شرط قرار می گیرند Log می شود (صرف نظر از اینکه اصلا رکورد اول جدولمان مقدارش A بوده و این Update بر روی آن بی تاثیر است)در نهایت در جدول Log دو رکورد تولید می شود:
A ----> A
B ----> A
که رکورد اول غلط است
با تشکر

AminSobati
شنبه 25 خرداد 1387, 18:39 عصر
خیلی سرراست به نظر نمیرسه این هدف.

- راه حل اول که چندان کاربردی نیست:


update t1 set name='A' where code=1 AND NAME<>'A'


- راه حل دوم، در Trigger دو جدول Inserted و Deleted رو Join کنین و اینکه آیا فیلد تغییر داشته یا خیر بدست بیارید

- راه حل سوم، اجازه بدین حتی رکوردهایی که تغییر نداشتند Log بشن، با یک Job شبانه رکوردهای بدون تغییر رو از Log حذف کنین تا حجمش کاهش پیدا کنه

مطمئنا روشهای دیگری هم هست...