PDA

View Full Version : حل یه مشکل با trigger



FVVSBN
پنج شنبه 30 تیر 1390, 10:22 صبح
سلام

4 تا جدول دارم

vorood,khorooj,mojood,mafghood

در همه اینها ویژگی code_kala وجود داره ، و در vorood,khorooj,mafghood هم id وجود داره که کلید اصلی هست. و البته همه هم یه ویژگی به نام tedad دارند.

چطور میتونم با تریگر در همه اعمال طوری پیاده کنم که موجودی درست بشه؟

Galawij
پنج شنبه 30 تیر 1390, 11:17 صبح
در مرحله ورود روی جدول ورود تریگری می خواید که تعداد کالاهای وارد شده را به جدول کالاهای موجود اضافه کند.
در حین خروج کالا ها هم روی جدول خروج تریگری بنویسید که همواره تعداد خروج ازتعداد کالاهای موجود بیشتر نباشد. در غیر این صورت اجازه خروج کالا داده نشود مگر به تعداد کمتر از کالاهای موجود. و به محض اینکه این تعداد کالا خارج شد به این میزان کالای خارج شده از جدول موجود کسر شود.
پیشنهاد می کنم : روی جدول موجود هم یه فیلدی برای حداقل تعداد کالاها قرار بدید تا به محض اینکه این تعداد کالا از حداقل کالا کمتر باشد به کاربر پیغامی مبنی بر کم شدن موجودی صادر کند.
این هم برای کار با تریگرها (http://barnamenevis.org/showthread.php?292975-کلید-خارجی&p=1290549&highlight=#post1290549)

FVVSBN
پنج شنبه 30 تیر 1390, 15:55 عصر
ممنون از پاسختون
مشکل من روی املای نوشتن یه تریگر هست که در همه حالت ها (insert,update,delete ) اجرا بشه و فیلد مقدار در جدول موجودی رو برای اون کالا برابر کنه با مجموع فیلد مقدار از جدول خروج و مفقود که از مجموع فیلد مقدار ورود کم میشه.
حالا مقدار جدید هم باید تاثیر داشته باشه.

ali190
پنج شنبه 30 تیر 1390, 18:26 عصر
سلام
من هم با گفته دوستمون موافقم
من هم اطلاعات کمی راجع به تریگر دارم
تریگرها در سمت سرور انجام میشود یا کلاینت؟
چطور میتونم در دیتابیسم (sql server2000) تریگر ایجاد کنم؟
میشه چند تا مثال ساده ساده از ترگیرها بزنید تا مفهوم وجودی تریگر رو ابتدا درک کنیم؟
در کل چند نوع تریگر داریم
میشه یه مثال ساده بزنید
مثلاً فرض کنید دو تا جدول داریم با فیلدهای مشابه ، چطور میشه زمانیکه یک رکورد از جدول table1 حذف میشه اون رکورد در table2 اضافه بشه؟
یه سئوال خیلی مهم هم داشتم
تریگرها در دیتابیس با چه اهدافی بکار میروند ، خواهشاً مثالهای کاربردی زده شود تا فلسفه وجودی آنها بخوبی ملکه ذهن شود
ممنون و متشکر از لطف شما
یاعلی

Galawij
جمعه 31 تیر 1390, 00:56 صبح
مشکل من روی املای نوشتن یه تریگر هست که در همه حالت ها (insert,update,delete ) اجرا بشه
شما باید برای هر عملیات روی آن جدول یک تریگر جدا بنویسید.

و فیلد مقدار در جدول موجودی رو برای اون کالا برابر کنه با مجموع فیلد مقدار از جدول خروج و مفقود که از مجموع فیلد مقدار ورود کم میشه.

خوب این هم یک روش دیگه است.

میشه چند تا مثال ساده ساده از ترگیرها بزنید تا مفهوم وجودی تریگر رو ابتدا درک کنیم؟
در کل چند نوع تریگر داریم
میشه یه مثال ساده بزنید
مثلاً فرض کنید دو تا جدول داریم با فیلدهای مشابه ، چطور میشه زمانیکه یک رکورد از جدول table1 حذف میشه اون رکورد در table2 اضافه بشه؟
یه سئوال خیلی مهم هم داشتم
تریگرها در دیتابیس با چه اهدافی بکار میروند ، خواهشاً مثالهای کاربردی زده شود تا فلسفه وجودی آنها بخوبی ملکه ذهن شود

دوست عزیز من که لینک آموزشی (http://barnamenevis.org/showthread.php?292975-کلید-خارجی&p=1290549&highlight=#post1290549) را گذاشته بودم.

یوسف زالی
جمعه 31 تیر 1390, 02:05 صبح
سلام.
برای موجودی ها در انبار بهتره که از سلکت استفاده بشه تا اینکه اون رو در جداول ذخیره کنیم.
این افزونگی ضروری نیست.
کافیه که یک ویو طراحی بشه تا با یک سری عملیات موجودی شما رو بده.
گاهی لازم میشه که دستی ردیفهایی وارد جداول کنیم که به این ترتیب مجبوریم تمام جداول رو اصلاح کنیم.
موردش هم انتقال اطلاعات از شعبات به مرکز هست.
اسناد هم کافیه در یک جدول ذخیره بشن.
مثلا طراحی مد نظر من می تونه شبیه به این باشه:
72777

تشخیص ورود یا خروج با 0 و 1 کردن type هست.
تمام اسناد هم در یک جدول حضور دارند.
به سادگی با یک سلکت هم مانده ها در میاد هم برای کنترل کاهش موجودی میتونی در procedure مربوط به اینسرت کنترل رو انجام بدی.
از ساخت تریگر ها خیلی خوشحال نشین چون اگر تعدادش زیاد بشه مصیبتی می شه.


اما خود تریگر : (با اجازه اساتید)
تریگر شیی در SQL هست که دستوراتی رو در مواقعی خاص (بعد از اقدام به تغییرات داده در جدول خاص - در عوض اعمال تغییرات داده در جدول خاص) برای ما اجرا می کنه که حتما لازم نیست روی جدول معین شده کار انجام بشه.
این شی دستورات خودش رو روی سرور اس کیو ال اجرا می کنه.
اما چرا تریگر؟
مواقعی هست که از چند طریق مختلف مثل پروسیجر ها - دستورات کامند ها در UI و یا جاهای دیگه ای اقدام به تغییر داده (Insert - Update - Delete) در جدول مشخصی می کنیم.
پس از مدتی متوجه میشیم که مثلا قبل از انجام این کارها باید کار مهمی رو انجام میدادیم. مثلا کنترل های تعدادی و ...
اگر بنا باشه که تمام جاهایی که از اون ها تغییرات داده روی جدول اعمال میشد رو دست بزنیم هم طولانی هست - هم گاهی باید EXE مجدد کامپایل شه - هم معمولا یکی دو جا از قلم می افته.
برای این کار یک تریگر تعریف می کنیم که مواظب جدول ما باشه و هر وقت هر چیزی خواست دست به این جدول بزنه (Select ایرادی نداره) به جاش یا بعدش (در تعریف مشخص می کنیم) دستوراتی رو اجرا کنه که این دستورات تقریبا می تونه هر چیزی باشه. (مثل دستوراتی که در Procedure می نویسیم . حتی Select کنه اما Select خالی که به درد نمی خوره)
در این جاست که کنترل خودمون رو تعریف می کنیم.

انواع تریگر :
تریگری که بعد از انجام کار باید اجرا شود (مثال : به روز رسانی جدول خاصی از روی مقادیر این جدول)
تریگری که به جای انجام کاری باید اجرا شود (مثال : کنترل موجودی - اگر موجودی کافی نبود نباید کار خواسته شده انجام شود)

نحوه تعریف تریگر:
Create Trigger Trig_Name On TableOrViewName After InsertOrUpdateOrDelete as bla bla
Create Trigger Trig_Name On TableOrViewName Instead Of InsertOrUpdateOrDelete as bla bla
Create Trigger Trig_Name On TableOrViewName For InsertOrUpdateOrDelete as bla bla

For در نسخه های قدیمی به جای After بود. هر دوش یه چیزه.

نکته مهم:
تریگر ها روی جداول فیزیکی می تونن گذاشته بشن نه جداول موقتی مثل # یا ## یا @.
تریگر ها پارامتر ندارند.

مثال های سریع:

Create Trigger Trig1 On Table1 Instead Of Insert, Update as blabla
Create Trigger Trig2 On Table2 After Delete, Insert as blabla
Alter Trigger Trig1 On Table3 For Delete as blabla

اما چه جوری با تریگر کار کنیم؟
در طول عمر یک تریگر دو تا جدول به وجود میان به نامهای Inserted و Deleted که از اونها می شه استفاده کرد. اما نمیشه بهشون دست زد.
به این جداول می گن جداول منطقی.
تو این جدولها اطلاعات جدولی هست که قرار بوده داده هاش رو دست بزنیم و ما رو اون تریگر گذاشتیم.
اگر گفته بودیم که حساس باشه به Insert کردن، اونوقت Inserted حاوی داده های ما بود که قرار بوده Insert شه یا Insert شده و Deleted خالیه. (بسته به نوع تریگر)
اگر گفته بودیم که حساس باشه به Delete کردن، اونوقت Deleted حاوی داده های ما بود که قرار بوده Delete شه یا Delete شده و Inserted خالیه.
اگر گفته بودیم که حساس باشه به Update کردن، اونوقت Deleted حاوی داده های قبلی این جدول بود و Inserted حاوی اطلاعات جدید ما که قرار بوده جایگزین بشه یا جایگزین شده.

حالا یه مثال یه کمی مشروح:
اگر جدولی داشته باشیم به نام Tbl1 با ستونهای ID و Amnt و تریگری مثل این تعریف کرده باشیم:
Create trigger Trig1 On TBL1 Instead Of Delete as
delete TBL1 where ID in(select ID from Deleted)and Amnt > 1000

اونوقت هنگام Delete کردن اگر Amnt > 1000 باشه دستور ما اجرا میشه.
از کجا فهمیدیم چیا باید Delete شن؟

آفرین!


اما گاهی که تریگر همزمان برای چند کار مثل Update و Delete ست شده تو تریگر از کجا میشه فهمید چه کاری قرار بوده انجام بشه؟
از روی داده های جداول منطقی.
اگر Inserted پر بود و Deleted خالی بود = Insert
اگر Inserted خالی بود و Deleted پر بود = Delete
اگر Inserted پر بود و Deleted پر بود = Update

خسته شدم!

هر جاش گنگ بود بگید تا اگه می دونستم کمک کنم.

راستی! تریگر روی ویو هم مجازه اما فقط از نوع Instead Of چون نمیشه به اطلاعاتش مستقیم دست زد.

یوسف زالی
جمعه 31 تیر 1390, 02:16 صبح
شما باید برای هر عملیات روی آن جدول یک تریگر جدا بنویسید.


نخیر. کافیه در دستور از , استفاده کنن.
مثلا:
Create Trigger On TBL1 After Insert, Update, Delete as ...

برای تشخیص هم در پست قبلی توضیح دادم.

Galawij
جمعه 31 تیر 1390, 09:31 صبح
yousijoon

نقل قول: حل یه مشکل با trigger
سلام.
برای موجودی ها در انبار بهتره که از سلکت استفاده بشه تا اینکه اون رو در جداول ذخیره کنیم.
این افزونگی ضروری نیست.
کافیه که یک ویو طراحی بشه تا با یک سری عملیات موجودی شما رو بده.
گاهی لازم میشه که دستی ردیفهایی وارد جداول کنیم که به این ترتیب مجبوریم تمام جداول رو اصلاح کنیم.
موردش هم انتقال اطلاعات از شعبات به مرکز هست.
اسناد هم کافیه در یک جدول ذخیره بشن.
مثلا طراحی مد نظر من می تونه شبیه به این باشه:
ضمیمه 72777 (http://barnamenevis.org/attachment.php?attachmentid=72777)

تشخیص ورود یا خروج با 0 و 1 کردن type هست.
تمام اسناد هم در یک جدول حضور دارند.
به سادگی با یک سلکت هم مانده ها در میاد هم برای کنترل کاهش موجودی میتونی در procedure مربوط به اینسرت کنترل رو انجام بدی.
از ساخت تریگر ها خیلی خوشحال نشین چون اگر تعدادش زیاد بشه مصیبتی می شه.


سلام دوست من،
من روی تحلیل جداول سوال این تاپیک فکر نکردم چون راستش وقتش را نداشتم و پر واضح است که خیلی راحت تر از این ها می شود روی این بحث کار کرد. خوب البته شما وقت دارید و یک راهنمایی های فرمودید.

yousijoon

نقل قول: حل یه مشکل با trigger

شما باید برای هر عملیات روی آن جدول یک تریگر جدا بنویسید.


نخیر. کافیه در دستور از , استفاده کنن.
مثلا:
Create Trigger On TBL1 After Insert, Update, Delete as ...

راستش من همزمان یک تریگر را برای چندین عملیات مختلف ننوشته بودم از اینکه اصلاح فرمودید ممنونم.
فقط یک سوال برای خودم پیش اومده و اینکه در این صورت چطوری دستورات مربوط به عملیات Insert و delete را جدا می کنیم؟

یوسف زالی
جمعه 31 تیر 1390, 15:46 عصر
من هم فقط آخر هفته ها وقت درست درمون می تونم بگذارم.(تایم پست رو ببین!)

اما سوال شما رو جواب داده بودم :


اگر Inserted پر بود و Deleted خالی بود = Insert
اگر Inserted خالی بود و Deleted پر بود = Delete
اگر Inserted پر بود و Deleted پر بود = Update

FVVSBN
جمعه 31 تیر 1390, 23:42 عصر
ممنون از کمکتون
مشکل منو این جمله ها حل کردن:


اگر Inserted پر بود و Deleted خالی بود = Insert
اگر Inserted خالی بود و Deleted پر بود = Delete
اگر Inserted پر بود و Deleted پر بود = Update