PDA

View Full Version : مطلع شدن برنامه از تغییرات database



asilverisis
شنبه 09 تیر 1386, 13:12 عصر
سلام
چطور میشه کاری کرد که برنامه بلافاصله پس از هر تغییر در دیتا بیس(Sql Server)
مطلع بشه.
فرض بر اینه که برنامه تحت شبکه کار می کنه و حالا باید برنامه ای که روی Server در حال اجراست از هر تغییری که در دیتابیس توسط هر کاربری ایجاد میشه مطلع بشه.

با تشکر قبلی از دوستان.

Behrouz_Rad
شنبه 09 تیر 1386, 19:04 عصر
کاری که میخوای انجام بدی، Query Notification نامیده میشه که قابلیت جدیدی در SQL Server 2005 هست.
در همین رابطه میتونی مقاله ای در وبلاگ من بخونی:
http://brad.barnamenevis.org/?p=23

موفق باشید.

asilverisis
چهارشنبه 27 تیر 1386, 12:32 عصر
سلام
با تشکر
ولی آیا این کار با SQL SERVER 2000 هم امکان پذیر هست؟؟؟

titbasoft
چهارشنبه 27 تیر 1386, 13:07 عصر
خیر، خودتون بایستی شبیه سازی کنید

asilverisis
چهارشنبه 27 تیر 1386, 17:16 عصر
با سلام
امیدوارم منظورتون از شبیه سازی استفاده از Timer نباشه!!
ممنون میشم اگر منظورتون رو از شبیه سازی واضح تر بیان کنید.

RezaKia
چهارشنبه 27 تیر 1386, 21:29 عصر
سلام،

بستگی داره برنامه Internet Enabled باشه یا نه.

اگه باشه میشه اینکار رو براحتی انجام داد. اگه نبود اونوقت بازم بستگی داره: :چشمک:
اگه اجازه نصب Extended Stored Procedure داشته باشی یا نه.
اگه داشتی بازم میشه ولی سخت تر میشه.

اگه نداشتی بازم بستگی داره: :خجالت:
این که بتونی با SQL DMO کار بکنی و سرور اجازه دسترسی بهش بده یا نه.
اگه تونستی کار کنی و سرور هم اجازه داد بازم میشه ولی دیگه خیلی سخت تر میشه.

اگه نتونستی یا سرور این اجازه رو نمیده این دفعه بستگی داره :متعجب: به این که بلد باشی با روش File System Change کار بکنی یا نه.


اول معلوم کن تو کدوم بستگی داره قرار میگیری بعد معلوم میشه باید چکار کنی.





Query Notification نامیده میشه که قابلیت جدیدی در SQL Server 2005 هست



این مطلب هم مثل تمام امکانات دیگه که به نظر در SQL 2005 تازه بحساب میان، تو نسخه SQL 2000 هم ممکنه ولی بستگی داره بلد باشی یا نه :قهقهه:

titbasoft
پنج شنبه 28 تیر 1386, 11:45 صبح
لطفا موارد زیر رو کمی بیشتر توضیح بدید:
این یعنی چی؟
Internet Enabled باشهحالا اگر بود چطوری
اگه باشه میشه اینکار رو براحتی انجام داد. اگه نبود اونوقت بازم بستگی داره:میشه؟


اگه نداشتی بازم بستگی داره: :خجالت:
این که بتونی با SQL DMO کار بکنی و سرور اجازه دسترسی بهش بده یا نه.
اگه تونستی کار کنی و سرور هم اجازه داد بازم میشه ولی دیگه خیلی سخت تر میشه.
این افعال همشون مثبت هستند؟

این رو هم مختصر توضیحی لطف می کنید؟
به این که بلد باشی با روش File System Change کار بکنی یا نه.
این مطلب هم مثل تمام امکانات دیگه که به نظر در SQL 2005 تازه بحساب میان، تو نسخه SQL 2000 هم ممکنه ولی بستگی داره بلد باشی یا نه

RezaKia
جمعه 29 تیر 1386, 00:35 صبح
Internet Enabled یعنی بتونه از پروتکلهای مربوط به Internet استفاده کنه. مثل Windows Media Player یا WinAmp یا Microsoft Update.
هیچ کدوم الزاماً نیاز به internet ندارن ولی میتونن با سرور ارتباط داشته باشند.

کلاً برای Query Notification 2005 که همون File System Change تو 2000 حساب میشه باید به این روش ها عمل کنید:

1. SQLDMO: این امکان رو بهتون میده که دسترسی مستقیم به داده ها داشته باشید.
خیلی از کارهایی که با TSQL نمیشه انجام داد اینجا ممکنه. مثلاً با TSQL نمیتونید اطلاعات رو از دو دیتابیش و با دو نام کاربری متفاوت همزمان در یک Select مصرف کنید ولی با SQLDMO میشه.

البته OpenRowSet و OpenDataRow مال SQLDMO هستند که اشتباهاً بعضی اونارو تو TSQL لیست میکنن.

کلاً هرچی که نیاز به تنظیم و تغییرات در حداقل های SQL رو بخواد مال SQLDMO است.

نکته: SQLDMO در 2005 تبدیل به همون توابع دات نت شدن که میشه تو SQL مصرف کرد. یعنی ماهیت همونه ولی روش اجرا فرق کرده.


2. یک سرویس رو سرور بزاری که توسط SQL ودر Job با فعال سازی این سرویس تغییرات را اعلان کند.
برای اینکار باید Agent فعال باشه و شما تو Job تعریفی، این سرویس رو اجرا کنید. حالا تو Trigger مربوط به Table مورد نظر این Job را اجرا کنید.
تو 2000 به طور پیش فرض Job اجازه اجرا سرویس و یا فایل اجرایی با پارامتر ورودی را دارد. اگه نمیتونی سرویس بنویسی یک برنامه Windows Application به هر زبونی که بلدی بنویس با پارامتر ورودی معلوم کن چی تغییر کرده. بعد اون برنامه باید ماشین مقصد رو پیدا کنه و فایل یا سرویس خاصی رو اجرا کنه که این آخری باید به برنامه شما تغییر رو اعمال کنه.

واسه اینکار راحترین روش استفاده از Mutex هستش.
برنامه کاربر با اولین اجرا اونو میسازه ولش میکنه بحال خودش. سرویس مربوطه رو کامپیوتر کاربر این Mutex رو قفل میکنه تا تغییر اعلام بشه. برنامه متوجه قفل شدن میشه و فوراً تقاضا آزاد شدن میده. Windows بعداز گذشت زمان قفل بودن که تو لحظه ساخت تعیین کردید و بهتره کسری از صدم ثانیه باشه اونو آزاد و به سرویس دستور خاتمه کار میده. سرویس کارشو تموم میکنه و قفل رو برمیداره. حالا برنامه اونو قفل میکنه و فوراً باز میکنه تا سرویس بتونه تغیییرات بعدی رو اعلان کنه. از این لحظه برنامه باید پارامترهای دریافتی از Mutex رو بخونه و بفهمه چی تغییر کرده.

اما عملیات در سمت سرور:
یک سرویس یا برنامه با تغییر در داده ها توسط SQL اجرا میشه.
حالا بسته به یک یا چند کاربره بودن برنامه، باید به یک روش محل ماشین مقصد و البته آدرس Port سرویس کابر رو بدست بیاره و صداش کنه. حتماً تو این فراخوانی اجازه نمایش خطا به کاربر رو از برنامه بگیرید. مثلاً با Try... Catch یا On Error Resume Next چون احتمال داره کاربر ماشینش در دسترس نباشه یا سرویس فعال نباشه و یا ... اگه خطا رو ندید نگیری، SQL تا زمان معلوم شدن تکلیف این خطا هیچ کاری حتی Login رو هم از همه Connection ها میگیره؛ حتی اگه این کار چند ساعت طول بکشه. امتحان نکن چون ممکنه دیگه Engine بالا نیاد ومجبور شی اونو دوباره نصب کنی تازه اونم با دردسر چون باید رد پای خطا رو از Registry برداری تا نسخه جدید هم قفل نشه. :افسرده:

3. روش آخری یعنی File System Change:
یک سرویس بنویس که تغییر کردن یک فایل متنی ساده درون یک شاخه معلوم الحال (Temp) رو چک کنه. تا تغییر کرد متن اونو بخونه و بعد کل محتویات فایل رو خالی کنه ودوباره منتظر بشه. در حالی که متن خوانده شده باید شامل مشخصات داده های تغییر کرده باشه و بعد از خالی کردن فایل باید به برنامه کابر اعلام کنه. که اونم میتونه به همین روش متوجه تغییرات بشه؛ یعنی منتظر تغییرات یک فایل متنی تو کامپیوتر کاربر باشه. اگر تک کاربره هست این سرویس لازم نیست میتونی مستقیماً فایل رو سرور رو با برنامه چک کنی و مجوز دسترسی رو یادت نره تنظیم کنی.

تو SQL هم با یک Job این فایل رو پر میکنی.



اما نکته مهم تو هر سه روش اینه که اگه سرور دست خودته یا مجوز نصب Extended Proucedure داری بهترین راه اینه که کل کار سمت سرور رو ببری تو یک کلاس و اونو بعنوان Extended Procedure بدی به SQL Server.
اینجوری تو Trigger اون رو صدا میزنی و بقیه کارها که مثل بالا هست. دیگه نیاز به Job و Agent هم نداری.

در ضمن این نکته آخری در 2005 اسمش شده Assembly و از اون روشهای بالا هم روش دوم همون روش Notification خود 2005 هست.

titbasoft
جمعه 29 تیر 1386, 19:00 عصر
پاسخ دادن به پست قبل نیاز داره تا به اندازه یک کتاب حرف زد. از آقای ثباتی خواستم تا ایشون راهنمایی کنن.

AminSobati
جمعه 29 تیر 1386, 22:54 عصر
سلام
با تشکر
ولی آیا این کار با SQL SERVER 2000 هم امکان پذیر هست؟؟؟

سلام به همه دوستان،
با توجه به عدم وجود SQL Service Broker در نسخه 2000، شبیه سازی کردن Notification و اطلاع رسانی به سمت کلاینت نیاز به Socket Programming داره که کار پر دردسریه. در کل من جای شما باشم وقتم رو براش هدر نمیدم. همون وقت رو صرف Upgrade به 2005 کنید دهها منفعت دیگه هم بدست میارین!

اَرژنگ
شنبه 30 تیر 1386, 04:10 صبح
استفاده از یک لایه میانی برایه ارتباط با داتابیس کاری به استفاده از کدام ورژن داتابیس نداره.
داتابیس وظیفه‌اش فقط اینه که داتا را نگهداری کنه و برگردانه، حالا هر چقدر هم شاخ و برگش بدند بازهم داتابیس وظیفه‌اش عوض نمیشه و استفاده کردن از داتابیس برایه کارهایی که طراحی نشده درست نیس.

اَرژنگ
شنبه 30 تیر 1386, 20:31 عصر
دوستان، برنامه نویسان عزیز، من نمیدونم اینجا چه خبره و چرا پستم پاک شد، ولی ازشان دلیل لازم ندارم ، ما هر وقت دلمان میخواد میایم اینجا کیفی پست میزنیم ، ولی همه از مدیرها توقع دارند که فوری جواب بدند و همه کاربران را راضی نگه دارند و کیفیت فروم را هم بالا نگه دارند!
من میگم قبل از اینکه به مدیرا بتونیم اشکال بگیریم باید حداقل ۲۰۰۰ پست جواب داده باشیم.

AminSobati
شنبه 30 تیر 1386, 21:16 عصر
استفاده از یک لایه میانی برایه ارتباط با داتابیس کاری به استفاده از کدام ورژن داتابیس نداره.
داتابیس وظیفه‌اش فقط اینه که داتا را نگهداری کنه و برگردانه، حالا هر چقدر هم شاخ و برگش بدند بازهم داتابیس وظیفه‌اش عوض نمیشه و استفاده کردن از داتابیس برایه کارهایی که طراحی نشده درست نیس.
دوست عزیزم نسل نوین بانکهای اطلاعاتی دیگه مثل Main Frameهای قدیمی صرفا انبار اطلاعات نیستند. به تدریج بسیاری از عملیات از سایر لایه ها به دیتابیس منتقل شدن و این روند هنوز هم ادامه داره. فرضا انتقال اشیاء به دیتابیس باعث پیدایش Object Relational DBMS شد یا همین Service Broker در حقیقت SQL Server رو تبدیل به یک Messaging Application قدرتمند کرد.
اما هر نسخه از بانکهای اطلاعاتی، توانایی ها و کمبودهایی داره. متاسفانه انتظار Query Notification از SQL Server 2000 چیز بجایی نیست و نمیشه به شکل ایده آل مثل 2005 پیاده سازی کرد.

Reza1607
شنبه 11 اردیبهشت 1389, 01:36 صبح
سلام دوستان
اگه امکانش هست یک مثال از Query Notification برام بذارید و اگه کمی دربارش توضیح بدید خیلی عالی میشه

اینم جی میل من
rz.zare@gmail.com
ممنون