如何在不使用脚本的情况下从ASP.NET创建新的SQL Server数据库
我们有一个生产数据库,我们经常对其结构进行更改 为了从我们的ASP.NET应用程序创建一个新数据库,我们必须首先从当前数据库之一创建一个新脚本,然后从我们的ASP.NET项目运行它来创建一个新数据库 由于此过程是手动的,因此耗时且风险很大,因为在删除额外标记和添加其他参数时会发生错误 我想知道还有没有其他方法可以让我们使用ASP.NET从现有数据库克隆新数据库如何在不使用脚本的情况下从ASP.NET创建新的SQL Server数据库,asp.net,sql-server,Asp.net,Sql Server,我们有一个生产数据库,我们经常对其结构进行更改 为了从我们的ASP.NET应用程序创建一个新数据库,我们必须首先从当前数据库之一创建一个新脚本,然后从我们的ASP.NET项目运行它来创建一个新数据库 由于此过程是手动的,因此耗时且风险很大,因为在删除额外标记和添加其他参数时会发生错误 我想知道还有没有其他方法可以让我们使用ASP.NET从现有数据库克隆新数据库 非常感谢您的建议。dotnet ef没有db clone命令 您可以使用SSMS克隆/复制数据库,而不是创建脚本。然后在asp.net应
非常感谢您的建议。dotnet ef没有db clone命令 您可以使用SSMS克隆/复制数据库,而不是创建脚本。然后在asp.net应用程序中更新连接字符串,测试并删除。 以下是MS SQL server的文档。 任何数据库都具有复制/克隆功能 如果您首先使用EF代码,请检查现有数据库的EF迁移 若需要仅使用应用程序复制db,则可以创建存储过程并从应用程序执行。详情如下
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();
}
}
非常感谢您的评论,不幸的是,我们无法使用SSMS,因为这必须在我们的应用程序中自动完成,而且我们还没有使用EF。感谢您的时间和出色的报价:)