ورود

View Full Version : نوشتن تریگر برای فروشگاه



razeghaik1
پنج شنبه 16 شهریور 1391, 11:20 صبح
با عرض سلام خدمت دوستان عزیز
من یک جدول دارم با نام temp که شامل فیلد های زیر است:
id,un,bid_fk,model,price,number
و یک جدول با نام basket_buy که شامل فیلد های زیر است:
id,un,total_price,confirm_,sent,delivered

حالا من می خوام یه تریگر بنویسم که وقتی یک رکورد وارد جدول temp شد اگر این رکورد وارد شده دارای یوزر نیمی (un) است که برای اولین بار وارد جدول temp شده است فیلد های un,price رو از جدول temp گرفته و در جدول basket_buy در فیلدهای un,total_price ذخیره کند(در واقع یک رکورد جدید در جدول basket_buy ذخیره می شود).

و در صورتی که این یوزرنیم(un) قبلا در جدول temp وجود دارد به جای عمل Insert در جدول basket_buy عمل آپدیت را انجام دهد.بدین شکل که جمع ستون های price را انجام دهد به شرط اینکه مربوط به فلان یوزرنیم (un) باشد.

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


create trigger basketbuy_trigger_insert
on temp
after insert
as
declare @un nvarchar(200)
declare @total_price int
declare @total_price1 int
set @un=(select un from inserted)
set @total_price=(select price from inserted)
set @total_price1=(select sum(price) from temp where un=@un)
if not exists((select count(un) from basket_buy where un=@un))
insert into basket_buy(un,total_price) values(@un,@total_price)
if exists((select count(un) from basket_buy where un=@un))
update basket_buy set total_price=@total_price1 where un=@un

razeghaik1
پنج شنبه 16 شهریور 1391, 12:09 عصر
دوستان مشکل حل شد.مرسی
اینم کدی که کار میکنه:


alter trigger basketbuy_trigger_insert
on temp
after insert
as
declare @un nvarchar(200)
declare @total_price int
declare @total_price1 int
set @un=(select un from inserted)
set @total_price=(select price from inserted)
set @total_price1=(select sum(price) from temp where un=@un)
if ((select count(un) from temp where un=@un)=1)
begin
insert into basket_buy(un,total_price) values(@un,@total_price)
end
if ((select count(un) from temp where un=@un)>1)
begin
update basket_buy set total_price=@total_price1 where un=@un
end

baktash.n81@gmail.com
پنج شنبه 16 شهریور 1391, 12:15 عصر
سلام دوست عزیز

استفاده از تریگر برای پیاده سازی منطق برنامه روش مناسبی نیست ... شما می تونید برای درج رکورد در Temp یه Sp بنویسید و توی اون منطق مورد نظرتون رو پیاده سازی کنید

razeghaik1
پنج شنبه 16 شهریور 1391, 14:35 عصر
سلام دوست عزیز

استفاده از تریگر برای پیاده سازی منطق برنامه روش مناسبی نیست ... شما می تونید برای درج رکورد در Temp یه Sp بنویسید و توی اون منطق مورد نظرتون رو پیاده سازی کنید

مرسی دوست عزیز میشه بگید چرا روش مناسبی نیست؟!

baktash.n81@gmail.com
پنج شنبه 16 شهریور 1391, 16:38 عصر
یکی اینکه ...
trigger مقداری رو به شما بر نمی گردونه که متوجه بشید کار درست انجام شده یا نه ...
نمی تونید کار تریگر رو تریس کنید ...
چون به صورت اتومیک اجرا می شه منبع رو قفل می کنه و در مورد جداولی که خیلی زیاد روش کار انجام می شه ممکنه برفورمنس رو پایین بیاره ...
شما از درون برنامه کنترلی رو اجرا شدن یا ندشدنش نداری ...
کلا اگه حذف بشه شما خطایی دریافت نمی کنید ...
به سادگی ممکنه یادتون بره که همچین ترگیری هم نوشتید ...

بهتره از تریگر زمانی استفاده کنیم که چاره دیگه ای نداریم

razeghaik1
پنج شنبه 16 شهریور 1391, 19:56 عصر
مرسی دوست عزیز ...