2010-08-23 63 views
7

我有一个存储过程,可以查找所有现有数据库并从每个表中读取数据。SQL Server - 为所有现有和未来数据库提供读取访问的登录权限

有没有一种方法可以让所有数据库的登录读取权限,以及所有未来的数据库,即添加新数据库时不需要做任何事情?

有没有可以工作的服务器角色?有没有办法让SQL代理作业添加任何新数据库的权限?或者还有其他一些方法吗?

回答

9

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

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'', ''...'' 
' 
+0

用户自动获得运行后读访问? – Greg 2010-08-23 18:40:20

+0

那么,你也需要授予一些权利,但他们将有数据库访问 – gbn 2010-08-23 18:42:57

+0

如何自动授予表的读权限?否则,我回到了我开始的地方。 – Greg 2010-08-23 18:48:11

1

USE [主] GO --IF NOT EXISTS(SELECT * FROM syslogins中,其中登录名= '与登录名替换') - CREATE LOGIN [与登录名替换]从与DEFAULT_DATABASE = [主] --GO DECLARE @SQL VARCHAR(MAX) DECLARE @DatabaseName VARCHAR(255)

WINDOWS

DECLARE crFetch CURSOR FOR --Select NAME FROM SYSDATABASES WHERE名称在 - ( '主', '模型', 'tempdb的', 'msdb中', '分配')

SELECT NAME FROM SYS。DATABASES WHERE名称不 ( '大师', '模型', 'tempdb数据库', 'msdb中', '分配')

OPEN crFetch FETCH NEXT FROM crFetch INTO @DatabaseName

WHILE @@ FETCH_STATUS < > -1 BEGIN

SET @SQL =

'USE [' + @DatabaseName + ']' + '如果不存在(从选择的sysusers name其中name =' + '' '' +'替换为登录名'+''''+')'+ 'CREATE USER [r用登录名替换]用登录名[用登录名替换]'+ 'EXEC sp_addrolemember''''''''''''+',''+''''' '+''''+' '

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

--print @SQL

EXEC(@SQL)

NEXT来去crFetch INTO @DatabaseName END

CLOSE crFetch DEALLOCATE crFetch

相关问题