AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 7709
Accepted
Kyle Brandt
Kyle Brandt
Asked: 2011-11-10 11:50:55 +0800 CST2011-11-10 11:50:55 +0800 CST 2011-11-10 11:50:55 +0800 CST

在 SQL Server 2008 R2 中授予读取所有权限的最佳方法?

  • 772

向用户(在这种情况下为 AD 组)授予对所有当前和未来数据库的读取访问权限的最佳方法是什么?

目前我有一个不稳定的预定作业,它使用(将开始调试以下内容,但也许我做错了):

sp_msforeachdb '
USE [?]
CREATE USER [MY_DOMAIN\SQL-READ-ALL] FOR LOGIN [MY_DOMAIN\SQL-READ-ALL]
USE [?]
EXEC sp_addrolemember N''db_datareader'', N''MY_DOMAIN\SQL-READ-ALL''
'

也许有更好的方法?

sql-server-2008-r2
  • 3 3 个回答
  • 6205 Views

3 个回答

  • Voted
  1. Best Answer
    gbn
    2011-11-10T12:09:07+08:002011-11-10T12:09:07+08:00

    对于未来的数据库,请这样做,因为所有数据库都是从model

    USE model
    EXEC sp_addrolemember N'db_datareader', N'MY_DOMAIN\SQL-READ-ALL'
    

    对于现有数据库,只需运行上面的内容,一次

    • 10
  2. Remus Rusanu
    2011-11-10T18:55:10+08:002011-11-10T18:55:10+08:00

    关于恢复:您可以为AUDIT_BACKUP_RESTORE事件设置事件通知。不适合胆小的人,因为编写异步事件通知并不容易,但它可以完成您要求的工作。请参阅实现事件通知。

    • 3
  3. David Sette
    2016-04-29T07:14:16+08:002016-04-29T07:14:16+08:00

    另一种选择是创建一个按计划运行的 SQL Server 代理作业,以便为所有数据库执行 SQL。

    您还可以将代码包装在存储过程中,您可以在模型数据库或“实用程序”数据库中创建该存储过程。

    下面是一种可能的实现(假设登录名和用户名相同,但可以修改以处理不同的登录名/用户名):

    CREATE PROCEDURE [dbo].[usp_CreateLoginAndUserDbDataReader]
        @LoginName NVARCHAR(50),
        @Password  NVARCHAR(50),
        @DbName NVARCHAR(128)
    
    AS
    BEGIN
        DECLARE @SQL nvarchar(1000)
    
        IF NULLIF(@LoginName, '') IS NULL
            OR NULLIF(@Password, '') IS NULL
            OR NULLIF(@DbName, '') IS NULL
            THROW 70000, 'You must specify a value for @LoginName, @Password, and @DbName', 1
    
        IF NOT EXISTS (SELECT name
            FROM master.sys.server_principals
            WHERE name = @LoginName)
        BEGIN
            PRINT '@loginname = ' + COALESCE( @LoginName, 'NULL' )
            SET @SQL = 'CREATE LOGIN [' + @LoginName + '] WITH PASSWORD = ''' + @Password + ''', DEFAULT_DATABASE=[' + @DBNAME + '], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF';
            PRINT @SQL
            EXECUTE (@SQL);
        END
    
        SET @SQL = N'USE [' + @DbName + ']; 
        IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = ''' + @LoginName + ''')
        BEGIN
            CREATE USER [' + @LoginName + '] FOR LOGIN [' + @LoginName + ']
        END';
        PRINT @SQL
        EXECUTE (@SQL);
    
        SET @SQL = 'USE [' + @DbName + ']; ALTER ROLE [db_datareader] ADD MEMBER [' + @LoginName + ']';
        PRINT @SQL
        EXECUTE (@SQL);
    
        RETURN 0
    END
    

    从计划每天运行或按所需计划运行的 SQL Server 代理作业,您可以像这样调用上面的代码:

    sp_msforeachdb '
    USE *DatabaseWhereStoredProcedureResides*
    EXEC [usp_CreateLoginAndUserDbDataReader] ''*LoginName*'', ''*UserName*'', ''?''
    '
    
    • 0

相关问题

  • SQL Server 2008 R2 中的自动收缩、加密和恢复模型属性

  • SQL Server 2008 R2 群集的无人参与安装失败并出现错误 - “路径中有非法字符”。

  • 迁移大型数据库

  • 代理执行的维护计划

  • 随机化表内容并将它们存储回表中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve