Mag*_*ier 4 sql-server permissions role
我想要一个可以在所有数据库上读取、写入和查看定义的 SQL Server 登录名。
做完之后:
USE master;
GRANT VIEW ANY Definition TO [a];
Run Code Online (Sandbox Code Playgroud)
看起来我必须授予连接并读取/写入每个数据库。
没有更简单的方法吗?
您确实必须将用户添加到每个现有数据库的db_datareader和db_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)
@sql。注释掉 EXEC 行以执行它。db_datareader和db_datawriter角色新数据库是model从其设置创建的并将继承其设置。用户可以添加到模型上的db_datareader和db_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 DATABASE,SELECT ALL USER SECURABLES但不幸的是,写入权限还没有类似的内容。(微软)
| 归档时间: |
|
| 查看次数: |
10645 次 |
| 最近记录: |