通过角色、架构或脚本的SQL Server 2008多数据库权限

通过角色、架构或脚本的SQL Server 2008多数据库权限,sql,schema,role,database-permissions,Sql,Schema,Role,Database Permissions,假设我的办公室中有多个用户需要访问相互依赖的多个数据库。我有一些用户是系统管理员,但随着更多员工的加入,我希望能够为这些新用户应用特定权限,这些新用户不是系统管理员,但需要对特定数据库拥有所有者级别的权限,而无需授予他们修改其他用户的权限。与手动添加每个角色不同,我希望创建一个可以应用于用户并授予每个数据库权限的角色,或者创建一个架构,将这些权限授予用户对每个数据库的权限,或者创建一个脚本来授予用户对每个数据库的权限。比如说 DB1 -sysadmin (contains user1

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

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个数据库分组到一个模式中,然后将用户添加到该模式中


那么,这让我只需要编写脚本,还是我缺少了一种通过角色或模式来实现这一点的方法

回答得好!我将尝试将其更改为在基于角色的级别上管理用户和登录。正如我从OP中读到的,每个数据库都需要具有权限的角色-您不能在服务器级别拥有一个角色,这会为多个数据库提供db_ddladmin权限,对吗?回答得很好!我将尝试将其更改为在基于角色的级别上管理用户和登录。正如我从OP中读到的,每个数据库都需要具有权限的角色-您不能在服务器级别拥有一个角色,该角色为多个数据库提供db_ddladmin权限,对吗?
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