أدوار خادم Azure SQL Database لإدارة الأذونات

ملاحظة

الأدوار المضمنة على مستوى الخادم في هذه المقالة موجودة في المعاينة العامة لـ Azure SQL Database. هذه الأدوار على مستوى الخادم هي أيضًا جزء من إصدار SQL Server 2022.

ينطبق على: Azure SQL Database

في Azure SQL Database، يكون الخادم هو مفهوم منطقي ولا يمكن منح الأذونات على مستوى الخادم. لتبسيط إدارة الأذونات، توفر Azure SQL Database مجموعة من الأدوار الثابتة على مستوى الخادم لمساعدتك في إدارة الأذونات على خادم منطقي. الأدوار هي أساسيات الأمان التي تجمع تسجيلات الدخول.

ملاحظة

مفهوم الأدوار في هذه المقالة مثل المجموعات في نظام التشغيل Windows.

تستخدم هذه الأدوار الخاصة على مستوى الخادم الثابت البادئة ##MS_ واللاحقة ## للتمييز عن المبادئ العادية الأخرى التي أنشأها المستخدم.

مثل SQL Server المحلي، تُنظّم أذونات الخادم بشكل هرمي. يمكن نشر الأذونات التي تم الاحتفاظ بها بواسطة هذه الأدوار على مستوى الخادم إلى أذونات قاعدة البيانات. لكي تكون الأذونات مفيدة بشكل فعال على مستوى قاعدة البيانات، يجب أن يكون تسجيل الدخول عضوًا في الدور على مستوى الخادم ##MS_DatabaseConnector##، الذي يمنح CONNECT لجميع قواعد البيانات، أو أن يكون لديه حساب مستخدم في قواعد البيانات الفردية. ينطبق هذا أيضًا على قاعدة البيانات الظاهرية master.

على سبيل المثال، يحتفظ دور مستوى الخادم ##MS_ServerStateReader##بحالة خادم العرض. إذا كان لتسجيل الدخول الذي هو عضو في هذا الدور حساب مستخدم في قواعد البيانات master وWideWorldImporters، فسيكون لهذا المستخدم إذن، حالة قاعدة بيانات العرض في قاعدتي البيانات هاتين.

ملاحظة

يمكن رفض أي إذن داخل قواعد بيانات المستخدم، الساري، والذي تجاوز المنحة على مستوى الخادم عن طريق عضوية الدور. ومع ذلك، في قاعدة بيانات النظام الرئيسية، لا يمكن منح أذونات أو رفضها.

توفر Azure SQL Database حالياً ثلاثة أدوار خادم ثابتة. لا يمكن تغيير الأذونات الممنوحة لأدوار الخادم الثابت ولا يمكن أن يكون لهذه الأدوار أدوار ثابتة أخرى كأعضاء. يمكنك إضافة عمليات تسجيل دخول على مستوى الخادم كأعضاء إلى الأدوار على مستوى الخادم.

هام

يمكن لكل عضو في دور خادم ثابت إضافة تسجيلات دخول أخرى إلى نفس الدور.

لمزيد من المعلومات حول تسجيل الدخول إلى Azure SQL Database والمستخدمين، راجع السماح بالوصول إلى قاعدة البيانات SQL والمثيل المدار SQL وتحليلات Azure Synapse.

أدوار مضمنة على مستوى الخادم

يعرض الجدول التالي الأدوار الثابتة على مستوى الخادم وقدراتها.

دور مضمن على مستوى الخادم الوصف
##MS_DatabaseConnector## يمكن لأعضاء دور الخادم الثابت ##MS_DatabaseConnector## الاتصال بأي قاعدة بيانات دون الحاجة إلى حساب مستخدم في قاعدة البيانات للاتصال به.

لرفض إذن CONNECT إلى قاعدة بيانات معينة، يمكن للمستخدمين إنشاء حساب مستخدم مطابق لتسجيل الدخول هذا في قاعدة البيانات ثم DENY إذن CONNECT لمستخدم قاعدة البيانات. سيقوم إذن DENY هذا بإبطال إذن GRANT CONNECT الوارد من هذا الدور.
##MS_DatabaseManager## يمكن لأعضاء دور الخادم الثابت ##MS_DatabaseManager## إنشاء قواعد البيانات وحذفها. يصبح عضو في دور ##MS_DatabaseManager## الذي ينشئ قاعدة بيانات، مالك قاعدة البيانات هذه، مما يسمح لهذا المستخدم بالاتصال بقاعدة البيانات هذه كمستخدم dbo. لدى المستخدم dbo كافة أذونات قاعدة بيانات في قاعدة البيانات. لا يملك أعضاء دور ##MS_DatabaseManager## بالضرورة الإذن بالوصول إلى قواعد البيانات التي لا يمتلكونها. يوصى باستخدام دور الخادم هذا على دور مستوى قاعدة بيانات dbmanager الموجود في master.
##MS_DefinitionReader## يمكن لأعضاء دور الخادم الثابت ##MS_DefinitionReader## قراءة جميع طرق عرض الكتالوج التي يغطيها VIEW ANY DEFINITION، على التوالي VIEW DEFINITION على أي قاعدة بيانات يكون عضو هذا الدور حساب مستخدم عليها.
##MS_LoginManager## يمكن لأعضاء دور الخادم الثابت ##MS_LoginManager## إنشاء عمليات تسجيل دخول وحذفها. يوصى باستخدام دور الخادم هذا على دور مستوى قاعدة بيانات loginmanager الموجود في master.
##MS_SecurityDefinitionReader## يمكن لأعضاء دور الخادم الثابت ##MS_SecurityDefinitionReader## قراءة جميع طرق عرض الكتالوج التي يغطيها VIEW ANY SECURITY DEFINITION، وعلى التوالي لديه إذن VIEW SECURITY DEFINITION على أي قاعدة بيانات يكون لعضو هذا الدور حساب مستخدم عليها. هذه مجموعة فرعية صغيرة مما يمكن لدور خادم ##MS_DefinitionReader## الوصول إليه.
##MS_ServerStateReader## يمكن لأعضاء دور الخادم الثابت ##MS_DefinitionReader## قراءة جميع طرق عرض الكتالوج التي يغطيها VIEW ANY DEFINITION، على التوالي VIEW DEFINITION على أي قاعدة بيانات يكون عضو هذا الدور حساب مستخدم عليها.
##MS_ServerStateManager## أعضاء دور الخادم الثابت ##MS_ServerStateManager## لديهم نفس الأذونات مثل دور ##MS_ServerStateReader##. أيضاً، فإنه يحمل إذن ALTER SERVER STATE، والذي يسمح بالوصول إلى العديد من عمليات الإدارة، مثل: DBCC FREEPROCCACHE،، DBCC FREESYSTEMCACHE ('ALL')DBCC SQLPERF()؛

أذونات أدوار الخادم الثابت

كل دور مضمن على مستوى الخادم له أذونات محددة معينة له. يعرض الجدول التالي الأذونات المعينة لأدوار مستوى الخادم. كما تعرض الأذونات الموروثة على مستوى قاعدة البيانات طالما يمكن للمستخدم الاتصال بقواعد البيانات الفردية.

دور ثابت على مستوى الخادم أذونات على مستوى الخادم أذونات على مستوى قاعدة البيانات (إذا كان مستخدم قاعدة بيانات مطابقة تسجيل الدخول موجوداً)
##MS_DatabaseConnector## CONNECT ANY DATABASE CONNECT
##MS_DatabaseManager## CREATE ANY DATABASE
ALTER ANY DATABASE
ALTER
##MS_DefinitionReader## "عرض أي قاعدة بيانات، عرض أي تعريف، عرض أي تعريف الأمان" "عرض التعريف، عرض تعريف الأمان"
##MS_LoginManager## CREATE LOGIN
ALTER ANY LOGIN
غير متوفر
##MS_SecurityDefinitionReader## VIEW ANY SECURITY DEFINITION VIEW SECURITY DEFINITION
##MS_ServerStateReader## عرض حالة الخادم، عرض حالة أداء الخادم، عرض حالة أمان الخادم عرض حالة قاعدة البيانات، عرض حالة أداء قاعدة البيانات، عرض حالة أمان قاعدة البيانات
##MS_ServerStateManager## تبديل حالة الخادم، عرض حالة الخادم، عرض حالة أداء الخادم، عرض حالة أمان الخادم عرض حالة قاعدة البيانات، عرض حالة أداء قاعدة البيانات، عرض حالة أمان قاعدة البيانات

العمل مع أدوار على مستوى الخادم

يشرح الجدول التالي طرق عرض النظام والوظائف التي يمكنك استخدامها للعمل مع أدوار على مستوى الخادم في Azure SQL Database.

الميزة النوع الوصف
IS_SRVROLEMEMBER (Transact-SQL) بيانات التعريف يشير إلى ما إذا كان تسجيل دخول SQL عضواً في الدور المحدد على مستوى الخادم.
sys.server_role_members (Transact-SQL) بيانات التعريف إرجاع صف واحد لكل عضو من كل دور على مستوى الخادم.
sys.sql_logins (Transact-SQL) بيانات التعريف إرجاع صف واحد لكل تسجيل دخول SQL.
ALTER SERVER ROLE (Transact-SQL) الأمر تغيير عضوية دور الخادم.

أمثلة

توضح الأمثلة في هذا القسم كيفية العمل مع أدوار على مستوى الخادم في Azure SQL Database.

أ. إضافة تسجيل دخول SQL إلى دور على مستوى الخادم

يضيف المثال التالي تسجيل الدخول SQL 'Jiao' إلى دور مستوى الخادم ##MS_ServerStateReader##. يجب تشغيل هذه العبارة في قاعدة البيانات الظاهرية master.

ALTER SERVER ROLE ##MS_ServerStateReader##
	ADD MEMBER Jiao;  
GO

ب. سرد جميع المبادئ (مصادقة SQL) التي هي أعضاء في دور على مستوى الخادم

العبارة التالية بإرجاع جميع أعضاء أي دور ثابت على مستوى الخادم باستخدام sys.server_role_members طرق العرض وsys.sql_logins طرق عرض الكتالوج. يجب تشغيل هذه العبارة في قاعدة البيانات الظاهرية master.

SELECT
		sql_logins.principal_id			AS MemberPrincipalID
	,	sql_logins.name					AS MemberPrincipalName
	,	roles.principal_id				AS RolePrincipalID
	,	roles.name						AS RolePrincipalName
FROM sys.server_role_members AS server_role_members
INNER JOIN sys.server_principals AS roles
    ON server_role_members.role_principal_id = roles.principal_id
INNER JOIN sys.sql_logins AS sql_logins 
    ON server_role_members.member_principal_id = sql_logins.principal_id
;  
GO  

ج. مثال كامل: إضافة تسجيل دخول إلى دور على مستوى الخادم، واسترجاع بيانات التعريف لعضوية الدور والأذونات، وتشغيل استعلام اختبار

الجزء الأول: إعداد عضوية الدور وحساب المستخدم

شغّل هذا الأمر من قاعدة البيانات الظاهرية master.

ALTER SERVER ROLE ##MS_ServerStateReader##
	ADD MEMBER Jiao

-- check membership in metadata:
select IS_SRVROLEMEMBER('##MS_ServerStateReader##', 'Jiao')
--> 1 = Yes

SELECT
		sql_logins.principal_id			AS MemberPrincipalID
	,	sql_logins.name					AS MemberPrincipalName
	,	roles.principal_id				AS RolePrincipalID
	,	roles.name						AS RolePrincipalName
FROM sys.server_role_members AS server_role_members
INNER JOIN sys.server_principals AS roles
    ON server_role_members.role_principal_id = roles.principal_id
INNER JOIN sys.sql_logins AS sql_logins 
    ON server_role_members.member_principal_id = sql_logins.principal_id
;   
GO  

فيما يلي مجموعة النتائج.

MemberPrincipalID MemberPrincipalName RolePrincipalID RolePrincipalName        
------------- ------------- ------------------ -----------   
6         Jiao      11            ##MS_ServerStateReader##   

تشغيل هذا الأمر من قاعدة بيانات مستخدم.

-- Creating a database-User for 'Jiao'
CREATE USER Jiao
	FROM LOGIN Jiao
;   
GO  

الجزء الثاني: عضوية دور الاختبار

تسجيل الدخول مثل تسجيل الدخول Jiao والاتصال بقاعدة بيانات المستخدم المستخدمة في المثال.

-- retrieve server-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'Server')
;  

-- check server-role membership for `##MS_ServerStateReader##` of currently logged on User
SELECT USER_NAME(), IS_SRVROLEMEMBER('##MS_ServerStateReader##')
--> 1 = Yes

-- Does the currently logged in User have the `VIEW DATABASE STATE`-permission?
SELECT HAS_PERMS_BY_NAME(NULL, 'DATABASE', 'VIEW DATABASE STATE'); 
--> 1 = Yes

-- retrieve database-level permissions of currently logged on User
SELECT * FROM sys.fn_my_permissions(NULL, 'DATABASE')
GO 

-- example query:
SELECT * FROM sys.dm_exec_query_stats
--> will return data since this user has the necessary permission

د. تحقق من الأدوار على مستوى الخادم لتسجيلات Microsoft Azure Active Directory

شغّل هذا الأمر في قاعدة البيانات الظاهرية master لعرض جميع عمليات تسجيل الدخول إلى Azure AD والتي تعد جزءًا من الأدوار على مستوى الخادم في SQL Database. لمزيد من المعلومات عن عمليات تسجيل الدخول إلى خادم Microsoft Azure Active Directory، راجع أساسيات خادم Microsoft Azure Active Directory.

SELECT roles.principal_id AS RolePID,roles.name AS RolePName,
       server_role_members.member_principal_id AS MemberPID, members.name AS MemberPName
       FROM sys.server_role_members AS server_role_members
       INNER JOIN sys.server_principals AS roles
       ON server_role_members.role_principal_id = roles.principal_id
       INNER JOIN sys.server_principals AS members 
       ON server_role_members.member_principal_id = members.principal_id;

هـ. تحقق من أدوار قاعدة البيانات الرئيسية الافتراضية لعمليات تسجيل دخول محددة

شغّل هذا الأمر في قاعدة البيانات الظاهرية master للتحقق من الأدوار التي تمتلكها bob، أو قم بتغيير القيمة لتتوافق مع أساسياتك.

SELECT DR1.name AS DbRoleName, isnull (DR2.name, 'No members')  AS DbUserName
   FROM sys.database_role_members AS DbRMem RIGHT OUTER JOIN sys.database_principals AS DR1
    ON DbRMem.role_principal_id = DR1.principal_id LEFT OUTER JOIN sys.database_principals AS DR2
     ON DbRMem.member_principal_id = DR2.principal_id
      WHERE DR1.type = 'R' and DR2.name like 'bob%'

قيود الأدوار على مستوى الخادم

  • قد تستغرق تعيينات الأدوار 5 دقائق لتصبح فعالة. أيضاً بالنسبة لجلسات العمل الحالية، لا تسري التغييرات على تعيينات دور الخادم حتى يتم إغلاق الاتصال وإعادة فتحه. يرجع ذلك إلى هندسة موزعة بين قاعدة البيانات master وقواعد البيانات الأخرى على نفس الخادم المنطقي.

    • الحل الجزئي: لتقليل فترة الانتظار والتأكد من أن تعيينات دور الخادم الحالية في قاعدة بيانات أو مسؤول خادم أو مسؤول Microsoft Azure Active Directory يمكن تشغيلها DBCC FLUSHAUTHCACHEفي قاعدة بيانات المستخدم حيث يوجد وصول لتسجيل الدخول. مازال المستخدمون المسجلون حالياً بحاجة إلى إعادة الاتصال بعد تشغيل DBCC FLUSHAUTHCACHEتغييرات العضوية لكي يسري عليها.
  • IS_SRVROLEMEMBER()غير معتمد في قاعدة البيانات master

راجع أيضًا