ورود

View Full Version : پاک شدن یک رکورد بعد از 0 شدن فیلد



reza69
پنج شنبه 28 دی 1391, 23:40 عصر
سلام
من میخوام بعد از اینکه یک فیلد که از نوع int هست مقدار 0 گرفت سطر مربوطه پاک بشه.
چه کار باید بکنم؟

hassan_reza
پنج شنبه 28 دی 1391, 23:49 عصر
از تریگر استفاده کنید

fakhravari
پنج شنبه 28 دی 1391, 23:50 عصر
با تریگر میتوند این کار کنید.
ولی من هنوظ نتونستم مقدار قبلی متغیر بروز شده را بگیرم.
http://barnamenevis.org/showthread.php?376673-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-TRIGGER-%D8%AF%D8%B1-UPDATE

hassan_reza
پنج شنبه 28 دی 1391, 23:54 عصر
با تریگر میتوند این کار کنید.
ولی من هنوظ نتونستم مقدار قبلی متغیر بروز شده را بگیرم.
http://barnamenevis.org/showthread.php?376673-%D8%B3%D9%88%D8%A7%D9%84-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-TRIGGER-%D8%AF%D8%B1-UPDATE

مقدار قبلی متغییر بروز شده در جدول deleted وجود داره.

fakhravari
جمعه 29 دی 1391, 01:15 صبح
CREATE TABLE [dbo].[Student](
[Name] [nvarchar](50) NULL,
[Numre] [int] NULL,
[ID] [bigint] IDENTITY(1,1) NOT NULL)


create TRIGGER [dbo].[Chek0]
ON [dbo].[Student]
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @Numre int;
select @ID = ID from INSERTED
set @Numre = (SELECT [Numre] FROM INSERTED)
if @Numre = 0
begin
delete from Student where ID = @ID
END
END
END

با این اتوماتیک پاک میشه

fakhravari
جمعه 29 دی 1391, 01:16 صبح
مقدار قبلی متغییر بروز شده در جدول deleted وجود داره.
بله درسته قبلی در deleted و بعدی در INSERTED

reza69
جمعه 29 دی 1391, 08:44 صبح
TRIGGER چیه؟
من الان یه تریگر با همین کدها نوشتم با توجه به ستونهای جدولم ولی چرا اعمال نمیشه؟
اینم تریگرمه:

CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @value int;
select @ID = ID from INSERTED
set @value = (SELECT [@value] FROM INSERTED)
if @value = 0
begin
delete from Table_1 where ID = @ID
END
END
GO


جداول inserted و deleted کجا هستند؟ وچه کاربردی دارن؟

fakhravari
جمعه 29 دی 1391, 11:46 صبح
inserted و deleted مقدار خروجی رکورد هستند که تغیرات روس اعمال شده.
تست بزن
CREATE TRIGGER [Chek0]
ON Table_1
AFTER Update
AS
BEGIN
SET NOCOUNT ON;
if (COLUMNS_UPDATED()> 0)
begin
declare @ID bigint;declare @value int;
select @ID = ID from INSERTED
set @value = (SELECT [@value] FROM INSERTED)
if @value = 0
begin
delete from Table_1 where ID = @ID
END
END
END

reza69
جمعه 29 دی 1391, 13:49 عصر
ارور میده و از @value ایراد میگیره
98590
بعد از اجرا هیچی تو جدول پاک نمیشه.
اینم جدولم:
98591
بعد از اینکه کد رو مینویسی داخل تریگر باید چه کارهایی بکنی که به جدول اعمال بشه؟ میشه مرحله به مرحله بگید؟

fakhravari
جمعه 29 دی 1391, 14:18 عصر
این قسمت تصحیح کنید
set @value = (SELECT [@value] FROM INSERTED)

set @value = (SELECT [value] FROM INSERTED)
@ نیاز نیست در SELECT .
بعد f5 بزنید تا تریگر ساخته شود.
بعد با هر دستکاری مقادیر این تریگر چک میشود روی تغیرات فقط

reza69
جمعه 29 دی 1391, 22:23 عصر
خیلی ممنون انجام شد.
یه سوال : رکوردی که پاک میشه چجوری با استفاده از تریگر deleted باید بازگردانی بشه؟

mehdi.mousavi
شنبه 30 دی 1391, 05:23 صبح
سلام.
متاسفانه یکی از اشتباهاتی که عموم افراد مرتکب میشن اینه که فرض می کنن جداول INSERTED و DELETED نمی تونن حاوی بیش از یک Record باشن. این فرض اشتباه هستش و منجر به نوشتن کدهای نادرست میشه. کدی که شما نوشتید نیز کد صحیحی نیست و ایرادهای فراوانی داره. از این گذشته، شما باید در Business Logic خودتون وقتی متوجه شدید که مقدار فیلد صفر شده، دیگه اون فیلد رو Update نکنید، بلکه یک ضرب Delete اش کنید تا بدین ترتیب نیازی به نوشتن Trigger نیز نداشته باشید.

موفق باشید.

fakhravari
شنبه 30 دی 1391, 12:11 عصر
سلام اقای موسوی
خب اینو مپسپوریم به تریگر .
اره از نظر شما باید در برنامه شرط بزاریم که true شد اونو رکورد حذف کنه.
در کل منظور شما همین بود دیگه:لبخند:

reza69
شنبه 30 دی 1391, 18:21 عصر
سلام.
متاسفانه یکی از اشتباهاتی که عموم افراد مرتکب میشن اینه که فرض می کنن جداول INSERTED و DELETED نمی تونن حاوی بیش از یک Record باشن. این فرض اشتباه هستش و منجر به نوشتن کدهای نادرست میشه. کدی که شما نوشتید نیز کد صحیحی نیست و ایرادهای فراوانی داره. از این گذشته، شما باید در Business Logic خودتون وقتی متوجه شدید که مقدار فیلد صفر شده، دیگه اون فیلد رو Update نکنید، بلکه یک ضرب Delete اش کنید تا بدین ترتیب نیازی به نوشتن Trigger نیز نداشته باشید.
موفق باشید.
میشه همه ایراداشو بگید؟با دلیل
خب این کد هم یکجا حذف میکنه دیگه.
چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟

fakhravari
شنبه 30 دی 1391, 18:36 عصر
میشه همه ایراداشو بگید؟با دلیل
خب این کد هم یکجا حذف میکنه دیگه.
چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟

از داخل برنامه یه دستور دلیت دیگه:اشتباه:

محمد سلیم آبادی
شنبه 30 دی 1391, 18:38 عصر
سلام
من میخوام بعد از اینکه یک فیلد که از نوع int هست مقدار 0 گرفت سطر مربوطه پاک بشه.
چه کار باید بکنم؟
سلام،
اصلا چرا باید درج بشه که بخواد بعدا پاک بشه؟!
به هر حال یک قید check روی ستون مذکور قرار بدین که مانع از گرفتن مقدار صفر بشه.

ALTER TABLE table_name
ADD CONSTRAINT checker
CHECK (column_name <> 0);

reza69
شنبه 30 دی 1391, 21:47 عصر
سلام،
اصلا چرا باید درج بشه که بخواد بعدا پاک بشه؟!
[/SQL]
دوست من این مقدار ستون در ابتدا صفر نیست ولی به تدریج موقعی که صفر میشه دیگه این رکورد در برنامه کارایی نداره و باید پاک شه.
این مقدار اجناس داخل انباره به تدریج که جنسهامونو میفروشیم و تموم میشه باید رکورد این کالا از جدول حذف بشه.
OK?

reza69
یک شنبه 01 بهمن 1391, 20:35 عصر
چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟

mehdi.mousavi
دوشنبه 02 بهمن 1391, 09:48 صبح
میشه همه ایراداشو بگید؟با دلیل خب این کد هم یکجا حذف میکنه دیگه. چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟


چجوری بدون استفاده از تریگر این عملیات رو انجام بدیم؟ حالا اگه از تریگر استفاده کنیم چی میشه؟

سلام.
من نگفتم 100% از Trigger استفاده نکنید، برخی اوقات بنا به دلائل مختلف مجبورید اینکارو کنید؛ مساله این هستش که اگر میتونید ازش پرهیز کنید، اینکارو کنید. در مورد شما، بنظر میرسه اینکار بسادگی در Business Logic Layer میسر باشه. به بیان دیگه، وقتی در کدتون متوجه میشید که فیلد مورد نظر از اون رکورد باید به صفر Update بشه، جای اینکه دستور UPDATE رو به SQL Server ارسال کنید، دستور DELETE رو ارسال کنید تا رکورد مورد نظر حذف بشه.

در مورد اون Trigger هم به گمان اصل مساله رو توضیح دادم، مشکل اصلی این هستش که فرض شده جدول DELETED حاوی یک Record هستش (در حالیکه میتونه اینطور نباشه). به گمانم با این توضیح میتونید Trigger نوشته شده رو تغییر بدید و ازش استفاده کنید. اما باز هم اگر موفق نشدید لطفا بگید تا اینکارو براتون انجام بدم.

موفق باشید.

reza69
دوشنبه 02 بهمن 1391, 09:59 صبح
دوست عزیز من
مشگل جدید من اینکه میخوام رکوردی که به اشتباه حذف شده به جدولم برگردونم و نمیدونم کدش چجوری میشه؟ حالا با تریگر یا بدون اون نمیدونم.
ببینید این قطعه کد کمک میکنه؟ اگه شما کدی دارید که با استفاده از پروسیجر یا تریگر این کارو میکنه بگید. جدولم 2 تا ستون id و name داره.

AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
declare @ID int;declare @name nvarchar;
set @ID = (SELECT @ID FROM DELETED)

set @name = (SELECT name FROM DELETED)
Insert Into mytable ([Log]) values(@Name +' '+CAST(@ID as nvarchar)+' : [AFTER DELETE]');

fakhravari
دوشنبه 02 بهمن 1391, 18:26 عصر
خب دستور دلیت که نباید اشتباه بشه:گیج:. کاربر باید بفهم خودش دیگه.
با دستورات بالا یک جدول لاگ دارید که کپی رکورد در جدول لاگ درج میکنه.

fakhravari
دوشنبه 02 بهمن 1391, 18:27 عصر
سلام.
در مورد اون Trigger هم به گمان اصل مساله رو توضیح دادم، مشکل اصلی این هستش که فرض شده جدول DELETED حاوی یک Record هستش (در حالیکه میتونه اینطور نباشه). به گمانم با این توضیح میتونید Trigger نوشته شده رو تغییر بدید و ازش استفاده کنید. اما باز هم اگر موفق نشدید لطفا بگید تا اینکارو براتون انجام بدم.
موفق باشید.
اقای موسوی پس بعضی اوقاط خالی میده :متفکر: خب چاره چی هست

reza69
دوشنبه 02 بهمن 1391, 20:38 عصر
خب دستور دلیت که نباید اشتباه بشه:گیج:. کاربر باید بفهم خودش دیگه.
با دستورات بالا یک جدول لاگ دارید که کپی رکورد در جدول لاگ درج میکنه.
حالا شاید کاربر اشتباهی یه رکورد رو دلیت کنه آدم باید فکر همه جای برنامه رو بکنه دیگه حالا بگذریم.
این کد فقط برای تریگر هست؟
من یه کدی میخوام برای پروسیژر.