Разрешения для нескольких баз данных SQL Server 2008 с помощью роли, схемы или сценариев - PullRequest
1 голос
/ 29 сентября 2011

Допустим, в моем офисе есть несколько пользователей, которым нужен доступ к нескольким базам данных, которые зависят друг от друга.У меня есть пользователи, которые являются системными администраторами, но по мере добавления большего числа сотрудников я хочу иметь возможность применять определенные разрешения для этих новых пользователей, которые не являются системными администраторами, но нуждаются в разрешениях уровня владельца для определенных баз данных без предоставления им разрешений для изменения других пользователей.Вместо того, чтобы просто добавлять каждую из них вручную, я хотел бы либо создать роль, которая может быть применена к пользователю и предоставит разрешения для каждой базы данных, либо создать схему, которая предоставит эти разрешения пользователю для каждой базы данных, либо создать сценарий для предоставленияразрешения для пользователя для каждой базы данных.например

DB1
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)
DB2
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)
DB3
 -sysadmin
     (contains user1, user2)
 -role1
     (contains user3, user4)

Я хочу добавить user3 и user4 к role1 один раз, и они будут иметь разрешения для всех трех баз данных (DB1, DB2, DB3).Насколько я понимаю, это в основном роль уровня сервера, но из того, что я прочитал, вам не разрешено создавать собственные роли уровня сервера.

Кроме того, насколько я понимаю, схемы зависят от уровня базы данных, а не от уровня сервера (Я не могу сгруппировать 3 базы данных в одну схему, а затем добавить пользователей в эту схему).

Так что, мне остается только использовать сценарии или мне не хватает способа сделать это с помощью роли или схемы?

1 Ответ

0 голосов
/ 04 октября 2011
        DECLARE @username varchar(50)
        DECLARE @dbRole varchar(50)
        DECLARE @SQL varchar(max)
        DECLARE @DatabaseName varchar(MAX)

        DECLARE my_cursor CURSOR FOR
         SELECT CAST([Name] AS varchar(MAX)) AS databasename
         FROM sys.sysdatabases
        --only user databases
         WHERE DBID>4 AND [NAME] NOT LIKE '$'
         OPEN my_cursor
         FETCH NEXT FROM my_cursor
         INTO @DatabaseName
         WHILE @@FETCH_STATUS = 0
        BEGIN

        SET @SQL = 'USE ' + @DatabaseName + ';
        IF NOT EXISTS(SELECT ' + @DatabaseName + '.sys.database_principals.name FROM ' + @DatabaseName + '.sys.database_principals WHERE ' + @DatabaseName + '.sys.database_principals.name = ''' + @DatabaseName + ''')
        BEGIN
         USE ' + @DatabaseName + ';
         CREATE USER ' + @username + ' FOR LOGIN ' + @username + '
         EXEC sp_addrolemember ''db_owner'', ''' + @username + '''
        END'
        EXECUTE(@SQL)

        END
...