ورود

View Full Version : كمك در نوشتن يك Trigger



fghdmhmmd
یک شنبه 25 مهر 1389, 10:59 صبح
سلام.من ميخوام يه Trigger بنويسم كه كار Log گيري را براي من انجام بده.يعني براي عمليات Insert.Update.Delete و ورود هر كاربر و خروجش عمل Log گيري را انجام بده.فكر ميكنم بايد براي هر جدول يك Trigger جدا بنويسم.درسته؟براي عمل ورود و خروج هر كاربر بايد چه جوري Trigger بنويسم؟
چيزهايي كه من نياز دارم تا در جدول Log ذخيره كنم اينا هستن : شماره كاربري.عمليات.وضعيت.مستند.ت اريخ.ساعت (UserID.Operation.Section.Status.Date.Time)
براي عمليات Insert.Update.Delete فكر ميكنم براي جدول Log عمليات و وضعيت و مستند و شماره كاربري را دارم ولي يكي از مشكلاتم نداشتن تاريخ و ساعته؟؟؟تاريخ و ساعت را چگونه پيدا كنم؟؟؟؟
يكي ديگه از مشكلاتمم براي عمل ورود و خروج كاربره.چطوري ميتونم بفهمم كه يه كاربر وارد يا خارج شده؟؟؟؟Trigger مربوط به ورود و خروج هر كاربر را روي جدول بايد بنويسم يا ديتابيس ؟؟؟؟

از دوستان تقاضا مندم كه لطفا منو راهنمايي كنن.پيشاپيش از همه دوستان و اساتيد متشكرم

saeed_r67
یک شنبه 25 مهر 1389, 12:55 عصر
سلام . خوب چرا تموم این کار ها رو با برنامتون انجام نمیدید

حمیدرضاصادقیان
یک شنبه 25 مهر 1389, 13:07 عصر
سلام.میدونید تریگر برای اینکارچقدر تاثیر منفی روی بازده دیتابیس شما داره؟ شما کافیه به جاش یک procedure جدا بنویسید و بهش پارامتر پاس بدید تا رکورد مورد نظرتون رو در دیتابیس اضافه کنه.

fghdmhmmd
یک شنبه 25 مهر 1389, 16:29 عصر
اگه بخوام از Procedure استفاده كنم فكر ميكنم اول از همه بايد اونو در قالب يه Transaction بنويسم.درسته؟و از طرف ديگه به ازاي هر عمل Insert.Update,Delete.LogIn.LogOut يك بار اين Procedure رو صدا بزنم.درسته؟يه سوالي كه اينجا پيش ميات اينه كه كار با Procedure تو شبكه كه همزمان چندين نفر در حال استفاده از DB هستن مشكلي ايجاد نميكنه؟آيا نوشتن در قالب Transaction اين مشكل رو حل ميكنه ؟

ASKaffash
دوشنبه 26 مهر 1389, 08:22 صبح
سلام.میدونید تریگر برای اینکارچقدر تاثیر منفی روی بازده دیتابیس شما داره؟ شما کافیه به جاش یک procedure جدا بنویسید و بهش پارامتر پاس بدید تا رکورد مورد نظرتون رو در دیتابیس اضافه کنه.
سلام
ولی اشکال عمده دارد و اینکه فقط رکوردهائی Log می شوند که از طریق برنامه شما اعمال میشود واز سایر مبادی ورودی هیچ Log ای برداشته نمی شود در ضمن اگر درست تریگر پیاده سازی شود مشکلی پیش نمی آید

حمیدرضاصادقیان
دوشنبه 26 مهر 1389, 08:35 صبح
سلام.دوست عزیز شما بعضی از مفاهیم رو باهم اشتباه گرفتین.
ببینید Transaction زمانی کاربرد داره که شما میخواهید یک عمل طولانی رو انجام بدید که در صورت خطا باید اون عمل برگرده.یا بعضی از جداول مهم شما تحت تاثیر اون قرار میگیره.
شما فقط نیاز به یک دستور insert ساده دارید. بعد هرکاربر یک پارامتر به اون پاس میده و sp نیز اجرا میشه.خیر هرکاربری برای خودش یک id خاص داره و هیچ تداخلی بین sp ها بوجود نمیاد.
شما در پارامترهای Sp نیاز به نوع عمل(اصلاح،حذف،گزارش و..) زمان وقوع، نام کاربر، تاریخ، دارید که برای هر عمل این پارامترها رو به sp پاس میدید و موارد فوق رو در جدول مورد نظر اضافه میکنید.
موفق باشید

علیرضا مداح
دوشنبه 26 مهر 1389, 09:01 صبح
سلام،
اگر از SQL Server 2008 استفاده می کنید، بر روی ویژگی Change Data Capture (http://msdn.microsoft.com/en-us/library/bb522489.aspx) مطالعه نمایید،/

حمیدرضاصادقیان
دوشنبه 26 مهر 1389, 10:22 صبح
سلام
ولی اشکال عمده دارد و اینکه فقط رکوردهائی Log می شوند که از طریق برنامه شما اعمال میشود واز سایر مبادی ورودی هیچ Log ای برداشته نمی شود در ضمن اگر درست تریگر پیاده سازی شود مشکلی پیش نمی آید

سلام.کلا سه تاعمل Delete,update,insert هست که ما میخواهیم روش گزارش بگیریم.و در برنامه جایی که این اعمال انجام میشه اون پروسیجر هم صدا زده میشه.
چون تمام اعمال تریگر از فایل log خود دیتابیس استفاده میکنه و کارهاشو انجام میده.یعنی یکبار اطلاعات در لاگ نوشته میشه و قبل از اینکه Shrink بشه اون تریگر فراخوانی میشه و فایل لاگ shrink میشه .ولی با روشی که عرض کردم شما یک Sp رو صدا میزنید و اونهم به صورت cache شده می باشد.که سرعت اجرای اون هم به مراتب بیش از تریگر هست.
کلا در بحث Performance پیشنهاد میشه کمتر از تریگر استفاده بشه.چون اگر چند کاربر باهم روی یک جدول شروع به کار کنند اون موقع تاثیر خودشو نشون میده.
یک حالتی مانند Transaction عمل میکنه و در کار کندی ایجاد میکنه.ولی sp خارج از کاری که کاربر میخواد انجام بده اجرا میشه و کندی در کار صورت نمیگیره.
موفق باشید

ASKaffash
دوشنبه 26 مهر 1389, 14:19 عصر
سلام.کلا سه تاعمل Delete,update,insert هست که ما میخواهیم روش گزارش بگیریم.و در برنامه جایی که این اعمال انجام میشه اون پروسیجر هم صدا زده میشه.
چون تمام اعمال تریگر از فایل log خود دیتابیس استفاده میکنه و کارهاشو انجام میده.یعنی یکبار اطلاعات در لاگ نوشته میشه و قبل از اینکه Shrink بشه اون تریگر فراخوانی میشه و فایل لاگ shrink میشه .ولی با روشی که عرض کردم شما یک Sp رو صدا میزنید و اونهم به صورت cache شده می باشد.که سرعت اجرای اون هم به مراتب بیش از تریگر هست.
کلا در بحث Performance پیشنهاد میشه کمتر از تریگر استفاده بشه.چون اگر چند کاربر باهم روی یک جدول شروع به کار کنند اون موقع تاثیر خودشو نشون میده.
یک حالتی مانند Transaction عمل میکنه و در کار کندی ایجاد میکنه.ولی sp خارج از کاری که کاربر میخواد انجام بده اجرا میشه و کندی در کار صورت نمیگیره.
موفق باشید
سلام
اشتباه یزرگی اتفاق افتاده log برداری با تریگر ربطی به log خود Sqlserver ندارد در تریگر برنامه نویس با روش و الگوریتم خودش اقدام به ذخیره سازی سوابق رکورد می کند

حمیدرضاصادقیان
دوشنبه 26 مهر 1389, 14:44 عصر
سلام.حرف شمادرسته.احتمالا من بد توضیح دادم شما جور دیگه ای برداشت کردین.
جداول inserted,deleted مربوط به تریگر اطلاعاتشون رو از فایل log دیتابیس میخونند.

fghdmhmmd
سه شنبه 27 مهر 1389, 11:55 صبح
سلام.ممنون از همه دوستان.راستش من الان دچاره دوگانگي شدم.ASKaffash عزيز ميگن تريگر بهتره!آقاي صادقيان عزيزم ميگن SP بهتره!ميشه در كل به من بگين كدوم روش براي گرفتن Log بهتره؟

آقاي صادقيان :
"کلا در بحث Performance پیشنهاد میشه کمتر از تریگر استفاده بشه.چون اگر چند کاربر باهم روی یک جدول شروع به کار کنند اون موقع تاثیر خودشو نشون میده."

ASKaffash :
"ولی اشکال عمده دارد و اینکه فقط رکوردهائی Log می شوند که از طریق برنامه شما اعمال میشود واز سایر مبادی ورودی هیچ Log ای برداشته نمی شود در ضمن اگر درست تریگر پیاده سازی شود مشکلی پیش نمی آید"

ASKaffash عزيز منظورتون از اينكه گفتيد از ساير مبادي ورودي هيچ Log گرفته نميشه چيه ؟ ميشه بيشتر توضيح بدين؟

حمیدرضاصادقیان
سه شنبه 27 مهر 1389, 12:49 عصر
سلام.اگر از نسخه 2008 استفاده میکنید اون مبحثی که آقای مداح گفتند مناسبترین راه می باشد. ولی اگر از نسخه 2000-2005 استفاده میکنید فکر کنم sp گزینه مناسبتری نسبت به تریگر باشه.

ASKaffash
چهارشنبه 28 مهر 1389, 17:08 عصر
سلام.ممنون از همه دوستان.راستش من الان دچاره دوگانگي شدم.ASKaffash عزيز ميگن تريگر بهتره!آقاي صادقيان عزيزم ميگن SP بهتره!ميشه در كل به من بگين كدوم روش براي گرفتن Log بهتره؟

آقاي صادقيان :
"کلا در بحث Performance پیشنهاد میشه کمتر از تریگر استفاده بشه.چون اگر چند کاربر باهم روی یک جدول شروع به کار کنند اون موقع تاثیر خودشو نشون میده."

ASKaffash :
"ولی اشکال عمده دارد و اینکه فقط رکوردهائی Log می شوند که از طریق برنامه شما اعمال میشود واز سایر مبادی ورودی هیچ Log ای برداشته نمی شود در ضمن اگر درست تریگر پیاده سازی شود مشکلی پیش نمی آید"

ASKaffash عزيز منظورتون از اينكه گفتيد از ساير مبادي ورودي هيچ Log گرفته نميشه چيه ؟ ميشه بيشتر توضيح بدين؟

سلام
دوست من Log خود SQLServer هیچ ربطی به Log درون تریگر که ما با کد نویسی ایجاد می کنیم ندارد و در تمام نسخه ها همین است لطفا صفحه مربوط به تریگررا از لینک ذیل رو بخون بعد توی همین تاپیک توضیحاتی خواهم داد
http://www.barnamenevis.org/forum/showthread.php?t=106494