SQL Server 截断表 - 删除并重新创建 FK 约束脚本

jwa*_*zko 2 c# sql-server ado.net

我正在编写小型应用程序(在 c# 中),它帮助我截断 SQL Server 2005/08 中的表。为了截断表,我想我需要这样做:

  • 从表中删除所有 FK 约束,
  • 截断表格,
  • 重新创建所有以前删除的约束。

有人可以帮助我创建这样的脚本,或者指出我可以在哪里找到一些线索?

问候

mar*_*c_s 5

好吧,你可以从你的应用程序中做到这一点:

  • 在现有数据库上运行 SQL 命令以查找所有外键约束
  • 从该外键约束列表中,创建两个脚本
    • 一个删除所有现有的外键约束(在截断表之前)
    • 在截断表后重新创建外键约束的第二个

您可以通过检查系统目录视图来完成此操作。

此处的查询将为您提供所有外键约束的列表:

select
    fk.name,
    object_name(fk.parent_object_id) 'Parent table',
    c1.name 'Parent column',
    object_name(fk.referenced_object_id) 'Referenced table',
    c2.name 'Referenced column'
from 
    sys.foreign_keys fk
inner join
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
inner join
    sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id
inner join
    sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
Run Code Online (Sandbox Code Playgroud)

通过组合这些元素,您可以创建DROP CONSTRAINT要在表截断之前运行的命令列表:

select
    'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + 
    ' DROP CONSTRAINT ' + fk.name
from 
    sys.foreign_keys fk
Run Code Online (Sandbox Code Playgroud)

并且您还可以创建ALTER TABLE要在截断后运行的脚本以恢复外键关系。

select
    'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + 
    ' ADD CONSTRAINT ' + fk.name +
    ' FOREIGN KEY(' + c1.name + ') REFERENCES dbo.' + 
    object_name(fk.referenced_object_id) + '(' + c2.name + ')'
from 
    sys.foreign_keys fk
inner join
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
inner join
    sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id
inner join
    sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
Run Code Online (Sandbox Code Playgroud)

对于这两个查询,这是一个两步过程:

  • 首先对您的数据库执行我使用 C# 和 ADO.NET 显示的查询
  • 这将产生一个输出,它是一个 T-SQL 命令列表(删除或重新创建 FK 关系)
  • 获取输出,然后在第二步中,从 C#/ADO.NET 应用程序中将该输出作为 T-SQL 命令批处理执行。

限制:现在,该脚本仅在您有单列外键时才假设和工作;如果你没有那个,你可能需要稍微调整一下脚本。