sql-server - 如何在 Visual Studio 数据库项目中处理用户和登录?

标签 sql-server visual-studio-2010 visual-studio sql-server-2008-r2 database-project

我已经在 SQL Server 2008 R2 中构建了一个数据库,并使用 Visual Studio 2010 Ultimate 为其创建一个数据库项目。

我已经创建了一个 SQL Server 项目和数据库项目来代表我基于此 MSDN walkthrough 的环境。 。两个项目的架构比较都按预期工作,我能够将服务器的所有更改复制到项目。

但是,它似乎导入了一些特定于环境的配置,例如登录、用户/登录映射、本地服务帐户(例如 NT SERVICE\MSSQL$SQLEXPRESS2008)等。这似乎不太理想,因为我的印象是这个数据库项目可以部署到另一台服务器上,并且这些环境特定的细节可能会有所不同。例如,Dev、QA 和 Prod 之间的命名实例可能不同。用户可以映射到不同的登录。

我这样做是否正确,还是应该采取额外的步骤来使数据库项目可移植到所有环境?

我的目标是利用这个项目

  1. 在版本控制中捕获架构
  2. 部署架构更改,例如通过生成更改脚本
  3. 与单元测试相结合,动态创建一次性测试环境。

最佳答案

我们之前不得不解决这个问题,最终使用 Jamie Thompson 的想法来创建部署后脚本来根据包含环境/配置名称的变量来处理权限。您可以在这里找到(已存档)文章: https://web.archive.org/web/20190222004817/http://sqlblog.com/blogs/jamie_thomson/archive/2010/07/21/a-strategy-for-managing-security-for-different-environments-using-the-database-development-tools-in-visual-studio-2010.aspx

注意:杰米的链接显然已失效。我在此基础上写了一些东西: http://schottsql.com/2013/05/14/ssdt-setting-different-permissions-per-environment/

我还编写了一个脚本来处理权限脚本:

SELECT
state_desc + ' ' + permission_name +
' on ['+ ss.name + '].[' + so.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN sys.objects AS so
     ON sdp.major_id = so.OBJECT_ID
JOIN SYS.SCHEMAS AS ss
     ON so.SCHEMA_ID = ss.SCHEMA_ID
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id

UNION

SELECT
state_desc + ' ' + permission_name +
' on Schema::['+ ss.name + ']
to [' + sdpr.name + ']'
COLLATE LATIN1_General_CI_AS as [Permissions T-SQL]
FROM SYS.DATABASE_PERMISSIONS AS sdp
JOIN SYS.SCHEMAS AS ss
     ON sdp.major_id = ss.SCHEMA_ID
     AND sdp.class_desc = 'Schema'
JOIN SYS.DATABASE_PRINCIPALS AS sdpr
     ON sdp.grantee_principal_id = sdpr.principal_id
order by [Permissions T-SQL]
GO

我一起将权限设置到部署后脚本和文件夹中,这些脚本和文件夹将根据环境重新创建用户/角色/权限。我们从主要的部署后部分调用“包装器”脚本,该脚本将遍历其余部分以确定要运行哪个部分。

关于sql-server - 如何在 Visual Studio 数据库项目中处理用户和登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16427719/

相关文章:

sql - 在 SQL Server 中编写 VIEW 时需要帮助

java - 更快地插入到 oracle

c# - 如何在 ASP 中使用 JavaScript 禁用/启用带有按钮的 DropDownList

c++ - 禁用 MSVC 警告 C4482 是否安全?

visual-studio - Visual Studio IDE - 有没有办法在特定位置打开控制台窗口

c# - 如何将原始数据显示为图像 (Visual Studio c#)

c# - 在共享主机上使用 SQL Server 数据库

c# - 每天将大量 XML 数据(> 1Gb)导入 SQL Server 2008

c++ - 以 C++ 形式捕获异常

visual-studio - Visual Studio 2010 中的 x64 程序集突出显示/格式化