User: هویت تو داخل یک پایگاهدادهی مشخص
در درس قبل گفتیم Login فقط اجازهی ورود به سرور را میدهد. حالا برای اینکه آن Login بتواند داخل یک پایگاهدادهی خاص کاری انجام دهد (جدولی بخواند، ردیفی درج کند)، باید به یک User در همان پایگاهداده نگاشت شود. اگر Login را «کارت ورود به ساختمان» تصور کنی، User همان «کارت دسترسی به یک اتاق مشخص داخل ساختمان» است.
USE SchoolDB; CREATE USER ali_app FOR LOGIN ali_app;
این دستور باید داخل هر پایگاهدادهای که میخواهی همان Login به آن دسترسی داشته باشد، جداگانه اجرا شود. یک Login میتواند در پایگاهدادهی A، هیچ Userی نداشته باشد (پس اصلاً دسترسی ندارد)، در پایگاهدادهی B با نام دلخواه دیگری User داشته باشد، و همینطور برای هر پایگاهدادهای جداگانه تصمیم گرفته شود.
جدول رابطه: Login در برابر User
| Login | User | |
|---|---|---|
| محدوده | کل سرور (Instance) | یک پایگاهدادهی مشخص |
| سوالی که پاسخ میدهد | «اجازهی ورود به سرور را داری؟» | «داخل این پایگاهداده، چه اجازههایی داری؟» |
| محل ذخیره | پایگاهدادهی سیستمی master | خودِ همان پایگاهداده |
کاربر ویژه: dbo
dbo (مخفف Database Owner) یک User ویژه است که بهطور پیشفرض تمام اختیارات را روی پایگاهداده دارد. معمولاً Loginی که پایگاهداده را ساخته، بهطور خودکار به dbo نگاشت میشود. اشیای پایگاهداده (جدول، ویو، پروسیجر) که بدون schema صریح ساخته میشوند، معمولاً زیر schema پیشفرض dbo قرار میگیرند — همان چیزی که در نام کامل اشیا مثل dbo.Students دیدهای.
دیدن Userهای یک پایگاهداده
USE SchoolDB; SELECT name, type_desc, default_schema_name, create_date FROM sys.database_principals WHERE type IN ('S', 'U', 'G') ORDER BY name;
مشکل کاربر یتیم (Orphaned User)
وقتی پایگاهداده را روی سرور دیگری Restore میکنی، Userها همراه آن میآیند اما Loginها نه. User حالا به Loginی با SID متناظر وصل نیست و «یتیم» است؛ کاربر میتواند به سرور وصل شود ولی به دادهها دسترسی ندارد. یتیمها را اینطور پیدا کن:
SELECT dp.name AS OrphanUser FROM sys.database_principals dp LEFT JOIN sys.server_principals sp ON sp.sid = dp.sid WHERE dp.type = 'S' AND sp.sid IS NULL AND dp.name NOT IN ('guest', 'INFORMATION_SCHEMA', 'sys');
و آنها را به Login همنام وصل کن (ابتدا باید Login در سرور جدید ساخته شده باشد):
ALTER USER ali_app WITH LOGIN = ali_app;
کاربر guest و Schema پیشفرض
guestکاربر ویژهای است که به Loginهای بدون User اجازهی ورود محدود میدهد؛ بهطور پیشفرض غیرفعال است و باید همانطور بماند.- هر User یک Schema پیشفرض دارد (معمولاً
dbo) که اگر نام Schema را ننویسی، همان استفاده میشود. میتوان آن را باALTER USER ... WITH DEFAULT_SCHEMA = ...تغییر داد.
جمعبندی این درس
- User، هویت یک Login را در سطح یک پایگاهدادهی مشخص تعریف میکند.
- یک Login میتواند در پایگاهدادههای مختلف، Userهای متفاوت (یا اصلاً هیچ Useری) داشته باشد.
dboکاربر ویژهای است که مالکیت کامل پایگاهداده را دارد.
در درس بعدی میبینیم چطور بهجای مدیریت مجوز برای تکتک Userها، آنها را داخل Roles (نقشها) گروهبندی میکنیم.
تمرینهای خودآزمایی
اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.
۱Login بدون User در یک پایگاهداده چه کارهایی میتواند بکند؟نمایش پاسخ
میتواند به سرور وصل شود ولی به آن پایگاهداده دسترسی ندارد (مگر از طریق کاربر guest).
۲برای Login موجود یک User در پایگاهدادهی SchoolDB بساز.نمایش پاسخ
USE SchoolDB; CREATE USER ali_app FOR LOGIN ali_app;