PDA

View Full Version : شرط if بررسی نمی شه!!



moji_helooo
جمعه 06 اردیبهشت 1392, 01:28 صبح
سلام. برای پایگاه داده ی کتابخانه روی جدولی که رابطه ی کتاب امانت دادن و گرفتن هست و چند تا fk داره تریگر زدم تا یه نفر نتونه مثلا دو تا کتاب پایگاه داده با خودش ببره. تریگر به صورت زیره:
CREATE TRIGGER notwobarrow ON barrowbook
FOR INSERT
AS
BEGIN
declare @borde int;
declare @ovorde int;
declare @state bit;

set @borde = (select COUNT (*) from barrowbook , inserted
where barrowbook.[شماره عضویت] = inserted.[شماره عضویت] and barrowbook.[شماره کتاب] = inserted.[شماره کتاب] and barrowbook.وضعیت = 1);

set @ovorde = (select COUNT (*) from barrowbook , inserted
where barrowbook.[شماره عضویت] = inserted.[شماره عضویت] and barrowbook.[شماره کتاب] = inserted.[شماره کتاب] and barrowbook.وضعیت = 0);

set @state = (select وضعیت from inserted);


if (@state = 1 and @borde > @ovorde )
begin
print 'شما این کتاب را قبلا برده و نیاورده اید و نمی توانید از یک کتاب بیشتر از یک ببرید.';
rollback;
end

END
ستون state اگر 1 باشه یعنی طرف کتاب رو به امانت برده و اگر 0 باشه یعنی پس اورده.

حالا مشکل اینجاست که انگار شرط درون اون if اصلا بررسی نمی شه و تحت هر شرایط دستورات داخل if اجرا می شن. مشکل کجاست؟

moji_helooo
جمعه 06 اردیبهشت 1392, 17:07 عصر
من فهمیدم مشکل از کجاست!! دستور توی if به خوبی بررسی می شه ولی مشکل اینجاست که جدول barrowbook هیچ رکوردی نداره. پس قاعدتا باید borde@ و ovorde@ مقدارشون 0 باشه. ولی من که debug کردم، دیدم مقدار borde@ برایر 1 می شه در حالی که تریگر من FOR INSERT هست یعنی هنوز رکوردی توی barrowbook درج نشده پس چرا یه دونه می شمره؟ یعنی اینطوره که اول رکورد رو درج می کنه بعد تریگر اجرا می شه اگه قرار بود rollback اجرا شه اون رکورد درج شده رو حذف می کنه؟ اگه اینطور باشه می تونم با یه منهای یک مشکل رو حل کنم.

پیشا پیش از پاسخ هاتون متشکرم

Mahmoud.Afrad
جمعه 06 اردیبهشت 1392, 19:02 عصر
با این کار فکر نمیکنم به جواب برسید. بهتره قبل از دستور INSERT ، تعداد اون کتاب رو از جدول barrowbook برای اون شخص چک کنید و اگر مجاز بود(تعداد برده منهای آورده مساوی صفر بود مجاز است اون کتاب رو ببره) عمل درج رو انجام بدید.
همه این کارها رو میتونید در یک SP انجام بدید.

moji_helooo
شنبه 07 اردیبهشت 1392, 00:06 صبح
اینی که شما می گید هم می شه بله ولی من همون 1 - borde@ رو انجام دادم درست شد. موضوعی که بهش پی بردم اینه که درسته که ما تریگرمون FOR INSERT هست ولی رکورد رو درج می کنه بعد می ره سراغ اجرای تریگر. یعنی تا قبل از پایان این تریگر یه رکورد به جدول barrowbook اضافه شده. حالا اگر توی تریگر دستور rollback اجرا بشه اون رکورد حذف می شه. نمی دونم این برای همه ی پایگاه داده ها اینطوره ( مثل mysql ، sqlite و ...) یا فقط این محصول مایکروسافت اینطوره.:متفکر:

فقط بی زحمت می شه بگید این SP که گفتید چیه ؟

baktash.n81@gmail.com
شنبه 07 اردیبهشت 1392, 12:42 عصر
سلام ... دوست عزیز ، اصلا فکر و روش خوبی نیست که Business برنامتون رو با trigger پیاده سازی کنید ... در مورد sp ها یکم جستجو کنید ... مطالب زیادی وجود داره ... اما برای شروع sp ها روال هایی هستند که یه بلاک دستور رو برای شما اجرا می کنند در حالت خیلی ساده مثل متد ها یا فانکشن ها هستند ولی در لایه Database