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

时间:2011-09-29 13:36:51

标签: sql schema role database-permissions

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

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 :(得分:0)

        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