SQL Server - 授予对所有现有和未来数据库的读取访问权限的登录权限

Posted

技术标签:

【中文标题】SQL Server - 授予对所有现有和未来数据库的读取访问权限的登录权限【英文标题】:SQL Server - Give a Login Permission for Read Access to All Existing and Future Databases 【发布时间】:2011-04-02 19:19:03 【问题描述】:

我有一个存储过程,它查找所有现有数据库并从每个数据库中的一个表中读取。

有没有一种方法可以让我对所有数据库以及所有未来的数据库进行登录读取访问,即添加新数据库时我无需执行任何操作?

是否有可以工作的服务器角色?有没有办法让 SQL 代理作业在任何新数据库上添加权限?还是有其他方法?

【问题讨论】:

【参考方案1】:

对于新数据库,在模型数据库中添加用户。这被用作所有新数据库的模板。

USE model
CREATE USER ... FROM LOGIN...
EXEC sp_addrolemember 'db_datareader', '...'

对于现有数据库,使用 sp_MSForEachDb

EXEC sp_MSForEachDb '
 USE ?
 CREATE USER ... FROM LOGIN...  
 EXEC sp_addrolemember ''db_datareader'', ''...''
'

【讨论】:

运行后用户会自动获得读取权限吗? 好吧,您也需要授予一些权限,但他们将拥有数据库访问权限 如何自动授予对表的读取权限?否则我有点回到我开始的地方。 @greg:我也添加了权限 顺便说一句,对于那些为 SharePoint 来到这里的其他人,用户名和数据库名称(尤其是连字符)有些奇怪,我不得不将上面的第二个查询修改为 EXEC sp_MSForEachDb ' USE [?] CREATE USER [...] FROM LOGIN [...] EXEC sp_addrolemember ''db_datareader'', ''...'''【参考方案2】:

使用 [主] 走 --IF Not EXISTS (SELECT * FROM syslogins where loginname = 'replace with Login name') --CREATE LOGIN [替换为登录名] FROM WINDOWS WITH DEFAULT_DATABASE=[master] - 走 声明 @SQL VARCHAR(MAX) 声明@DatabaseName VARCHAR(255)

声明crFetch CURSOR FOR --SELECT NAME FROM SYSDATABASES WHERE name in --('master','model','tempdb','msdb','distribution')

SELECT NAME FROM SYS.DATABASES WHERE name not in ('master','model','tempdb','msdb','distribution')

打开 crFetch FETCH NEXT FROM crFetch INTO @DatabaseName

WHILE @@FETCH_STATUS -1 开始

SET @SQL =

'使用 [' + @DatabaseName + ']' + '如果不存在(从sysusers中选择名称,其中name='+''''+'替换为登录名'+''''+')'+ 'CREATE USER [替换为登录名] FOR LOGIN [替换为登录名]' + 'EXEC sp_addrolemember N' + '''' + 'db_ETL' + '''' + ', N' + '''' + '替换为登录名' + '''' +' '

--'EXEC sp_addrolemember N' + '''' + 'db_datareader' + '''' + ', N' + '''' + '替换为登录名' + '''' + --'如果不存在(从 sysusers 中选择名称,其中 name='+ ''''+ 'db_executor'+''''+ 'and issqlrole=1)' + --'创建角色 db_executor' + ' ' + --'GRANT EXECUTE T​​O db_executor' + ' ' + --'EXEC sp_addrolemember N' + '''' + 'db_executor' + '''' + ', N' + '''' + '替换为登录名' + '''' +'

--打印@SQL

执行(@SQL)

FETCH NEXT FROM crFetch INTO @DatabaseName 结束

关闭 crFetch DEALLOCATE crFetch

【讨论】:

以上是关于SQL Server - 授予对所有现有和未来数据库的读取访问权限的登录权限的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL - 在*所有模式*中授予对所有表(和未来表)的选择

如何授予用户对 SQL Server 中数据库的读取权限?

授予对数据库的 SQL Server 登录访问权限 - SQL Server

如何在不更改现有数据位置的情况下添加新的 SQL Server 分区范围来容纳未来的数据?

SQL Server存储过程(数据库引擎)使用详解

授予对 PostgreSQL 中未来表的权限?