وصف قاعدة البيانات وأذونات الكائن

مكتمل

تحتوي جميع منصات إدارة قواعد البيانات الارتباطية على أربع أذونات أساسية تتحكم في عمليات لغة معالجة البيانات (DML). هذه الأذونات هي SELECT وINSERT وUPDATE وDELETE وتنطبق على جميع الأنظمة الأساسية SQL Server. يمكن منح كافة هذه الأذونات أو إبطالها أو رفضها على الجداول وطرق العرض. إذا تم منح إذن باستخدام عبارة GRANT، يتم منح الإذن للمستخدم أو الدور المشار إليه في عبارة GRANT. يمكن أيضًا رفض الأذونات للمستخدمين باستخدام الأمر DENY. إذا تم منح المستخدم إذنًا ورفض نفس الإذن، فسيحل DENY دائمًا محل المنحة، وسيتم رفض وصول المستخدم إلى الكائن المحدد.

A T-SQL Example of a DENY overriding a GRANT

في المثال أعلاه، يتم منح المستخدم SELECT ثم رفض أذونات SELECT على الجدول dbo.Company. عندما يحاول المستخدم تنفيذ استعلام الذي يحدد من الجدول dbo.Company، يتلقى المستخدم خطأ تم رفض إذن SELECT.

الجدول وعرض الأذونات

تمثل الجداول وطرق العرض الكائنات التي يمكن منح الأذونات عليها داخل قاعدة بيانات. ضمن هذه الجداول وطرق العرض، يمكنك بالإضافة إلى ذلك تقييد الأعمدة التي يمكن الوصول إليها إلى أساس أمان معين (مستخدم أو تسجيل دخول). يتضمن SQL Server وقاعدة بيانات Azure SQL أيضًا أمانًا على مستوى الصف يمكن استخدامه لتقييد الوصول بشكل أكبر.

إذن تعريف
SELECT يسمح للمستخدم بعرض البيانات في العنصر (جدول أو عرض). عند الرفض، سيتم منع المستخدم من عرض البيانات داخل الكائن.
INSERT يسمح للمستخدم بإدراج بيانات في العنصر. عند الرفض، سيتم منع المستخدم من إدراج البيانات في الكائن.
UPDATE يسمح للمستخدم بتحديث البيانات في العنصر. عند الرفض، سيتم منع المستخدم من تحديث البيانات في الكائن.
DELETE يسمح للمستخدم بحذف البيانات في العنصر. عند الرفض، سيتم منع المستخدم من حذف البيانات من الكائن.

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

إذن تعريف
CONTROL يمنح كل الحقول إلى العناصر. يسمح للمستخدم الذي لديه هذا الإذن بتنفيذ أي إجراء يرغب في مقابل الكائن، بما في ذلك حذف الكائن.
REFERENCES يمنح المستخدم القدرة على عرض المفاتيح الخارجية على الكائن.
TAKE OWNERSHIP يسمح للمستخدم بالقدرة على الحصول على ملكية الكائن.
VIEW CHANGE TRACKING يسمح للمستخدم بعرض إعداد تعقب التغيير للكائن.
VIEW DEFINITION يسمح للمستخدم بعرض تعريف الكائن.

أذونات الدالات والإجراءات المخزنة

مثل الجداول وطرق العرض، فإن الدالات والإجراءات المخزنة لها العديد من الأذونات التي يمكن منحها أو رفضها.

إذن تعريف
ALTER يمنح المستخدم القدرة على تغيير تعريف الكائن.
CONTROL يمنح المستخدم كافة الحقوق للكائن.
EXECUTE يمنح المستخدم القدرة على تنفيذ الكائن.
VIEW CHANGE TRACKING يسمح للمستخدم بعرض إعداد تعقب التغيير للكائن.
VIEW DEFINITION يسمح للمستخدم بعرض تعريف الكائن.

تنفيذ ⁧ك

يسمح الأمران EXECUTE AS [user name]، أو EXECUTE AS [login name] (متوفر فقط في SQL Server ومثيل Azure SQL المُدَار) أوامر تسمح بتغيير سياق المستخدم. كما سيتم تنفيذ الأوامر التالية والبيانات باستخدام سياق جديد مع الأذونات الممنوحة لهذا السياق.

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

سلاسل الملكية

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

في المثال أدناه، يؤدي تشغيلها كمالك قاعدة بيانات أو مسؤول خادم، إلى إنشاء مستخدم جديد وإضافته كعضو في دور SalesReader جديد، الذي يتم منحه بعد ذلك الإذن للتحديد من أي كائن وتنفيذ أي إجراء في مخطط المبيعات. ثم يتم إنشاء إجراء مخزن في مخطط المبيعات التي تصل إلى جدول في المخطط الإنتاج.

ثم يقوم المثال بتغيير المحتوى ليكون المستخدم الجديد ويتم إجراء محاولة لتحديد مباشرة من الجدول في مخطط الإنتاج.

USE AdventureWorks2016;
GO

CREATE USER [DP300User1] WITH PASSWORD = 'Pa55.w.rd';
GO

CREATE ROLE [SalesReader];
GO

ALTER ROLE [SalesReader] ADD MEMBER [DP300User1];
GO

GRANT SELECT, EXECUTE ON SCHEMA::Sales TO [SalesReader];
GO

CREATE OR ALTER PROCEDURE Sales.DemoProc
AS
SELECT P.Name, 
    SUM(SOD.LineTotal) AS TotalSales,
    SOH.OrderDate 
FROM Production.Product P
    INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
    INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name, 
    SOH.OrderDate
ORDER BY TotalSales DESC;

GO

EXECUTE AS USER = 'DP300User1';

SELECT P.Name, 
    SUM(SOD.LineTotal) AS TotalSales,
    SOH.OrderDate 
FROM Production.Product P
    INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
    INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name, 
    SOH.OrderDate
ORDER BY TotalSales DESC;

ينتج عن الاستعلام أعلاه خطأ أن المستخدم DP300User1 ليس لديه إذن SELECT، لأن الدور الذي ينتمي إليه المستخدم ليست لديه أي امتيازات في مخطط الإنتاج. الآن يمكننا محاولة تنفيذ الإجراء المخزن:

EXECUTE AS USER = 'DP300User1';

EXECUTE Sales.DemoProc;

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

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

CREATE OR ALTER PROCEDURE Sales.DemoProc
AS
DECLARE @sqlstring NVARCHAR(MAX)

SET @sqlstring = '
SELECT P.Name, 
    SUM(SOD.LineTotal) AS TotalSales, 
    SOH.OrderDate 
FROM Production.Product P
    INNER JOIN Sales.SalesOrderDetail SOD ON (SOD.ProductID = P.ProductID)
    INNER JOIN Sales.SalesOrderHeader SOH ON (SOH.SalesOrderID = SOD.SalesOrderID)
GROUP BY P.Name, SOH.OrderDate'

EXECUTE sp_executesql @sqlstring
GO

--

EXECUTE AS USER = 'DP300User1'

EXECUTE Sales.DemoProc

يتلقى DP300User1 خطأ أن المستخدم ليس لديه إذن SELECT على جدول Production.Product، تماماً مثل المستخدم حاول تنفيذ الاستعلام مباشرة. لا يتم تطبيق سلاسل الأذونات ويجب أن يكون يمتلك حساب المستخدم الذي يقوم بتنفيذ SQL الديناميكي حقوقًا في الجداول وطرق العرض التي يتم استخدامها من قبل التعليمات البرمجية ضمن SQL الديناميكي.

مبدأ أقل الامتيازات

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

كمثال، إذا كان التطبيق بالوصول إلى كافة البيانات من خلال الإجراءات المخزنة، ثم يجب أن يكون التطبيق فقط الإذن لتنفيذ الإجراءات المخزنة مع عدم الوصول إلى الجداول.

SQL ديناميكية

SQL الحيوية هو مفهوم حيث يتم إنشاء استعلام برمجيًا. تتيح SQL الحيوية عبارات T SQL لإنشائها داخل إجراء مخزن أو استعلام نفسه. ويرد أدناه مثال بسيط.

SELECT 'BACKUP DATABASE ' + name + ' TO DISK =''\\backup\sql1\' + name + '.bak'''
FROM sys.databases

ستُنشئ العبارة أعلاه قائمة بعبارات T-SQL لعمل نسخة احتياطية من كل قاعدة البيانات الموجودة على الخادم. عادة، سيتم تنفيذ هذا T-SQL الذي تم إنشاؤه باستخدام sp_executesql أو تمريره إلى برنامج آخر لتنفيذه.