PDA

View Full Version : به دست آوردن مقدار از یک تراکنش در حال اجرا



luckyboy77
سه شنبه 23 تیر 1394, 18:00 عصر
سلام به دوستان گرامی
اول غذر خواهی میکنم چون با جستجو چیزی پیدا نکردم
امام مسئله: 2 تا جدول دارم که با اجرای یک تراکنش چند سطر به این جدول ها قرار اضافه بشه. مشکل وقتی پیدا میشه که در جدول اول یک فیلد identity وجود داره و من باید مقدار این فیلدو در جدول دوم درج کنم. اما از اونجا که تا تراکنش Commit نشه به جدول اولم سطری اضافه نمیشه نمیدونم چطوری باید مقدار این فیلدو بخونم.
مسلما داده در یک جایی ذخیره میشن تا بعد از Commit شدن توی جدول درج بشن. از دوستان کسی میدونه چطور میشه به این داده ها دسترسی پیدا کرد.
یا هر راه حل دیگه ای که مشکل منو حل کنه.
سپاسگذارم

tooraj_azizi_1035
چهارشنبه 24 تیر 1394, 08:58 صبح
سلام
شما مي تونيد يك تريگر AFTER INSERT روي جدول اول بنويسيد و در اون تريگر به اين شكل آخرين مقدار درج شده در جدول اول رو بدست بياريد:

SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;

luckyboy77
چهارشنبه 24 تیر 1394, 12:28 عصر
سلام
بسیار ممنون بابت لطفتون.
فقط دوتا سئوال
1- جدول های منطقی INSERTED و ... فقط توی تریگر قابل دسترسی هستند؟
2- آیا تراکنش قبل از Commit شدن سطری به جدول INSERTED اضافه میکنه یا نه؟

ممنون از پاسختون

SabaSabouhi
چهارشنبه 24 تیر 1394, 12:31 عصر
سلام به دوستان گرامی
اول غذر خواهی میکنم چون با جستجو چیزی پیدا نکردم
امام مسئله: 2 تا جدول دارم که با اجرای یک تراکنش چند سطر به این جدول ها قرار اضافه بشه. مشکل وقتی پیدا میشه که در جدول اول یک فیلد identity وجود داره و من باید مقدار این فیلدو در جدول دوم درج کنم. اما از اونجا که تا تراکنش Commit نشه به جدول اولم سطری اضافه نمیشه نمیدونم چطوری باید مقدار این فیلدو بخونم.
مسلما داده در یک جایی ذخیره میشن تا بعد از Commit شدن توی جدول درج بشن. از دوستان کسی میدونه چطور میشه به این داده ها دسترسی پیدا کرد.
یا هر راه حل دیگه ای که مشکل منو حل کنه.
سپاسگذارم

سلام
دوست عزیز، اگه داخل تراکنش بخواهی جدول دوم رو پر کنی، هیچ مشکلی پیش نمیاد و اونجا به مقدار Identity دسترسی
داری ( که درستش اینه که همین کار رو بکنی )
ولی اگه بیرون از تراکنش بخواهی مقدار رو داشته باشی، غیر ممکن هست و غیر اصولی، چون در صورتی که تراکنش
rollback بشه، مقداری که گرفتی بی‌معنا خواهد بود.

داخل تراکنش می‌تونی پس از Insert کردن تو جدولت با فرمان ( 'SELECT IDENT_CURRENT( 'MyTableName مقدار Identity
رو بخونی و تو جدول دوم درج کنی.

صبا صبوحی

SabaSabouhi
چهارشنبه 24 تیر 1394, 12:37 عصر
سلام
بسیار ممنون بابت لطفتون.
فقط دوتا سئوال
1- جدول های منطقی INSERTED و ... فقط توی تریگر قابل دسترسی هستند؟
2- آیا تراکنش قبل از Commit شدن سطری به جدول INSERTED اضافه میکنه یا نه؟

ممنون از پاسختون

سلام
لطف کن و پرسش‌های مختلف رو تو تاپیک‌های مختلف مطرح کن.
و اما پاسخ:
بله، جدول‌های منطقی Inserted, Deleted فقط داخل Trigger وجود دارن.
این جدول‌ها داخل Trigger به شما این امکان رو می‌دن که با اطلاعاتی که به تازگی به جدول اضافه‌ شده‌اند
کار کنی. یعنی وقتی داخل Trigger از نوع After Insert می‌شی، Inserted شامل سطرهایی هست که
به جدول اضافه شده‌اند! یعنی می‌تونی دو جدول Inserted و جدول اصلی رو Join کنی، این سطرها تو هر دو جدول
وجود دارن.

توجه داشته باش که هر عمل ( Insert, Update, Delete ) تو SQL تو یه Transaction انجام می‌شه و به همین دلیل
هست که توی Trigger می‌تونی با فرمان Rollback کار رو لغو کنی. ( مثلاً تو Trigger بسته به شرایط اجازه‌ی حذف ندی )

صبا صبوحی

tooraj_azizi_1035
چهارشنبه 24 تیر 1394, 12:51 عصر
مسلما داده در یک جایی ذخیره میشن تا بعد از Commit شدن توی جدول درج بشن.


بله تا قبل از Commit در Buffer Pool در Page مربوطه تغییرات ثبت می شود و در لحظه Commit یک رکورد Log در فایل .ldf ثبت و در این لحظه Commit موفقیت آمیز اعلام می شود.



1- جدول های منطقی INSERTED و ... فقط توی تریگر قابل دسترسی هستند؟

بله.



آیا تراکنش قبل از Commit شدن سطری به جدول INSERTED اضافه میکنه یا نه؟

تراکنشی که باعث fire شدن Trigger می شود به همراه دستورات خود Trigger همه با هم یک تراکنش محسوب می شوند به همین دلیل شما می توانید در داخل تریگر تراکنش را rollback کنید و درج در جدول inserted فارغ از اینکه تراکنش commit می شود یا خیر انجام می شود پس حتی در صورت rollback هم درج در جدول inserted انجام می شود.

abolfazl-z
چهارشنبه 24 تیر 1394, 19:48 عصر
از دستور زیر هم میتونین استفاده کنین :

declare @newid int;
SELECT top 1 @newid=[uid]+1 FROM [users] WITH (TABLOCKX) order by [uid] desc
select @newid;