SQL Server 17,数据库迁移,用于在主键中设置标识的功能

时间:2017-06-21 17:26:25

标签: sql sql-server primary-key database-migration

我有两个双胞胎数据库,想要将一个数据库迁移到另一个数据库。为此,我希望有一个书面函数,以便可以通过utils函数设置主键。我已经在SQL Server中使用UI了,但这很麻烦,因为有很多表要重复这个过程。 Utils函数将在迁移表之前设置标识,然后在作业完成后将其删除。 例如:

insert into TABLE (colum_names) select column_names from TABLE

我想在设置和删除身份之前和之后自动执行此操作:no identity

identity set

我知道有很多方法可以重新创建表,但由于显而易见的原因(查询时间,服务器负载),我不想这样做:)

2 个答案:

答案 0 :(得分:1)

如果我没有误解,您正在使用外部实用程序来执行此迁移。在这种情况下,您可以在迁移步骤之前在命令中执行SET IDENTITY_INSERT [dbo].[YourTable] ON;语句。

例如,使用C#:

using(SqlConnection myConn= new SqlConnection(conn))
{
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "SET IDENTITY_INSERT [dbo].[YourTable] ON;";
    //Migration steps here...
    cmd.CommandText += "SET IDENTITY_INSERT [dbo].[YourTable] OFF;";
}

编辑:

以下实际上是不正确的!我忽略了IDENTITY_INSERT只能为每个SESSION设置一个SINGLE表。 See MS documentation

根据@benjamin moskovits的评论建议使用未记录的sp_msforeachtable,虽然这可以为数据库中的每个表设置IDENTITY_INSERT,但这种方法仍然是一个可能无意的大锤结果取决于您的迁移模式的具体情况。

exec sp_msforeachtable 'SET IDENTITY_INSERT ? ON;'

答案 1 :(得分:0)

如果您想对数据库中的每个表执行某些操作,可以使用“不支持的”#39;但是在几乎每个版本的SQL Server中都使用得非常广泛,sp_msforeachtable可以执行某些内容....

exec   sp_msforeachtable 'select count(*) ''?'' from ?'

将为您提供数据库中每个表的列表及其包含的行数。