PDA

View Full Version : AFTER DELETE در تریگر



fakhravari
سه شنبه 25 بهمن 1390, 19:23 عصر
با سلام
مشکل این کد چیه؟
create TRIGGER DeletePost
ON TBLNews
AFTER DELETE
AS
BEGIN
DELETE FROM Comments WHERE PostID=(SELECT NewsID FROM TBLNews)
END


با این query که نتیجه میگیرم برای تست
delete from TBLNews where NewsID=4
Error این میده
Msg 512, Level 16, State 1, Procedure DeletePost, Line 6
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
The statement has been terminated.

tiphooo
سه شنبه 25 بهمن 1390, 19:35 عصر
PostID=(SELECT NewsID FROM TBLNews)
در این کد دستور SELECT شما می تواند چندین خروجی داشته باشد که با عملگر مساوی در تضاد است یا دستور SELECT خود را محدود به یک خروجی کنید یا به جای = از IN استفاده کنید

fakhravari
چهارشنبه 26 بهمن 1390, 13:23 عصر
با سلام
به این صورت تغیر دادم اما باز همون Error داد
ALTER TRIGGER [dbo].[DeletePost]
ON [dbo].[TBLNews]
AFTER DELETE
AS
BEGIN

declare @NewsID int;
set @NewsID = (SELECT NewsID FROM TBLNews)


DELETE FROM Comments WHERE PostID=@NewsID
END

mina_ghorbani
چهارشنبه 26 بهمن 1390, 14:26 عصر
SubQuery كه نوشتي بيشتر از يك مقدار بر مي گرونه بايد يه شرطي بذاري كه فقط يك ركورد برگردونه مثلا روي كليد اصليت شرط بذار
خط 8 كدتونو درست كنيد

micro24
چهارشنبه 26 بهمن 1390, 15:46 عصر
سلام

دستورتان را به صورت زیر بنویسید:

Create Trigger Test1 on Test
for Delete
As
Begin
Insert into TestLog Select Name,Getdate()from Deleted
End

اگر برای بیش از یک رکورد را براتان برنگرداند از Cursor استفاده کنید توی دستورتان.

fakhravari
چهارشنبه 26 بهمن 1390, 17:48 عصر
دوستان ممنون از همه شما.
واقعا گیج شدم.
اگر ممکن روی مثال خودم انجام بدید.
من اصلا متوجه پست 5 نشدم:اشتباه::افسرده:
----------------

من میخواهم وقتی id اخبار حذف شد تمام کامنتها هم حذف شود.
از طریق ریلیشن ها میشه اما نمی خواهم از اون روش جلو برم.

tiphooo
چهارشنبه 26 بهمن 1390, 19:41 عصر
ALTER TRIGGER [dbo].[DeletePost]
ON [dbo].[TBLNews]
AFTER DELETE
AS
BEGIN

declare @NewsID int;
set @NewsID = (SELECT NewsID FROM DELETED)


DELETE FROM Comments WHERE PostID=@NewsID
کدی که نوشتی مشکل همان کد قبلی را دارد
به جای نام جدول DELETED را بنویس چون باز هم شما دارید تمام مقادیر NewsID را در یک متغیر می ریزید که امکان پذیر نیست DELETED فقط همان NewsID تحت بررسی را بازمیگرداند
و اگر از درج استفاده می کنید FROM INSERTED و FROM UPDATED

tiphooo
چهارشنبه 26 بهمن 1390, 19:43 عصر
البته شما می توانستید با Relation این کار را کنترل کنید و نیازی به تریگر نیود

fakhravari
چهارشنبه 26 بهمن 1390, 20:33 عصر
ممنون با کد شما درست شد پست 7.
خوب از ریلیشن هم میشه.
الان یه سوال دیگه.
چطوری کالایی که فروش میره رو از موجودی به صورت اتوماتیک کم کنه.
اگر ممکن مثال یا لینکی معرفی کنید

tiphooo
چهارشنبه 26 بهمن 1390, 21:30 عصر
شما نباید موجودی کالا را در فیلد دخیره کنید.موجودی را فقط در جاهایی که لازم است باید نمایش دهید و آن هم به اینصورت که مقدار فروش رفته ها را از مقدار خریداری شده (رسید شده) به ازاء هر کالا کسر کرده ونمایش دهید