【问题标题】:How to create a new SQL Server database from ASP.NET without using script如何在不使用脚本的情况下从 ASP.NET 创建新的 SQL Server 数据库
【发布时间】:2020-10-26 15:13:01
【问题描述】:

我们有一个生产数据库,我们经常对其结构进行更改。

为了从我们的 ASP.NET 应用程序创建一个新数据库,我们必须首先从一个当前数据库创建一个新脚本,然后从我们的 ASP.NET 项目运行它以创建一个新数据库。

由于此过程是手动的,因此在删除额外标签和添加其他参数时会发生错误,因此非常耗时且存在风险。

我想知道有没有其他方法可以让我们使用 ASP.NET 从现有数据库中克隆一个新数据库?

感谢任何建议。

【问题讨论】:

    标签: asp.net sql-server


    【解决方案1】:

    dotnet ef 没有 db clone 命令。

    您可以使用 SSMS 克隆/复制数据库,而不是创建脚本。然后在 asp.net 应用程序中更新连接字符串,测试和部署。 这是 MS SQL 服务器的文档。 https://docs.microsoft.com/en-us/sql/relational-databases/databases/use-the-copy-database-wizard?view=sql-server-ver15

    任何数据库都有复制/克隆功能。

    如果您首先使用 EF 代码,请检查现有数据库的 ef 迁移。 https://docs.microsoft.com/en-us/ef/ef6/modeling/code-first/migrations/existing-database

    如果您只需要使用应用程序复制数据库,您可以创建存储过程并从应用程序执行。这是详细信息。

    1. 使用动态 T-SQL 执行将源数据库备份到文件中
    2. 然后使用动态 T-SQL 再次使用 RESTORE DATABASE WITH MOVE OPTION 将备份恢复到新数据库

    该过程有6个参数(应提供所有参数):

    1. 源数据库名称
    2. 源数据库逻辑数据文件名
    3. 源数据库逻辑日志文件名
    4. 备份文件名和路径
    5. 目标数据库名称
    6. 数据库文件的目标数据库文件夹位置

    这里是T-SQL过程源代码:

    USE master;
    GO 
    CREATE PROCEDURE dbo.CloneDBUsingBackupRestore ( 
    @SourceDatabaseName VARCHAR(200) 
    ,@SourceDatafileLogicalName VARCHAR(200) 
    ,@SourceLogfileLogicalName VARCHAR(200) 
    ,@BackupFile VARCHAR(2000) 
    ,@TargetDatabaseName VARCHAR(200) 
    ,@TargetDatabaseFolder VARCHAR(2000) ) 
    AS 
    BEGIN 
    SET NOCOUNT ON
    DECLARE @tsql VARCHAR(2000) 
    DECLARE @TargetDataFile VARCHAR(2000) 
    DECLARE @TargetLogFile VARCHAR(2000) 
    SET @TargetDataFile = @TargetDatabaseFolder + @TargetDatabaseName + '.mdf'; 
    SET @TargetLogFile = @TargetDatabaseFolder + @TargetDatabaseName + '.ldf'; 
    -- Backup the Source Database
     IF @SourceDatabaseName IS NOT NULL 
    BEGIN 
      SET @tsql = CONCAT ( 'BACKUP DATABASE ' ,@SourceDatabaseName 
    ,' TO DISK = ' ,QUOTENAME(@BackupFile, '''') ) 
    PRINT 'Executing query : ' + @tsql; 
    EXEC (@tsql) 
    END
    
    -- Restore database from the Backup File into target Data File and target Log File 
    SET @tsql = CONCAT ( 'RESTORE DATABASE ' ,@TargetDatabaseName 
    ,' FROM DISK = ' 
    ,QUOTENAME(@BackupFile, '''') 
    ,' WITH MOVE ' 
    ,QUOTENAME(@SourceDatafileLogicalName, '''') ,
    ' TO ' ,QUOTENAME(@TargetDataFile, '''') ,' 
    , MOVE ' ,QUOTENAME(@SourceLogfileLogicalName, '''') 
    ,' TO ' ,QUOTENAME(@TargetLogFile, '''') ) 
    PRINT 'Executing query : ' + @tsql EXEC (@tsql) 
    SET NOCOUNT OFF 
    END GO
    

    使用 ASP.Net 代码调用。

    using (SqlConnection con = new SqlConnection(connString))
    {
       using (SqlCommand cmd = new SqlCommand("dbo.CloneDBUsingBackupRestore", con))
       {
           cmd.CommandType = CommandType.StoredProcedure;
           cmd.Parameters.Add("@SourceDatabaseName", SqlDbType.VarChar).Value 
              ="Northwind";
           cmd.Parameters.Add("@SourceDatafileLogicalName ", SqlDbType.VarChar).Value 
              ="Northwind_Log";
           cmd.Parameters.Add("@BackupFile", SqlDbType.VarChar).Value 
              ="C:\SQL\nw.bak";
           cmd.Parameters.Add("@TargetDatabaseName", SqlDbType.VarChar).Value 
              ="NorthwindClone";
           cmd.Parameters.Add("@TargetDatabaseFolder ", SqlDbType.VarChar).Value 
              ="C:\SQL";
          con.Open();
    
          cmd.ExecuteNonQuery();  
          con.Close();  
        }
    }
    

    【讨论】:

    • 非常感谢您的 cmets,很遗憾我们不能使用 SSMS,因为这必须在我们的应用程序中自动完成,而且我们还没有使用 EF。
    • 感谢您的宝贵时间和优惠:)
    猜你喜欢
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多