View Full Version : تریگر و قفل رکورد !؟
ali190
شنبه 08 مرداد 1390, 00:20 صبح
باسلام و عرض خسته نباشید
در یک پست خوندم:
تریگرها امکاناتی هستند بسار مفید؛مثلا یک بانک اطلاعاتی رو درنظر بگیر که تحت شبکه داره استفاده میشه 2تا کاربر همزمان یکی،یک سری اطلاعات رو میخواد پاک کنه،نفردوم همون اطلاعات رو میخواد ویرایش کنه،در همچین مواردی از تریگرها استفاده می کنند.تا در آن واحد قبل از انجام یک دستور عملیات پیش زمینه انجام شود.بطور مثال در شرایط بالا زمانی که فردی اطلاعات رو میخواد ویرایش کنه قبلش توسط تریگر نوشته شده،فایل رو برای دیگران قفل میکنه که کسی روی فایل عملی مثل حذف رو نتونه انجام بده
این کار رو در یک مثال واقعی و عملی چطور میتوان انجامش داد؟
ممنون میشم قضیه رو باز کنید
یاعلی
AminSobati
یک شنبه 09 مرداد 1390, 00:06 صبح
سلام دوست عزیزم،
این عجیب ترین کاربردی بود که تا به حال در مورد Trigger شنیده بودم! شما دقیقا هدفتون چیه و چه کاری میخواین انجام بدین
Kubuntu
دوشنبه 10 مرداد 1390, 17:39 عصر
کار تریگر این نیست! تریگرها رویه هایی هستند که در هنگام تغییر داده های جدول فعال می شوند و از ورود داده های نامعتبر جلوگیری می کنند.
مثلا دو جدول رو در نظر بگیرید، فیلدی هم در جدول الف و هم در جدول ب است یعنی همون کلید خارجی و اصلی! شما می خواهید کلید اصلی جدول الف را تغییر یا حذف کنید در این صورت مقدار فیلدی که در جدول ب بعنوان کلید خارجی است نامعتبر می شود.
این اتفاق زمانی می افتد که کلید اصلی حاوی اطلاعات باشد و آتونامبر نباشد! برای جلوگیری از این خطا بهتر است در طراحی جداول خود تجدید نظر کنید یعنی بجای استفاده از فیلد حاوی اطلاعات، یک فیلد دیگر اضافه کرده و identity آنرا برای آتونامبر بودن yes کنید. در این حالت دیگر نیاز به استفاده از تریگر نخواهید داشت چون از معایت تریگر افزایش I/O است!
فراموش نکنید: چنانچه از آتونامبر برای کلید اصلی استفاده می کنید قبل از حذف رکورد با پرسجو چک کنید آیا در جدول مرتبط استفاده شده است یا نه! اگر استفاده شده بود به کاربر اجازه حذف ندهید.
مزیتی که علی جان بیان کردن مربوط به DBMS = database managment system می شود , DBMS درون بانک اطلاعاتی(مثل sql server , غیره) قرار دارد و لازم نیست شما کاری انجام بدید چون خودش خودکار تمام کارهایی که علی گفتن رو انجام میده.
موفق باشید
eof_programming
چهارشنبه 12 مرداد 1390, 10:03 صبح
قایل توجه دوست بالا
اینکه بخوای از توی یه جدول کلید رو حذف کنی و توی جدول دیگه که کلید خارجیه error نیاره، با فعال کردن Cascade Delete این اتفاق می افته و هیچ احتیاجی به تریگر نیست.
اما اونی که علی پرسید باید Process تعریف کنی. هر processی یه جا شروع میشه و یه جا تموم. وقتی که کاربر میخاد یه رکورد رو ویرایش کنه process ویرایش فعال میشه. باید جوری بنویسی که رکورد رو قفل کنه و تا آخر تغییر اطلاعات قفل روش باشه تا یکی دیگه نتونه اون رو پاک کنه. این کار رو هیچ وقت DBMS یا هر چیز دیگه ای اتومات انجام نمیده.
Kubuntu
چهارشنبه 12 مرداد 1390, 10:40 صبح
من با توجه به کتابهای درسی دانشگاهی گفتم. و هنوزم سر حرفم هستم، لطفا حرف من رو با دلیل و کد رد کنید. سپاس!
راجع به process یا رویه که فرمودید، همه رویه هادر برنامه معمولی یا بانک اطلاعاتی یه آغاز و یک پایان دارند، اما در بانک موفقیت یا عدم موفقیت یک عمل خیلی مهمه!! در بانک اطلاعاتی به هر عملی تراکنش می گن. به این معنی که اگر پایان تراکنش ناموفقیت بود بصورت خودکار در پایگاه عمل roll back اتفاق می افته! دقیقا این اتفاق رو به وضوح در بانکها دیده می شه، اگه انتقال پول تا آخرین مرحله به پایان نرسه، هرچند که پیغام انتقال وجه می ده اما چون رویه تا آخر نرفته و ناموفق بوده، عمل roll backاتفاق می افتد و وجهی جابجا نمی شود و تمام تغییرات داده به حالت اولشون بر می گردند.
حمیدرضاصادقیان
چهارشنبه 12 مرداد 1390, 11:20 صبح
اما اونی که علی پرسید باید Process تعریف کنی. هر processی یه جا شروع میشه و یه جا تموم. وقتی که کاربر میخاد یه رکورد رو ویرایش کنه process ویرایش فعال میشه. باید جوری بنویسی که رکورد رو قفل کنه و تا آخر تغییر اطلاعات قفل روش باشه تا یکی دیگه نتونه اون رو پاک کنه. این کار رو هیچ وقت DBMS یا هر چیز دیگه ای اتومات انجام نمیده.
دوست عزیز با این تعاریفی که شما کردید میشه بفرمائید وقتی ما یک Select معمولی از یک جدول میگیریم یا وقتی Update روی جدولی انجام میدیم که مثلا 2-3 دقیقه زمان میبره ، چرا نمیشه با اون جدول کار کرد؟ یا درلیست Lock ها اسم کاربران چی هست؟ ممنون میشم توضیح بفرمائید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.