PDA

View Full Version : disable کردن موقت یک trigger و امکان ثبت داده توسط کاربر دیگر



shaghayegh_6113
جمعه 25 آذر 1390, 23:39 عصر
یه جدول Master و یک Detail برای فرم انبار دارم . در Trigger update جدول Master در صورت تغییر در تاریخ فرم باید قیمتهای جدول Detail که برای بعد از اون تاریخ هستش رو Update کنم ولی نمی خوام Trigger update جدول Detail اجرا بشه بنابر این قبل از اجرای Update اون رو Disable و بعدش Enable می کنم.
حالا اگه یک کاربر دیگه همزمان با Disable شدن Detail بخواد یه رکورد توی Detail Update کنه Trigger update detail اجرا نمی شه و داده ها اشتباه ثبت می شه. باید چی کار کنم؟؟
راهی هست که Trigger رو تو سطح کاربر Disable کنم؟؟ یا اینکه توی Trigger دوم متوجه بشم از کجا Fire شده ؟؟

baktash.n81@gmail.com
شنبه 26 آذر 1390, 10:41 صبح
سلام

راستش من زیاد متوجه منطق قضیه نشدم ... ولی اگه می خوای که وقتی Trigger رو Disable کردی کسی رو اون جدول عملیات انجام نده ... می تونی کل بلوک کدت رو یعنی از وقتی Trigger رو Disable می کنی تا وقتی که دوباره Enable می کنیش رو تبدیل کن به یه Transaction به کمک دستور زیر

Begin tran TranName1 ... Commit TranName1

shaghayegh_6113
شنبه 26 آذر 1390, 14:43 عصر
اتفاقا من اصلا نمی خوام کار کاربران دیگه متوقف بشه و بتونن ورود اطلاعات کنند و حتی Trigger برای اونها Enable باشه

tazarvmmr
شنبه 26 آذر 1390, 15:08 عصر
اتفاقا من اصلا نمی خوام کار کاربران دیگه متوقف بشه و بتونن ورود اطلاعات کنند و حتی Trigger برای اونها Enable باشه

فکر نمیکنم کاری که میخواین شدنی باشه! منتظر جواب بقیه میمونیم در این مورد

منظورتون از کاربر کاربرهای برنامه خودتونه که مثلا تو جدول Users نگهشون میدارید یا اینکه لاگین های خود SQL منظورتونه؟ اگر کاربرای برنامه خودتون باشه، میتونین تریگرتون رو تغییراتی بدید که وقتی کد کاربر خاصی داره این کارو انجام میده ترگر کار اصلیشو انجام نده!

baktash.n81@gmail.com
شنبه 26 آذر 1390, 17:53 عصر
البته کاربران دیگر error دریافت نمی کنند ... فقط query شون صبر می کنه تا کار transaction تموم بشه و منبع آزاد بشه ...

البته بهترین قوانینی که با trigger ایجاد می کنید رو تو لایه App انجام هندل کنید و تا جایی که می تونید از تریگر استفاده نکنید ... دیگه از این مشکلات هم نخواهید داشت.

baktash.n81@gmail.com
شنبه 26 آذر 1390, 17:54 عصر
البته اینم بگم اگه transatction خیلی طولانی بشه ممکن Query های دگه time out بشوند.

mehdi.mousavi
شنبه 26 آذر 1390, 18:02 عصر
سلام.
می تونید Context_Info رو به Value ی خاصی Set کنید. سپس، درون Trigger
Context_Info رو بگیرید و ببینید آیا اون Value ی خاص هست یا خیر و بدین ترتیب
تصمیم بگیرید که کدوم بخش از Trigger باید اجرا بشه.

این مقاله (http://www.mssqltips.com/sqlservertip/1591/disabling-a-trigger-for-a-specific-sql-statement-or-session/) جزییات رو براتون شرح میده.

موفق باشید.