ورود

View Full Version : محدود کردن چندکاربر به استفاده از رکوردهای خاص از یک جدول



velash
سه شنبه 14 آذر 1385, 14:09 عصر
با سلام به همه دوستان
فرض میکنیم ما یک سیستم داریم که هر دانش آموز نمرات خود را در بانک اطلاعاتی وارد می کند .مسلما هر دانش آموز فقط مجاز است اطلاعات مربوط به خود را وارد و یا ویرایش کند.
ما دو جدول با فیلدهای زیر داریم
( student(code_student,name,fam و
( lesson(code_lesson,code_student,name_lesson,score_ lesson

و به ازای هر رکورد جدول student یک کاربر ایجاد می کنیم برای ویرایش مشخصات خود (نام و نام خانوادگی) و دسترسی به لیست نمرات مربوط به خود(نام درس و نمره درس) .

نکته اصلی اینه که ما چگونه نقش(role) در sql server 2000 برای هر کاربر (دانش آموز) تعریف کنیم که فقط به رکورد های خاص خودش دسترسی داشته باشد؟
اگر در طرح مسئله مشکلی بود بگید تا بیشتر توضیح بدم
ممنون ار لطف همه دوستان

h_baqery
سه شنبه 14 آذر 1385, 16:10 عصر
آیا برای هر دانش آموز در SQL یه کاربر تعریف کردی ؟
اگر این طور باشه MSSQL در سطح رکورد نمی تونه محدود کنه . یه راهش اینه که برای هر دانش آموز یه View درست کنید و هر کاربر در MSSQL رو به View خودش دسترسی بدی .
این کار سختیه راه معمول که اکثرا استفاده می کنن کنترل کاربران از داخل برنامه است نه با خود MSSQL.

problem
سه شنبه 14 آذر 1385, 16:21 عصر
یه راه دیگه این که برنامه شما به جای این که کد SQL دسترسی خود جدول رو اجرا کنه، فقط یک Stored Procedure رو صدا کنه و بهش پارامتر (نمره جدید) رو بده. خود این Stored Procedure هم یک WHERE توش داشته باشه، که فقط رکوردهای مال اون کاربر رو دستکاری کنه.

Kamyar.Kimiyabeigi
سه شنبه 14 آذر 1385, 16:23 عصر
شما در سطح application اطلاعات را با توجه به user ایی که login کرده فیلتر شده نمایش بدین

velash
چهارشنبه 15 آذر 1385, 08:23 صبح
آیا برای هر دانش آموز در SQL یه کاربر تعریف کردی ؟
اگر این طور باشه MSSQL در سطح رکورد نمی تونه محدود کنه . یه راهش اینه که برای هر دانش آموز یه View درست کنید و هر کاربر در MSSQL رو به View خودش دسترسی بدی .
این کار سختیه راه معمول که اکثرا استفاده می کنن کنترل کاربران از داخل برنامه است نه با خود MSSQL.

دوست عزیز به ازای هر دانش آموز یک کاربر تعریف میشه. در مورد ساخت veiw برای هر کاربر میشه اینکار کرد اما کار فقط میتونه فقط اطلاعات مختص به خودشو ببینه و برای درج و ویرایش اطلاعات باید سطح دسترسی رو insert , update,delete رو فعال کنیم در ضمن این دو جدول از طریق فیلد code_student با هم ارتباط دارند و تعریف یک view همراه با فیلدهای هر دو جدول امکان درج و حذف رکورد رو از ما میگره.
در مورد کنترل کاربر در داخل خود برنامه ،باید بگم که به این شکل ما مجبور می شیم به ازای هر کابر(دانش آموز) ، سورس برنامه رو تغییر بدیم که منطقی بنظر نمیرسه

velash
چهارشنبه 15 آذر 1385, 08:29 صبح
یه راه دیگه این که برنامه شما به جای این که کد SQL دسترسی خود جدول رو اجرا کنه، فقط یک Stored Procedure رو صدا کنه و بهش پارامتر (نمره جدید) رو بده. خود این Stored Procedure هم یک WHERE توش داشته باشه، که فقط رکوردهای مال اون کاربر رو دستکاری کنه.

دوست عزیز اگه بیشتر توضیح بدید همراه با کد پروسیجر ؛ ممنون میشم

h_baqery
چهارشنبه 15 آذر 1385, 08:43 صبح
در مورد کنترل کاربر در داخل خود برنامه ،باید بگم که به این شکل ما مجبور می شیم به ازای هر کابر(دانش آموز) ، سورس برنامه رو تغییر بدیم که منطقی بنظر نمیرسه

این روشی است که بالای هفتاد درصد از برنامه نویسانی که با mssql کار می کنند استفاده می کنند .
به اون شکلی که شما فکر می کنید نیست .
شما یک جدول برای نام کاربران و رمز ورودی اونها دارید و هنگام ورود چک می کنید و در هنگام کار با برنامه هم با توجه به کدی که نوشتید رکوردهای مربوط به اون کاربر رو براش فیلتر می کنید .
که این قسمتش دیگه ربطی به MSSQL نداره و با توجه به زبان برنامه نویسی که استفاده می کنید در بخش خودش سوال کنید حتما الگوریتمهای جالبی برای این کار پیدا می کنید .

اما اگر اصرار به کنترل کاربر با MSSQL دارید راههای دیگری هم هست که فقط چون روشی که گفتم عمومی تر و ساده تر است همون روش رو پیشنهاد می کنم .
خود من هم قبلا سعی در انجام این کار داشتم که راه ساده تر رو انتخاب کردم .

problem
چهارشنبه 15 آذر 1385, 09:14 صبح
دوست عزیز اگه بیشتر توضیح بدید همراه با کد پروسیجر ؛ ممنون میشم

خوب من مایلم که اگر ایرادی نداره، به جای این که یه مثال از ذهنم در آرم و توضیح بدم، شما اندکی از جزئیات TABLE هایی که داری، و اکانت‌ها، رو به من بگی، تا من برات مثال بزنم.

velash
چهارشنبه 15 آذر 1385, 11:24 صبح
دوست عزیز. آقا / خانم باقری
از توجه تون به این مسئله واقعا ممنونم .
شما می گید که ما یک جدول محتوی نام کاربران و پسوردشون بسازیم و از طریق کد برنامه (مثلا دلفی) برای هر کاربر محدودیتهای خاص خودشون(بوسیله query) رو اعمال کنیم و دیگه بی خیال تعریف کاربر از طریق Enterprise Manager اس کیو ال بشیم. راه حل جالبیه.

اما فرض مسئله ما اینه که کاربران (کلاینتها) از طریق Enterprise Manager یا query Analyzer
به سرور وصل میشن.

حالا چیکار کنیم ؟:متفکر:

velash
چهارشنبه 15 آذر 1385, 11:26 صبح
خوب من مایلم که اگر ایرادی نداره، به جای این که یه مثال از ذهنم در آرم و توضیح بدم، شما اندکی از جزئیات TABLE هایی که داری، و اکانت‌ها، رو به من بگی، تا من برات مثال بزنم.

با تشکر از شما. در اولین فرصت جدولها رو طراحی و با توضیح بیشتر در اختیارتون میزارم.

problem
چهارشنبه 15 آذر 1385, 11:52 صبح
فرض مسئله ما اینه که کاربران (کلاینتها) از طریق Enterprise Manager یا Query Analyzer
به سرور وصل میشن.

نا گفته نماند این کار من رو هم سخت میکنه ها! اما سعی میکنم راهش رو پیدا کنم.

h_baqery
شنبه 18 آذر 1385, 10:25 صبح
راهنمایی : شاید این اطلاعات کمک کنن .

با sp_who می تونید اطلاعات کاملی در مورد کاربران متصل بدست بیارید . که یکی از اون فیلدها spid است .
با

select @@spid
هم می تونید در هر محیطی اون کد رو بدست بیارید .

velash
یک شنبه 19 آذر 1385, 13:43 عصر
راهنمایی : شاید این اطلاعات کمک کنن .

با sp_who می تونید اطلاعات کاملی در مورد کاربران متصل بدست بیارید . که یکی از اون فیلدها spid است .
با

select @@spid
هم می تونید در هر محیطی اون کد رو بدست بیارید .

میشه بیشتر توضیح بدید

h_baqery
چهارشنبه 22 آذر 1385, 08:16 صبح
شما SP_WHO رو در محیط QA اجرا کنید و خروجی رو مشاهده کنید .

هر کاربری که login کرده یه فیلد به نام SPID هم داره که منحصر به فرده و در درون SP ها و Trigger ها با کد select @@SPID می تونید اونو بدست بیارید و با خروجی SP_WHO که در جدولی ذخیزه اش کردی مقایسه می کنید .

البته گفته باشم انجام این کار به نظر من معقول نیست و استفاده از همان روشی که گفتم معمول تر است .

ولی روشهای بهتری هم هست در تاپیکهای همین صفحه جستجو کنید اطلاعات بهتری در مورد کاربرانی که متصل می شوند می تونید بدست بیارید . وقتی نام کاربر رو در زمان ارتباط بدست بیارید می تونید اگر خواستید او نو Kill کنید .

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

velash
چهارشنبه 22 آذر 1385, 10:45 صبح
آقای باقری عزیز
همون روش اولی که در ابتدای فروم گفتی یعنی تعریف کاربر و محدودیت توسط خود برنامه دارم روش کار می کنم به نظرم ساده تر و بهتر باشه .
در هر صورت به خاطر راهنمایی هاتون بسیار ممنونم
موفق باشی