Roles: گروهبندی مجوزها بهجای تکرار برای هر کاربر
فرض کن ۲۰ کارمند حسابداری داری که همه باید دقیقاً یک مجموعه مجوز یکسان داشته باشند. اگر مجوزها را تکتک به هر User بدهی، هم کار تکراری و پرخطاست، هم وقتی یک مجوز جدید لازم شود، باید ۲۰ بار همان کار را تکرار کنی. Role (نقش) این مشکل را حل میکند: مجوزها را یکبار به نقش میدهی، و کاربران را عضو آن نقش میکنی.
نقشهای ثابت سرور (Fixed Server Roles)
این نقشها از قبل توسط SQL Server ساخته شدهاند و به Loginها (نه Userها) تعلق میگیرند:
sysadmin— بالاترین سطح؛ دسترسی کامل به همهچیز روی کل سرور.serveradmin— پیکربندی و خاموشکردن سرور.securityadmin— مدیریت Loginها و مجوزهایشان.
نقشهای ثابت پایگاهداده (Fixed Database Roles)
اینها به Userها (در سطح یک پایگاهدادهی مشخص) تعلق میگیرند و در عمل خیلی بیشتر استفاده میشوند:
db_owner— کنترل کامل روی پایگاهداده.db_datareader— اجازهیSELECTروی همهی جدولها.db_datawriter— اجازهیINSERT/UPDATE/DELETEروی همهی جدولها.db_ddladmin— اجازهی تغییر ساختار (CREATE/ALTER/DROP)، اما نه دستکاری داده.
-- اضافهکردن یک User به نقش ثابت db_datareader: ALTER ROLE db_datareader ADD MEMBER ali_app;
نقشهای سفارشی (Custom Roles)
اگر نقشهای ثابت دقیقاً منطبق با نیازت نباشند (مثلاً «فقط اجازهی خواندن جدول Orders و نوشتن در جدول Invoices»)، میتوانی نقش خودت را بسازی:
CREATE ROLE InvoiceClerk; GRANT SELECT ON Orders TO InvoiceClerk; GRANT INSERT, UPDATE ON Invoices TO InvoiceClerk; ALTER ROLE InvoiceClerk ADD MEMBER ali_app;
حالا اگر فردا نیاز شد مجوز جدیدی به همهی اعضای این تیم داده شود، فقط یک بار GRANT روی خودِ نقش کافی است — نه تکرار برای هر User.
دیدن اعضای یک نقش
SELECT r.name AS RoleName, m.name AS MemberName FROM sys.database_role_members rm JOIN sys.database_principals r ON r.principal_id = rm.role_principal_id JOIN sys.database_principals m ON m.principal_id = rm.member_principal_id WHERE r.name = 'db_datareader';
برای خارجکردن یک User از نقش:
ALTER ROLE db_datareader DROP MEMBER ali_app;
کدام نقش برای کدام کار؟
| سناریو | نقش پیشنهادی |
|---|---|
| برنامهی گزارشگیری که فقط میخواند | db_datareader |
| برنامهی عملیاتی که میخواند و مینویسد | db_datareader + db_datawriter |
| توسعهدهندهای که ساختار جدولها را تغییر میدهد | db_ddladmin |
| مدیر پایگاهداده | db_owner (فقط برای مدیران) |
| دسترسی خاص (فقط چند جدول) | نقش سفارشی با GRANT مشخص |
public است؛ هر مجوزی که به public بدهی، به همه میرسد. برای همین هیچوقت مجوز حساس را به public نده.برای دیدن چرخهی کامل Login → User → Role → Permission در یک سناریوی عملی، مقالهی دادن دسترسی به یک Database و مقالهی تفاوت GRANT، DENY و REVOKE را بخوان.
جمعبندی این درس
- Role، مجموعهای از مجوزها را زیر یک نام واحد گروهبندی میکند.
- نقشهای ثابت سرور (مثل
sysadmin) به Login و نقشهای ثابت پایگاهداده (مثلdb_datareader) به User تعلق میگیرند. - نقش سفارشی، بهترین گزینه برای گروههای دسترسی خاص کسبوکار است.
- مدیریت مجوز از طریق نقش، بسیار کمخطاتر و مقیاسپذیرتر از مدیریت تکتک کاربر است.
در درس بعدی، خودِ دستورهای GRANT، REVOKE و DENY را با جزئیات کامل میبینیم — و یک قانون مهم دربارهی اینکه کدامیک همیشه برنده میشود.
تمرینهای خودآزمایی
اول خودت جواب بده، بعد پاسخ را باز کن و مقایسه کن.
۱نقش db_datareader چه اجازهای میدهد؟نمایش پاسخ
خواندن (SELECT) از همهی جدولها و Viewهای آن پایگاهداده، بدون هیچ اجازهی نوشتن.
۲User را به نقش db_datareader اضافه کن.نمایش پاسخ
ALTER ROLE db_datareader ADD MEMBER ali_app;