如何授予所有数据库的连接和读/写权限?

Mag*_*ier 4 sql-server permissions role

我想要一个可以在所有数据库上读取、写入和查看定义的 SQL Server 登录名。

做完之后:

USE master;
GRANT VIEW ANY Definition TO [a];
Run Code Online (Sandbox Code Playgroud)

看起来我必须授予连接并读取/写入每个数据库。

没有更简单的方法吗?

Jul*_*eur 7

您确实必须将用户添加到每个现有数据库的db_datareaderdb_datawriter角色。

这样的查询可用于现有(和在线)用户数据库:

DECLARE @user sysname = 'userTest1';
DECLARE @login sysname = 'userTest1';
DECLARE @SQL nvarchar(max) = '';

SELECT @SQL = @SQL + '
    USE ' + QUOTENAME(NAME) + ';

    IF NOT EXISTS(SELECT 1 FROM sys.database_principals WHERE name = ''' + @user + ''')
    BEGIN
        CREATE USER ' + QUOTENAME(@user)
           + ' FOR LOGIN ' + QUOTENAME(@login)
           + ' WITH DEFAULT_SCHEMA=[dbo];
    END
    ELSE
    BEGIN
        EXEC sp_change_users_login ''Update_One'', ''' + @user + ''', ''' + @login + ''';
    END

    EXEC sys.sp_addrolemember ''db_datareader'', ''' + @user + ''';

    EXEC sys.sp_addrolemember ''db_datawriter'', '''+ @user + '''; 
'
FROM sys.databases
WHERE database_id > 4 AND state = 0;

--EXEC sp_executesql @sql;
print @sql
Run Code Online (Sandbox Code Playgroud)
  • 这将从中打印前 4000 个字符@sql。注释掉 EXEC 行以执行它。
  • 如果用户不存在则创建该用户,或者如果用户已经存在则更新登录链接
  • 然后将用户添加到db_datareaderdb_datawriter角色
  • 任何其他需要的权限或角色都可以添加到查询中

新数据库是model从其设置创建的并将继承其设置。用户可以添加到模型上的db_datareaderdb_datawriter角色中:

use model
go
CREATE USER [userTest1] FOR LOGIN [userTest1] WITH DEFAULT_SCHEMA=[dbo];
EXEC sys.sp_addrolemember 'db_datareader', 'userTest1';
EXEC sys.sp_addrolemember 'db_datawriter', 'userTest1'; 
Run Code Online (Sandbox Code Playgroud)

第一个查询可以model使用此WHERE子句同时处理用户数据库:

WHERE (database_id > 4 or name = 'model') AND state = 0;
Run Code Online (Sandbox Code Playgroud)

注意(来自 Kenneth Fisher):在 SQL Server 2014 中,有一些新权限,包括连接和读取权限CONNECT ANY DATABASESELECT ALL USER SECURABLES但不幸的是,写入权限还没有类似的内容。(微软)