我在SQL Server 2008 R2中构建了一个数据库,并使用Visual Studio 2010 Ultimate为它创建数据库项目。
我已经基于此MSDN walkthrough创建了一个SQL Server项目和数据库项目来表示我的环境。两个项目的模式比较按预期工作,我能够将所有更改服务器复制到项目中。
然而,它似乎已经导入了一些特定于环境的配置,例如登录,用户/登录映射,本地服务帐户(例如NT SERVICE \ MSSQL $ SQLEXPRESS2008)等。这似乎并不理想,因为我的印象是这个数据库项目可以部署到另一台服务器上,这些环境特定的细节可能不同。例如,Dev,QA和Prod之间的命名实例可能不同。用户可以映射到不同的登录名。
我是否正确地执行此操作,还是应该采取额外步骤使数据库项目可移植到所有环境?
我的目标是利用这个项目
答案 0 :(得分:7)
我们之前不得不弄乱这个问题,最后使用Jamie Thompson创建部署后脚本来处理基于包含环境/配置名称的变量的权限的想法。你可以在这里找到这篇文章: 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
我还编写了一个脚本来处理权限脚本:
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
我一起设置了部署后脚本和文件夹的权限,这些脚本和文件夹将根据环境重新创建用户/角色/权限。我们从主要的部署后部分调用一个“包装器”脚本,通过其余部分来确定要运行的部分。