2010-08-23 66 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

相關問題