使用管理开发人员、工作站和其他部署环境之间的服务器登录和数据库用户
大家好,
从“VisualStudioTeamSystem2008DatabaseEdition”到2008数据库版GDR R2。
vstsdb中的参数化通常很弱,我们必须应用变通方法,让DB项目在每个开发人员工作站上本地部署,以便他们在本地部署应用程序数据库时能够按照沙箱原则进行工作。简单地说,回到一开始,当我使用vstsdb导入2005向导poject类型导入应用程序数据库时,我只是删除了它生成的用户脚本,并且必须添加一个由项目变量驱动的登录前部署脚本,SQLCMD变量只能在这个特殊的脚本位置使用:( .
它同时处理登录和数据库用户,然后将它们连接起来。
看起来像这样..。
BEGIN TRY
BEGIN TRANSACTION
IF UPPER('$(DeployToDev)') = 'FALSE'
BEGIN
-- SMRBtsService
IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE loginname = N'$(DomainAppUserAccount)')
DROP LOGIN [$(DomainAppUserAccount)]
CREATE LOGIN [$(DomainAppUserAccount)] FROM WINDOWS
IF EXISTS (SELECT * FROM sys.database_principals WHERE NAME = 'SMRBtsService')
DROP USER [SMRBtsService]
CREATE USER [SMRBTSService] FOR LOGIN [$(DomainAppUserAccount)] WITH DEFAULT_SCHEMA=[dbo]
-- WebUser
IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE loginname = N'$(DomainWebUserAccount)')
DROP LOGIN [$(DomainWebUserAccount)]
CREATE LOGIN [$(DomainWebUserAccount)] FROM WINDOWS
IF EXISTS (SELECT * FROM sys.database_principals WHERE NAME = 'WebUser')
DROP USER [WebUser]
CREATE USER [WebUser] FOR LOGIN [$(DomainWebUserAccount)] WITH DEFAULT_SCHEMA=[dbo]
END
ELSE IF UPPER('$(DeployToDev)') = 'TRUE'
BEGIN
-- BTSSERVICE
IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE loginname = N'$(COMPUTERNAME)\BTSSERVICE')
DROP LOGIN [$(COMPUTERNAME)\BTSSERVICE]
CREATE LOGIN [$(COMPUTERNAME)\BTSSERVICE] FROM WINDOWS
IF EXISTS (SELECT * FROM sys.database_principals WHERE NAME = 'SMRBtsService')
DROP USER [SMRBtsService]
CREATE USER [SMRBTSService] FOR LOGIN [$(COMPUTERNAME)\BTSSERVICE] WITH DEFAULT_SCHEMA=[dbo]
-- WebUser
IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE loginname = N'$(COMPUTERNAME)\WebUser')
DROP LOGIN [$(COMPUTERNAME)\WebUser]
CREATE LOGIN [$(COMPUTERNAME)\WebUser] FROM WINDOWS
IF EXISTS (SELECT * FROM sys.database_principals WHERE NAME = 'WebUser')
DROP USER [WebUser]
CREATE USER [WebUser] FOR LOGIN [$(COMPUTERNAME)\WebUser] WITH DEFAULT_SCHEMA=[dbo]
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (XACT_STATE()) <> 0
ROLLBACK TRANSACTION
DECLARE @ErrorMessage NVARCHAR(4000),
@ErrorNumber INT,
@ErrorSeverity INT,
@ErrorState INT,
@ErrorLine INT,
@ErrorProcedure NVARCHAR(200) ;
SELECT @ErrorNumber = ERROR_NUMBER(), @ErrorSeverity = 20,
@ErrorState = ERROR_STATE(), @ErrorLine = ERROR_LINE(),
@ErrorProcedure = ISNULL(ERROR_PROCEDURE(), '-') ;
SELECT @ErrorMessage = N'Error %d, Level %d, State %d, Procedure %s, Line %d, ' +
'Message: ' + ERROR_MESSAGE() ;
RAISERROR (@ErrorMessage, @ErrorSeverity, 1, @ErrorNumber, -- parameter: original error number.
@ErrorSeverity, -- parameter: 20, we want to stop the entire deploy process.
@ErrorState, -- parameter: original error state.
@ErrorProcedure, -- parameter: original error procedure name.
@ErrorLine-- parameter: original error line number.
) ;
END CATCH问题;
如何使用民主德国版本实现这种功能,我看到它支持在引用层次结构中链接项目的概念。您有两个项目类型,一个数据库和一个服务器项目。但是,您仍然需要创建这样一个脚本,以实现项目在开发模式下部署在任何机器上的相同的动态能力?
除了数据库项目类型的所有对象(脚本)之外,创建服务器项目类型只会添加服务器对象。
关于复合项目结构的文献..。但我看不出有什么明显的解决办法。
发布于 2009-05-02 20:34:56
我们在VSDBCMD、模式比较和MSBuild部署方面也遇到了相当多的关于用户和登录以及针对不同服务器的问题。
我强烈建议您安装RC2!
按照安装说明(非常重要)!
希望这能帮上忙。让我知道!
https://stackoverflow.com/questions/786462
复制相似问题