View Full Version : یه نوع simulation
hamed_bostan
دوشنبه 21 اسفند 1385, 14:03 عصر
با سلام
این سوال واسه من حیلی مهمه ممنون میشم راهمنمایم کنین:
کاری که sql profiler میکنه رو دیگه همه بلدین و دیدین
من می خوام ازطریق یه استورد پروسیجر یا .... بتونم دستوراتی رو که روی دیتابیسم اعمال میشه با مقادیرش زخیه کنم و تاریه اجرا یعنی اگه من رفتم توی query analyzer و نوشتم :
INSERT INTO TABLE1 (USR_NM,USR_PSWD)VALUES('Hamed','123')
توی فایل من هم دقیفا مشابه همین دستور با همین مقادیر با زمان اجراش دخیره بشه و یا اگر استوردپروسیجری اجرا شد دستور اجرا شده با مقاذیرش واسه ام لاگ بشه .
خیلی واسه ام حیاتیه.
یا حق
حمیدرضاصادقیان
دوشنبه 21 اسفند 1385, 15:44 عصر
دوست عزیز حالا به جز خود دستورات sql میتونی از trigger استفاده کنی تا بتوانی قبل و بعد از insert,update,delete مقادیرت رو داشته باشی.
hamed_bostan
دوشنبه 21 اسفند 1385, 23:58 عصر
میشه بیشتر توضیح بدی . ممنون میشم.
hamed_bostan
سه شنبه 22 اسفند 1385, 11:20 صبح
چطوری این کار رو بکنم؟یه نمونه یا یه راهنمایی خواهشا
حمیدرضاصادقیان
سه شنبه 22 اسفند 1385, 13:15 عصر
دوست عزیز یه نگاهی به Books online به بخش create trigger بنداز.هم مثالهای زیادی داره هم توضیح کاملی داده.
hamed_bostan
سه شنبه 22 اسفند 1385, 13:34 عصر
اقای صادقیان من خدود یک ماهه که تقریبا تو بخش های مختلف اینو پرسیدم . همه حا هم search کردم ولی جواب خودم رو پیدا نکردم . شما یا منطور سوال منو درست متوجه نشدی یا اگر متوجه شدی خواهشا یه لینک درست یا نمونه بذار .
من توی دیتابیسم 108 table دارم. دیتای یکی از این جداول با 19 فیلد یه چیری حدود 348000 رکورده و ... . کاربرای مختلفی دارن با این جداول transaction انجام می دن . مدیر سیستم که روی desktop می خواد فعالیت داشته باشه هر بار واسه گرفتن تغییرات به دلایل خاصی من مجبورم کل دیتابیس رو واسه اش اimport کنم روی سیستمش که خیلی طول میکشه . اما اگر هر دستوری که روی table های خاص داره اتفاق می افته داخل حدولی یا فایلی به شکلی که توی تاپیک اول اشاره کردم با مقادیرش و تاریخ و زمان اجراش log بشه میتونم فقط تغییرات رو از اون تاریخ به بعد روی سیستم مدیر سیستم اجرا کنم تا هر دو دیتابیس سایت و مدیر sycronize بشه . واشه همین من مصل sqlprofiler می خوام تمام اتفاقات رو اعم از insert,update , delete رو log کنم و داشته باشم . تقریبا نشه گفت یه گدرکاه می خوام .
هر طوری بتونی منو به این هدف نزدیک کنی کمک کردین
ممنون
اگر توضیح بیشتری هم می خواد بگین تا ارائه بدم چون واسه ام خیلی عجله ای و مهمه
hamed_bostan
چهارشنبه 23 اسفند 1385, 09:02 صبح
آقای صادقیان ممکنه پست آخر منو بخونین و ببینین کمکی میتونین بکنین یا نه؟
SalarSoft
چهارشنبه 23 اسفند 1385, 09:18 صبح
همون طور که جناب صادقیان گفتن می تونید از trigger استفاده کنید.
به طور خلاصه می شه گفت trigger ها همانند رویداد عمل می کنند. یعنی شما زمانی که کاری مانند insert, update و یا delete انجام میدید trigger مربوط به آن عمل فراخوانی میشه.
کار trigger همانند stored procedure است و می توانید کار مورد نظر خودتون رو (Log) درون اون انجام بدید.
AminSobati
چهارشنبه 23 اسفند 1385, 14:55 عصر
بهتون حق میدم، پیاده سازی Trigger برای Log کردن اطلاعات رو تعداد زیاد جداول کار راحتی نیست. اما حداقل برای اینکه سرگردان نباشید و وقتتون رو از دست ندین، از این بابت مطمئنتون کنم که وقتی Profiler نشه استفاده کرد، غیر Trigger هم راهی وجود نداره.
hamed_bostan
چهارشنبه 23 اسفند 1385, 15:29 عصر
اولا ممنون ازوقتی که می ذارین .
دوم اینکه ببینید من میتونم توی توابع داخل برنامه ام که دارم مقادیر رو به استورد پروسیجرم پاس میدم و اون استورد پروسیجر رو صدا می زنم در لحظه دستور sql مربوطه رو با مقادیر به هم بچسبونم و داخل یه table با زمان و .. ذخیره کنم در این شکی نیست و تنها مشکلشم اینه که واسهn حدولی که دارم باید 3n دستور در توابع مربوطه اش بسازم که شامل inser,update, delete میشه و می تونم از trigger هم استفاده نکنم اما مشکل در اینجاست که اولا ساخت دستور و چسباندن مقادیر در داخل اون میتونه خطر sql injection رو به همراه داشته باشه و ضمنا این که باید واسه هر جدول کدش رو بسازم . من میخواست ببینم نمیشه از profiler استفاده کرد که یکی از دوستان گفت باید sysadmin یاشی که نمیشه . بعد می خواستم ببینم هیچ storedprocedur ای نیست که هودش روی دیتابیس مدیریت بذاره و تمام دستورات ارسالی رو بگیره . دوستان به trigger اشاره کردن . ببینید اگر واسه هر جدول مجبورم triggerبنویسم که هیچ فکر کنم روش سنتی خودم بهتره ولی اگه میشه یه trigger نوشت واسه همه جدول ها یا مشابه این کمکم کنین . ضمنا نطرتون رو هم بابت این روش بنویسید ممنون میشم شاید کسی راه بهتری داشته باشه.
AminSobati
چهارشنبه 23 اسفند 1385, 17:09 عصر
من دقیق روش سنتی شما رو متوجه نشدم اما به هر حال برای جلوگیری از Injection میتونین مقدار رو به داخل SP پاس کنین تا اون Insert کنه
hamed_bostan
پنج شنبه 24 اسفند 1385, 10:31 صبح
من دقیق روش سنتی شما رو متوجه نشدم اما به هر حال برای جلوگیری از Injection میتونین مقدار رو به داخل SP پاس کنین تا اون Insert کنه
ببینید دوست عزیز . روش سنتی من این بود که به فرض من یه table داشتم به نام t1 و 2 فیلد که یکی ID بود و دیگری Name مثلا.
زمان insert از داخل برنامه یه تابع صدا زده میشه که این عمل رو انحام میده مه ورودی اون مقدار Name هست . داخل این تابع stored procedure مربوط :
INSERT INTO t1 (NAME)VALUES(@NAME)
فراخوانی و اجرا میشه . و مقدار اینطوری داخل جدول من insert می شد . در روش سنتی من میومدم توی تابع فراخوانی استورد پروسیجر INSERT این جدول می نوشتم :
تابع اول:
PUBLIC FUNCTION NewT1(Name as string) as boolean
dim Sqlda as new sqldataadapter("NewT1",conn)
sqlda.selectCommand.commandType=commandType.Stored Procedure
sqlda.selectCommand.parameters.add(new sqlparameter("@name",name))
conn.open
sqlda.selectcommand.exequtenonequery()
conn.close
return true
end function
حالا تابع دوم که من توش لاگ می کنم(روش سنتی)
PUBLIC FUNCTION NewT1(Name as string) as boolean
dim Sqlda as new sqldataadapter("NewT1",conn)
sqlda.selectCommand.commandType=commandType.Stored Procedure
sqlda.selectCommand.parameters.add(new sqlparameter("@name",name))
conn.open
sqlda.selectcommand.exequtenonequery()
conn.close
dim Sqlstr as string
sqlstr="INSERT INTO T1(Name)VALUES('"& name &"')"
و حالا اینجا sqlstr رو داخل یه table دیگه با تاریخ و زمان اجراش ذخیره می کنم .
return true
end function
ببینید من اینطوری کار می کردم تا حالا و واس هر تابع insert ,update , delete دستور رو می ساختم تو تابع مربوطش و دخیه می کردم اما حالا می خوام ببینم ایا راهی هست که اینهمه کد ننوشت جون واقعا لاگ کردن اتفاقات واسه ام مهمه(قبلا توضیح دادم بابت حجم اطلاعات و اینکه inport اون وجشتناک طول میکشه .
ممنون از توجهتون و راهنمایی هاتون اما ببینین راه حل بهتری دارین؟
حمیدرضاصادقیان
پنج شنبه 24 اسفند 1385, 12:11 عصر
دوست عزیز یک کار دیگه میتونی بکنی.اونم اینه که recovery model دیتابیست رو روی full قرار بدی و آخر هر روز فقط از transaction log یک backup بگیری. یا اینکارو به یک job واگذار کنی. و با job این backup ت رو در سیستم مدیرت بازیابی کن.هم حجمش خیلی کمه هم خیلی راحتتره.و فقط هم آخرین تغییرات رو میتونی برای مدیر بروز رسانی بکنی.trigger که من گفتم همان عمل profiler رو برای شما انجام میده و میتونی قبل از هر عمل یا بعد از هر عمل یا هنگام اجرای یک عمل اونو فراخوانی کنی و یک سری کارهای خاصی رو که مدنظرت هست انجام بدی.
امیدوارم تونسته باشم کمکی بهت کرده باشم.
hamed_bostan
پنج شنبه 24 اسفند 1385, 15:48 عصر
ممنون از راهنماییت . فقط من یه چیزی رو بهتون بگم که دیتابیس من روی هاست اینترنتی است .
1- ایا هاست اجازه full recovery modell رو به من میده چون من فقط از راه EM و query anlyzer به دیتابسم دسترسی دارم
2- اگر میده ممکنه یه کم بیشتر منو راهنمایی کنید .ایا مدیر هر زمان از شبانه روز بخواد میتونه دیتابیس خودشو به روز رسانی کنه؟ چطورمیتونم اون لاگ فایل یا تغییرات رو بگیرم؟
3-و اگر زحمتی نیست ممکنه طریقه کار با اون trigger رو واسه ام توضیح بدین یا راهنمایی ام کنین که از گجا باید دنبالش رو بگیرم؟ اسمی نشونی که بتونم پیداش کنم؟
hamed_bostan
پنج شنبه 24 اسفند 1385, 15:52 عصر
من دقیق روش سنتی شما رو متوجه نشدم اما به هر حال برای جلوگیری از Injection میتونین مقدار رو به داخل SP پاس کنین تا اون Insert کنه
شما نظری ندارین؟ من روشی که استفاده می کردم رو گذاشتم و یکی از دوستان هم لطف کرد جواب دادن؟ شما چه راهی رو پیشنهاد می کنین؟
hmm
پنج شنبه 24 اسفند 1385, 20:03 عصر
سلام
دقیقا من سناریو رو نفهمیدم
اگه میخواهید دیتابیس سرور با دیتابیس مدیر sysnc بشه آیا نمیشه از diffrent backup و یا replication استفاده کرد؟
hamed_bostan
پنج شنبه 24 اسفند 1385, 22:44 عصر
ببینید ما یه سرور روی اینترنت داریم که ملاک اونه و اخرین تغییرات داخل اونه . یه سری کاربر داریو با سطوح دسترسی متفاوت و یه مدیر که اینا دارن با دیتابیس های روی کامپیوتر خودشون کار می کنند که مشابه دیتابیس روی سرور هست . حالا بعد از مدتی هر کدوم از کاربران ممکنه در زمانهای خاصی به اینترنت برای sync کردن دیتابیس خودشون وصل بشن و ضمنا تغییرات خودشون رو هم روی سرور اعمال کنن (نه صرفا یه طرفه بلکه دوطرفه) حالا اگر log این اتفاقات رو واسه اینها داشته باشیم می تونیم نسبت به تاریخ اخرین update دیتابیسشون اقدام کنیم ولی نمی دونم چطور اتفاقات رو با مقادیر دستورات لاگ کنم همونطور که در پست شماره 12 گفتم این یه راه بود که استفاده می کردم اما اشکم رو در می اورد . متا سفانه تعدادکاربران و رکورد ها نیز زیاده توی سیستم من و ایمن شده غوز بالا غوز .
AminSobati
پنج شنبه 24 اسفند 1385, 23:29 عصر
اگر شما محتوی sqlstr رو بعنوان پارامتر به SP پاس بدین که Insert کنه براتون، مشکل Injection نخواهید داشت. در مورد Log File، روش Backup و Restore نمیتونه رد پای کاربرها رو براتون History کنه و به قول آقای hmm چیزی مثل Sync کردن میشه. شما چنین کاری (Sync) واقعا قصد دارین انجام بدین؟!
hamed_bostan
جمعه 25 اسفند 1385, 01:06 صبح
dim Sqlstr as string
sqlstr="INSERT INTO T1(Name)VALUES('"& name &"')"
منظور من اینحا بود بابت sql injection که مجبورم مقدار دستورم رو دستی بسازم
اما در رابطه با sync کردن اره من باید دیتابیسم رو واسه کاربرام sync کنم البته منظر من از sync همون به هنگام سازی و یکسان سازی هست . می دونم بخث بزرک شده اما من واقعا توش موندم .
AminSobati
جمعه 25 اسفند 1385, 19:32 عصر
وقتی دیتابیس روی Host باشه، باز هم میشه Replication استفاده کرد، این بهترین روشه. ولی داشتن Backupهای منظم از Log و Restore کردن روی سیستم Local هم یک گزینه است
hamed_bostan
شنبه 26 اسفند 1385, 00:29 صبح
وقتی دیتابیس روی Host باشه، باز هم میشه Replication استفاده کرد، این بهترین روشه.
من در مورد replication زیاد نمی دونستم . search هم کردم اما واقعیت اینکه انگار چنیدن روش replication داریم . اولا که از چه نوع replication استفاده کن و دوم اینکه اگر لینکی چیزی واسه راهنمایی بیشتر من هست ممنون می شم . فکر کنم replication بهتر باشه البته اگه واسه رکورد زیاد اذیتم نکنه
ممنون
AminSobati
شنبه 26 اسفند 1385, 19:41 عصر
Replication سه نوع داره که هر کدوم برای جزئیات و شرایط خاصی مناسبه. ولی همگی در این خصوصیت مشترک هستند که اطلاعات رو Sync میکنند. لذا Merge یا Transactional رو میتونم پیشنهاد کنم. Snapshot به خاطر حجم زیاد اطلاعات شما توصیه نمیشه.
اگر کتاب Administration در مورد SQL Server داشته باشید حتما Replication رو آموزش داده
hamed_bostan
یک شنبه 27 اسفند 1385, 09:22 صبح
مدارمش. لینکی از این کتاب واسه دانلود هست بذارین؟ تو سایتتون هم دیدن فقط توضیحش بود :
http://www.sqlsolutions.ir/Training/...mentation.aspx (http://www.sqlsolutions.ir/Training/DesignImplementation.aspx)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.