Sql server VisualStudio中的SQL Server数据库创建脚本

Sql server VisualStudio中的SQL Server数据库创建脚本,sql-server,database,visual-studio,version-control,Sql Server,Database,Visual Studio,Version Control,作为我正在进行的ASP.NET MVC项目的一部分,我将使用SQL Server 2008 Express 我不确定应该如何使用一种版本可控(我正在使用Mercurial)的方式来重新创建数据库 理想情况下,它应该在我每次在VisualStudio2008中执行构建时运行 编辑1:作为对两个答案的回应,我正在使用Visual Studio 2008专业版,这是我通过程序收到的。您使用的是Visual Studio Team Suite还是Visual Studio Developer Editi

作为我正在进行的ASP.NET MVC项目的一部分,我将使用SQL Server 2008 Express

我不确定应该如何使用一种版本可控(我正在使用Mercurial)的方式来重新创建数据库

理想情况下,它应该在我每次在VisualStudio2008中执行构建时运行


编辑1:作为对两个答案的回应,我正在使用Visual Studio 2008专业版,这是我通过程序收到的。

您使用的是Visual Studio Team Suite还是Visual Studio Developer Edition?如果是这样的话,VisualStudioDatabaseEdition是免费的,是管理数据库模式的一种极好的方法。具有您可能需要的所有功能

兰迪

看看

这允许您存储和使用数据库模式和人工制品(表、过程、触发器……几乎所有东西)。它还允许将一个模式与另一个模式或数据库实例进行比较,并将生成更改/部署脚本

还有对参考数据的支持(尽管在产品生命周期的这个阶段这不是很好)


还有与MSBuild的集成-我现在在一个大型项目上使用它,每次我们进行构建时,都会生成一个模式文件,然后我们使用该文件来实际生成应用于给定数据库的脚本(使用VSDBCMD.EXE)。我们目前不会自动推出这些更改,但这样做并不太困难。

根据您的一些项目具体情况,有几种方法可以实现这一点。我们有.sql文件,在执行时可以重新创建数据库。这允许脚本进入您的源代码管理,并像其他任何东西一样进行版本控制。它还允许在产品投入生产后添加更改脚本

我们使用它删除数据库中的所有对象:

private static void DropDatabaseObjects()
    {
        var dropDatabaseObjects =
            @"
                    /* Drop all non-system stored procs */
                    DECLARE @name VARCHAR(128)
                    DECLARE @constraint VARCHAR(254)
                    DECLARE @SQL VARCHAR(254)
                    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 ORDER BY [name])
                    WHILE @name is not null
                    BEGIN
                        SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
                        EXEC (@SQL)
                        PRINT 'Dropped Procedure: ' + @name
                        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
                    END

                    /* Drop all views */
                    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 ORDER BY [name])
                    WHILE @name IS NOT NULL
                    BEGIN
                        SELECT @SQL = 'DROP VIEW [dbo].[' + RTRIM(@name) +']'
                        EXEC (@SQL)
                        PRINT 'Dropped View: ' + @name
                        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'V' AND category = 0 AND [name] > @name ORDER BY [name])
                    END

                    /* Drop all functions */
                    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])
                    WHILE @name IS NOT NULL
                    BEGIN
                        SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
                        EXEC (@SQL)
                        PRINT 'Dropped Function: ' + @name
                        SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
                    END                        

                    /* Drop all Foreign Key constraints */
                    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
                    WHILE @name is not null
                    BEGIN
                        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
                        WHILE @constraint IS NOT NULL
                        BEGIN
                            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT ' + RTRIM(@constraint)
                            EXEC (@SQL)
                            PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
                            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
                        END
                    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
                    END

                    /* Drop all Primary Key constraints */
                    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
                    WHILE @name IS NOT NULL
                    BEGIN
                        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
                        WHILE @constraint is not null
                        BEGIN
                            SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT ' + RTRIM(@constraint)
                            EXEC (@SQL)
                            PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
                            SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
                        END
                    SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
                    END

                    /* Drop all tables */
                    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])
                    WHILE @name IS NOT NULL
                    BEGIN
                        SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
                        EXEC (@SQL)
                        PRINT 'Dropped Table: ' + @name
                    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
                    END";
        using (var connection = new SqlConnection(GetConnectionStringFromHibernateConfiguration("hibernate.cfg.xml")))
        using (var command = new SqlCommand(dropDatabaseObjects, connection))
        {
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
    }
当我们运行集成测试时,这些方法在基本testfixture方法中被调用,这样我们就知道我们正在以已知状态使用数据库


如果您希望将此作为构建脚本的一部分,请查看Tarantino项目,

不幸的是,我只能访问Visual Studio 2008专业版,而这似乎不适用于我的版本。我将此标记为答案,因为我基本上就是这样做的。我发现这篇博文也很方便:
private static void RecreateDatabase()
    {
        var directoryInfo = new DirectoryInfo(ConfigurationManager.AppSettings["dbScriptFolder"]);
        using (var connection = new SqlConnection(GetConnectionStringFromHibernateConfiguration("hibernate.cfg.xml")))
        {
            connection.Open();
            foreach (var fileInfo in directoryInfo.GetFiles())
            {
                if (fileInfo.Extension == ".sql")
                {
                    var script = ReadFromFile(fileInfo);
                    var server = new Server(new ServerConnection(connection));
                    server.ConnectionContext.ExecuteNonQuery(script);
                }
            }
            connection.Close();
        }
    }