PDA

View Full Version : حرفه ای: تغییر اطلاعات



araz_pashazadeh
چهارشنبه 31 شهریور 1389, 10:41 صبح
با عرض سلام وخسته نباشید خدمت دوستان
من در یکی از جداول اطلاعاتی به شکل زیر دارم می خوام وقتی اطلاعاتی از این جدول حذف شد همه شماره ردیفهای موجود در این جدول یکی کم بشن
ردیف نام
1 آراز
2 احسان
3 حسام
4 جابر
مثلا وقتی احسان حذف شد اطلاعات به شکل زیر مرتب باشن:
ردیف نام
1 آراز
2 حسام
3 جابر
پرس وجوی که نوشتم به شکل زیر هستش:

UPDATE TableO
SET ID=ID+1
WHERE ID IN (SELECT ID
FROM TableO
WHERE ID>2)
و این پرس وجو برام درست کار می کنه.
مشکل ایجاست که من این پرس وجو را می خوام داخل تریگر قرار بدم وبه ارضا هر حذف برروی جدول اعمال بشود و برای این کار باید قسمت مربوط به شرط متغییر باشه یعنی به شکل زیر:

UPDATE TableO
SET ID=ID+1
WHERE ID IN (SELECT ID
FROM TableO
WHERE ID>@ID)
ولی تریگرها پارامتر دریافت نمکنن.
برای انجام این کار من به چه شکلی عمل کنم بهتر :متفکر:
لطفا من را راهمنایی کنین.

Rezahak
چهارشنبه 31 شهریور 1389, 11:11 صبح
کل فیلدهای رکوردی که می خواهد حذف شود در یک جدول به نام deleted نگهداری می شود شما می توانید ID رکورد حذف شده را از آن بخوانید فقط توجه داشته باشید این جدول تنها در محیط trigger معتبر می باشد
برای توضیحات بیشتر به MSDN مراجعه کنید

araz_pashazadeh
چهارشنبه 31 شهریور 1389, 11:23 صبح
کل فیلدهای رکوردی که می خواهد حذف شود در یک جدول به نام deleted نگهداری می شود شما می توانید ID رکورد حذف شده را از آن بخوانید فقط توجه داشته باشید این جدول تنها در محیط trigger معتبر می باشد
برای توضیحات بیشتر به MSDN مراجعه کنید

مشکل اینجاست که من نمی توتنم به اون جدول دسترسی پیدا کنم؟
حتی به MSDN هم نگاه کردم ولی مطلبی در این مورد پیدا نکردم اگه شما یه مثال کوچیک بزنید یا راهنمایی کنین ممنون می شم.

araz_pashazadeh
چهارشنبه 31 شهریور 1389, 17:41 عصر
من تریگری به شکل زیر نوشتم نظرتون چیه:


CREATE TRIGGER [dbo].[SetOrder]
ON [dbo].[Temp]
INSTEAD OF DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

DECLARE @TempId int;
SELECT @TempId=Id FROM DELETED;

INSERT INTO araz(id)
VALUES(@TempId);
END

Rezahak
چهارشنبه 31 شهریور 1389, 20:21 عصر
خب چرا توی همین trigger همون دستور update رو که توی چند تا پست بالا تر نوشتید رو نمی نویسید البته به جای ID@ بنویسید
SELECT Id FROM DELETED

araz_pashazadeh
شنبه 03 مهر 1389, 10:31 صبح
من این تریقر را نوشتم:
CREATE TRIGGER [dbo].[DeleteUpdate]
ON [dbo].[TB_Object]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

BEGIN TRY
BEGIN TRANSACTION

UPDATE TB_Object
SET Radif=Radif-1
WHERE Radif>(SELECT Radif FROM DELETED)

COMMIT TRANSACTION
END TRY

BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
وقتی می خوام 1سطر از دادهها را حذف کنم درست کار می کنه اما وقتی تعداد دادهای که قرار حذف بشن بیشتر از 1سطر میشه خطا میده و اجرا نمیشه.
برای حل این مشکل چه راه حلی پیشنهاد می کنین؟

Rezahak
شنبه 03 مهر 1389, 11:04 صبح
کار حذف بیش از یک ردیف را داخل Transaction انجام می دهید؟؟

salimim
یک شنبه 04 مهر 1389, 08:43 صبح
سلام
شايد روش مناسب تر اين باشه كه اصلا ستوني براي ID نداشته باشيد و در selectها از RANK استفاده كنيد.

araz_pashazadeh
یک شنبه 04 مهر 1389, 12:22 عصر
کار حذف بیش از یک ردیف را داخل Transaction انجام می دهید؟؟
بله.
چطور مگه؟
به نظر شما اشکالی داره؟

araz_pashazadeh
چهارشنبه 07 مهر 1389, 13:34 عصر
سلام
شايد روش مناسب تر اين باشه كه اصلا ستوني براي ID نداشته باشيد و در selectها از RANK استفاده كنيد.
دوست عزیز من منظور شما را متوجه نشدم؟
کمی بیشتر توضیح بدین.

Rejnev
چهارشنبه 07 مهر 1389, 13:42 عصر
احیانا نمیخوای آخرین شخص رو تغییر بدی بجای اینکه همه رو به بالا شیفت بدی؟
مثلا اگه احسان حذف شد، جابر بیاد جاش بشینه
-- اگه نه که میتونی از RomNumber استفاده کنید(سرچ کن)