خانه/ امنیت/ Roles

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)، اما نه دستکاری داده.
sql
-- اضافه‌کردن یک User به نقش ثابت db_datareader:
ALTER ROLE db_datareader ADD MEMBER ali_app;

نقش‌های سفارشی (Custom Roles)

اگر نقش‌های ثابت دقیقاً منطبق با نیازت نباشند (مثلاً «فقط اجازه‌ی خواندن جدول Orders و نوشتن در جدول Invoices»)، می‌توانی نقش خودت را بسازی:

sql
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.

دیدن اعضای یک نقش

sql
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 از نقش:

sql
ALTER ROLE db_datareader DROP MEMBER ali_app;

کدام نقش برای کدام کار؟

سناریونقش پیشنهادی
برنامه‌ی گزارش‌گیری که فقط می‌خواندdb_datareader
برنامه‌ی عملیاتی که می‌خواند و می‌نویسدdb_datareader + db_datawriter
توسعه‌دهنده‌ای که ساختار جدول‌ها را تغییر می‌دهدdb_ddladmin
مدیر پایگاه‌دادهdb_owner (فقط برای مدیران)
دسترسی خاص (فقط چند جدول)نقش سفارشی با GRANT مشخص
هر User به‌طور خودکار عضو نقش 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;