SQL Server - Give a Login Permission for Read Access to All Existing and Future Databases

后端 未结 2 1250
礼貌的吻别
礼貌的吻别 2020-12-19 04:48

I have a stored procedure that finds all the existing databases and reads from a table in each one.

Is there a way I can give a login read access to all databases,

相关标签:
2条回答
  • 2020-12-19 05:10

    USE [master] GO --IF Not EXISTS (SELECT * FROM syslogins where loginname = 'replace with Login name ') --CREATE LOGIN [replace with Login name ] FROM WINDOWS WITH DEFAULT_DATABASE=[master] --GO DECLARE @SQL VARCHAR(MAX) DECLARE @DatabaseName VARCHAR(255)

    DECLARE 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')

    OPEN crFetch FETCH NEXT FROM crFetch INTO @DatabaseName

    WHILE @@FETCH_STATUS <> -1 BEGIN

    SET @SQL =

    'USE [' + @DatabaseName + ']' + 'if not exists (select name from sysusers where name='+ ''''+ 'replace with Login name '+ ''''+ ')' + 'CREATE USER [replace with Login name ] FOR LOGIN [replace with Login name ]' + 'EXEC sp_addrolemember N' + '''' + 'db_ETL' + '''' + ', N' + '''' + 'replace with Login name ' + '''' +' '

    --'EXEC sp_addrolemember N' + '''' + 'db_datareader' + '''' + ', N' + '''' + 'replace with Login name ' + '''' + --'if not exists(select name from sysusers where name='+ ''''+ 'db_executor'+''''+ 'and issqlrole=1)' + --'create ROLE db_executor' + ' ' + --'GRANT EXECUTE TO db_executor' + ' ' + --'EXEC sp_addrolemember N' + '''' + 'db_executor' + '''' + ', N' + '''' + 'replace with Login name ' + '''' +'

    --PRINT @SQL

    EXEC(@SQL)

    FETCH NEXT FROM crFetch INTO @DatabaseName END

    CLOSE crFetch DEALLOCATE crFetch

    0 讨论(0)
  • 2020-12-19 05:19

    For new databases, add the user in the model database. This is used as the template for all new databases.

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

    For existing databases, use sp_MSForEachDb

    EXEC sp_MSForEachDb '
     USE ?
     CREATE USER ... FROM LOGIN...  
     EXEC sp_addrolemember ''db_datareader'', ''...''
    '
    
    0 讨论(0)
提交回复
热议问题