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

StackOverflow https://stackoverflow.com/questions/44780

سؤال

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

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

هل كانت مفيدة؟

المحلول

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

 IF EXISTS (
    SELECT 1 FROM sysobjects
    WHERE name = 'sp_grantastic'
    AND type = 'P'
)
DROP PROCEDURE sp_grantastic
GO
CREATE PROCEDURE sp_grantastic
AS
DECLARE
 @object_name VARCHAR(30)
,@time       VARCHAR(8)
,@rights     VARCHAR(20)
,@role       VARCHAR(20)

DECLARE c_objects CURSOR FOR
    SELECT  name
    FROM    sysobjects
    WHERE   type IN ('P', 'U', 'V')
    FOR READ ONLY

BEGIN

    SELECT  @rights = 'ALL'
           ,@role = 'PUBLIC'

    OPEN c_objects
    WHILE (1=1)
    BEGIN
        FETCH c_objects INTO @object_name
        IF @@SQLSTATUS <> 0 BREAK

        SELECT @time = CONVERT(VARCHAR, GetDate(), 108)
        PRINT '[%1!] hitting up object %2!', @time, @object_name
        EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)

    END

    PRINT '[%1!] fin!', @time

    CLOSE c_objects
    DEALLOCATE CURSOR c_objects
END
GO
GRANT ALL ON sp_grantastic TO PUBLIC
GO

ثم يمكنك إطلاق النار ونسيان:

EXEC sp_grantastic

نصائح أخرى

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

هناك إجراء MS غير موثق يسمى sp_MSforeachtable يمكنك استخدامه وهو بالتأكيد في عامي 2000 و2005.

لمنح أذونات محددة، سيكون الاستخدام:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName'

لمنح الأذونات الأخرى إما أن يكون لديك بيان جديد لكل واحد أو فقط قم بإضافتها إلى الأمر مثل هذا:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName; Grant Delete on ? to RoleName;'

مع القليل من اللعب، قد يكون من الممكن تحويل اسم الدور إلى معلمة أيضًا.

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

CREATE PROCEDURE dbo.SP_GrantFullAccess 
    @username varchar(300)
AS

DECLARE @on varchar(300) 
DECLARE @count int
SET @count = 0

PRINT 'Granting access to user ' + @username + ' on the following objects:'

DECLARE c CURSOR FOR 
SELECT name FROM sysobjects WHERE type IN('U', 'V', 'SP', 'P') ORDER BY name
OPEN c 
FETCH NEXT FROM c INTO @on 
WHILE @@FETCH_STATUS = 0 
BEGIN 
 SET @count = @count + 1
 EXEC('GRANT ALL ON [' + @on + '] TO [' + @username + ']') 
 --PRINT 'GRANT ALL ON [' + @on + '] TO ' + @username
 PRINT @on
 FETCH NEXT FROM c INTO @on 
END 
CLOSE c 
DEALLOCATE c

PRINT 'Granted access to ' + cast(@count as varchar(4)) + ' object(s).'
GO
use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON ? TO Admins, Mgmt",
    @whereand = " and o.name like 'tbl_%'"
GO

use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT REFERENCES, SELECT ON ? TO Employee, public",
    @whereand = " and o.name like 'tbl_%'"
GO
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top