Visual Studio 2008数据库版

时间:2009-04-24 15:54:43

标签: database visual-studio-2008 sql-server-2005 teamsystem

使用Visual Studio Team System Database Edition在开发人员工作站和其他部署环境之间管理服务器登录和数据库用户

大家好,

看着从中获益 'Visual Studio Team System 2008数据库版' 至 的 Visual Studio Team System 2008 Database Edition GDR R2

vstsdb中的参数化通常很弱,我们不得不应用变通方法让DB项目在每个开发人员工作站上本地部署,以便他们在本地部署符合沙箱原则的应用程序数据库时工作。 基本上,回到开始时,当我使用vstsdb import 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

问题;

如何使用GDR版本实现此类功能,我发现它支持在引用层次结构中链接项目的概念。您有两种项目类型,数据库和服务器项目。但是你还需要创建一个这样的脚本来实现项目在开发模式下部署在任何机器上的相同动态能力吗?

创建服务器项目类型除了添加数据库项目类型的所有对象(脚本)之外,还添加服务器对象。

复合项目结构的文档讨论......但我仍然没有看到明显的解决方案。

1 个答案:

答案 0 :(得分:1)

我们在VSDBCMD,Schema Compare和MSBuild Deployment方面也遇到了大量有关用户和登录以及针对不同服务器的问题。

我强烈建议您安装RC2!

按照安装说明进行操作(非常重要)!

希望这会有所帮助...... 让我知道!