Sql 如何备份和还原表
在测试期间,我希望在运行测试之前在同一数据库中复制几个表。测试完成后,我想用副本恢复原始表 最好的方法是什么?Sql 如何备份和还原表,sql,sql-server,tsql,backup,Sql,Sql Server,Tsql,Backup,在测试期间,我希望在运行测试之前在同一数据库中复制几个表。测试完成后,我想用副本恢复原始表 最好的方法是什么? 我还想确保恢复所有索引和约束 DECLARE @Tablename NVARCHAR(500) DECLARE @BuildStr NVARCHAR(500) DECLARE @SQL NVARCHAR(500) SELECT @Tablename = 'my_Users' SELECT @BuildStr = CONVERT(NVARCHAR(16),GETDATE(),120) S
我还想确保恢复所有索引和约束
DECLARE @Tablename NVARCHAR(500)
DECLARE @BuildStr NVARCHAR(500)
DECLARE @SQL NVARCHAR(500)
SELECT @Tablename = 'my_Users'
SELECT @BuildStr = CONVERT(NVARCHAR(16),GETDATE(),120)
SELECT @BuildStr = REPLACE(REPLACE(REPLACE(REPLACE(@BuildStr,'
',''),':',''),'-',''),' ','')
SET @SQL = 'select * into '+@Tablename+'_'+@BuildStr+' from '+@Tablename
SELECT @SQL
EXEC (@SQL) -- Execute SQl statement
如果我使用上述方法制作副本,我如何恢复
SQL2005类似于:
truncate table OriginalTable
insert into OriginalTable select * from CopiedTable
根据您使用的数据库,有更快的替代方案。类似于:
truncate table OriginalTable
insert into OriginalTable select * from CopiedTable
根据您使用的数据库的不同,有更快的替代方法。有很多方法可以做到这一点,但到目前为止,最简单的方法是简单地备份数据库,使用它,然后在备份完成后从备份中恢复。() 备份表当然是可行的,但这不是最简单的方法,而且一旦开始使用多个表,它就会变得更加困难。因此,我提供了关于更好地管理测试数据的一般性建议,而不是讨论恢复单个表的具体示例
最安全的方法是不要还原原稿,而是不要触摸原稿。对其进行备份,然后将其恢复到新的测试服务器。()最佳实践表明,无论如何,您都不应该在实时数据库上进行测试或开发工作。这也很简单,也很安全。有很多方法可以做到这一点,但到目前为止,最简单的方法是对数据库进行备份,使用它,然后在备份完成后进行恢复。() 备份表当然是可行的,但这不是最简单的方法,而且一旦开始使用多个表,它就会变得更加困难。因此,我提供了关于更好地管理测试数据的一般性建议,而不是讨论恢复单个表的具体示例
最安全的方法是不要还原原稿,而是不要触摸原稿。对其进行备份,然后将其恢复到新的测试服务器。()最佳实践表明,无论如何,您都不应该在实时数据库上进行测试或开发工作。这也很简单,也很安全。您是否使用过SQL Server单元测试框架,如开源tSQLt框架 看 tSQLt测试在事务中运行,因此您在测试中执行的任何操作都将回滚
它有一个“faketable”的概念,即原始表的副本减去约束(如果这些约束妨碍了您的测试设置)。您是否使用过SQL Server单元测试框架,如开源tSQLt框架 看 tSQLt测试在事务中运行,因此您在测试中执行的任何操作都将回滚
它有一个“faketable”的概念,即原始表的副本减去约束(如果这些约束妨碍了您的测试设置)。我认为我最近使用的脚本可能对某些人有用 要备份表,可以使用下一个查询:
DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';
-- Backup
DECLARE @insertCommand nvarchar(max)
--SELECT INTO SomeTable_bck FROM SomeTable
SET @insertCommand = 'SELECT * INTO ' + @tableName_bck + ' FROM ' + @tableName
PRINT @insertCommand
EXEC sp_executesql @insertCommand
对于还原,因为表通常可以有标识字段,所以需要设置IDENTITY_INSERT ON,并且在插入记录时还需要提供列列表。这就是脚本更复杂的原因:
DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';
-- Restore
DECLARE @columnList nvarchar(max)
DECLARE @insertCommand nvarchar(max)
SELECT
@columnList = SUBSTRING(
(
SELECT ', ' + column_name AS [text()]
From INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @tableName
ORDER BY table_name
For XML PATH ('')
), 2, 1000);
--INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
SELECT @insertCommand = 'INSERT INTO ' + @tableName + '(' + @columnList + ') SELECT ' + @columnList + ' FROM ' + @tableName_bck
IF EXISTS (
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'dbo' AND table_name = @tableName
AND COLUMNPROPERTY(object_id(table_name), column_name, 'IsIdentity') = 1
)
BEGIN
SET @insertCommand =
'SET IDENTITY_INSERT ' + @tableName + ' ON;'
+ 'TRUNCATE TABLE ' + @tableName + ';'
+ @insertCommand + ';'
+ 'SET IDENTITY_INSERT ' + @tableName + ' OFF;'
/*
SET IDENTITY_INSERT SomeTable ON
TRUNCATE TABLE SomeTable
INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
SET IDENTITY_INSERT SomeTable OFF
*/
END
ELSE
BEGIN
SET @insertCommand =
'TRUNCATE TABLE ' + @tableName + ';'
+ @insertCommand
/*
TRUNCATE TABLE SomeTable
INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
*/
END
PRINT @insertCommand
EXEC sp_executesql @insertCommand
很容易看出,您可以随意指定@tableName和@tableName\u bck。例如,它可以位于存储过程中,因此脚本是可重用的 我认为我最近使用的脚本可能对某些人有用 要备份表,可以使用下一个查询:
DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';
-- Backup
DECLARE @insertCommand nvarchar(max)
--SELECT INTO SomeTable_bck FROM SomeTable
SET @insertCommand = 'SELECT * INTO ' + @tableName_bck + ' FROM ' + @tableName
PRINT @insertCommand
EXEC sp_executesql @insertCommand
对于还原,因为表通常可以有标识字段,所以需要设置IDENTITY_INSERT ON,并且在插入记录时还需要提供列列表。这就是脚本更复杂的原因:
DECLARE @tableName nvarchar(max), @tableName_bck nvarchar(max)
SET @tableName = 'SomeTable';
SET @tableName_bck = 'SomeTable_bck';
-- Restore
DECLARE @columnList nvarchar(max)
DECLARE @insertCommand nvarchar(max)
SELECT
@columnList = SUBSTRING(
(
SELECT ', ' + column_name AS [text()]
From INFORMATION_SCHEMA.COLUMNS
WHERE table_name = @tableName
ORDER BY table_name
For XML PATH ('')
), 2, 1000);
--INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
SELECT @insertCommand = 'INSERT INTO ' + @tableName + '(' + @columnList + ') SELECT ' + @columnList + ' FROM ' + @tableName_bck
IF EXISTS (
SELECT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'dbo' AND table_name = @tableName
AND COLUMNPROPERTY(object_id(table_name), column_name, 'IsIdentity') = 1
)
BEGIN
SET @insertCommand =
'SET IDENTITY_INSERT ' + @tableName + ' ON;'
+ 'TRUNCATE TABLE ' + @tableName + ';'
+ @insertCommand + ';'
+ 'SET IDENTITY_INSERT ' + @tableName + ' OFF;'
/*
SET IDENTITY_INSERT SomeTable ON
TRUNCATE TABLE SomeTable
INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
SET IDENTITY_INSERT SomeTable OFF
*/
END
ELSE
BEGIN
SET @insertCommand =
'TRUNCATE TABLE ' + @tableName + ';'
+ @insertCommand
/*
TRUNCATE TABLE SomeTable
INSERT INTO SomeTable(Column1, Column2) SELECT Column1, Column2 FROM SomeTable_bck
*/
END
PRINT @insertCommand
EXEC sp_executesql @insertCommand
很容易看出,您可以随意指定@tableName和@tableName\u bck。例如,它可以位于存储过程中,因此脚本是可重用的 备份无法还原单个表。版本控制存储表的定义,而不是其内容-1@Andomar当然,你是对的。我删除了版本控制部分,并进行了编辑以使我的意思更清楚。我同意你的-1,因为我没有回答他具体的问题,但我把它留在这里,因为我认为这仍然比具体回答他的例子更好。谢谢你的反馈!备份无法还原单个表。版本控制存储表的定义,而不是其内容-1@Andomar当然,你是对的。我删除了版本控制部分,并进行了编辑以使我的意思更清楚。我同意你的-1,因为我没有回答他具体的问题,但我把它留在这里,因为我认为这仍然比具体回答他的例子更好。谢谢你的反馈!