【问题标题】:SQL Server 2008 Multi-database Permissions via role or schema or scriptingSQL Server 2008 多数据库权限通过角色或架构或脚本
【发布时间】:2011-11-27 17:29:02
【问题描述】:

假设我办公室中有多个用户需要访问多个相互依赖的数据库。我的用户是系统管理员,但随着更多员工的加入,我希望能够为这些不是系统管理员但需要对特定数据库的所有者级别权限的新用户应用特定权限,而无需授予他们修改其他用户的权限。除了手动添加每个角色之外,我还想创建一个可以应用于用户并授予每个数据库权限的角色,或者创建一个模式,将这些权限授予每个数据库上的用户,或者创建一个脚本来提供每个数据库的用户权限。例如

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 添加到角色 1,他们将拥有所有三个数据库(DB1、DB2、DB3)的权限。据我了解,这基本上是一个服务器级角色,但据我所知,您不允许创建自定义服务器级角色。

据我所知,架构是特定于数据库级别的,而不是特定于服务器级别的(我不能将 3 个数据库分组到一个架构中,然后将用户添加到该架构中)。

那么这是否让我只需要编写脚本,还是我错过了使用角色或架构执行此操作的方法?

【问题讨论】:

    标签: sql schema role database-permissions


    【解决方案1】:
    DECLARE @username varchar(50) = 'mynewuser'
    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
    
    WHILE 1=1
    BEGIN
        FETCH NEXT FROM my_cursor INTO @DatabaseName
        IF @@FETCH_STATUS <> 0 BEGIN BREAK END
    
        SET @SQL = '
            USE ' + @DatabaseName + ';
            IF NOT EXISTS(
                SELECT p.name 
                FROM ' + @DatabaseName + '.sys.database_principals p
                WHERE p.name = ''' + @username + '''
            )
            BEGIN
                USE ' + @DatabaseName + ';
                CREATE USER ' + @username + ' FOR LOGIN ' + @username + '
                EXEC sp_addrolemember ''db_owner'', ''' + @username + '''
            END'
    
        EXECUTE(@SQL)
    END
    
    CLOSE my_cursor
    DEALLOCATE my_cursor
    

    【讨论】:

    • 很好的答案!我将尝试将其更改为在基于角色的级别上管理用户和登录的东西。正如我从 OP 中读到的,每个数据库都需要具有权限的角色 - 你不能在服务器级别拥有角色,例如。 db_ddladmin 对多个数据库的权限,对吧?
    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2011-09-24
    • 2010-12-12
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多