【问题标题】:How to script primary key constraints from existing database如何从现有数据库编写主键约束脚本
【发布时间】:2012-03-05 20:13:09
【问题描述】:

我有一个包含 300 个表的数据库。我需要清理表,所以我编写了一个脚本来删除所有约束、触发器、主键和外键。

我已经设法使用 生成脚本 功能创建脚本,但它们只包含 CREATE 语句中的主键。

我需要将它们作为 ALTER TABLE 语句获取,以便我可以删除键、清除数据库、插入新数据以及恢复所有键、约束等。

【问题讨论】:

  • 为什么要删除约束清表和插入数据?
  • 正如@jle-s 评论所暗示的那样——PK 约束不是删除的障碍——所以也许不要在第一种情况下删除它们? (同样,任何唯一约束)

标签: sql sql-server database-administration


【解决方案1】:

Powershell 和 SMO 将在这里成为您的朋友:

$option_drop = new-object Microsoft.SqlServer.Management.Smo.ScriptingOptions;
$option_drop.ScriptDrops = $true;

"" > drop_primary_keys.sql
"" > create_primary_keys.sql

$server = new-object Microsoft.SqlServer.Management.Smo.Server ".";
$db = $server.Databases['AdventureWorks'];
foreach ($table in $db.Tables) {
    foreach ($index in $table.Indexes) {
        if ($index.IndexKeyType -eq "DriPrimaryKey") {
            $index.Script( $option_drop ) >> drop_primary_keys.sql
            $index.Script() >> create_primary_keys.sql
        }
    }
}

这里有几点说明:

  • 运行此脚本将删除任何名为“drop_primary_keys.sql”和“create_primary_keys.sql”的现有文件,因此请谨慎操作
  • 脚本没有考虑任何外键,因为您说您已经有办法做到这一点。
  • 您可能需要调整 ScriptingOptions 对象以满足您的需要。具体来说,我在创建时使用默认值,因此您可能需要创建另一个 ScriptingOptions 对象并设置您认为合适的选项。

除此之外,打猎很好。

【讨论】:

  • 另一件要考虑的事情:如果你的主键也是你的聚集索引,如果你禁用或删除表上的任何非聚集索引,它会加快速度,因为删除聚集索引会强制重建所有非聚集索引,将聚集索引添加到堆中。
  • 谢谢。我得到一个错误:在这个对象上找不到属性'IndexKeyType';确保它存在并且是可设置的。很奇怪,因为 Microsoft.SqlServer.Management.Smo.Index 的文档清楚地说应该有这样一个属性
  • 哦,我明白了…… = 应该是 -eq。否则,到目前为止,输出看起来不错。当我有时间测试它时会回复。谢谢本
  • 啊废话...你是对的。我以为我会从我复制/粘贴它的地方运行它,但显然不是。很抱歉给您添麻烦。
  • 这并不麻烦。这样我就花了一些时间来理解脚本,而不是仅仅运行它:)。一切都很完美。回答接受。出于好奇,你知道这个 API 是否有某种方式来处理 UNIQUE 键吗?我是手工完成的,因为只有少数,但我在这些课程中找不到任何可以让我自动完成的东西。
【解决方案2】:

Msdn 有一篇关于禁用/启用触发器和外键的文章:

http://msdn.microsoft.com/en-us/magazine/cc163442.aspx

【讨论】:

  • 这根本不是我想要的。我已经有几种禁用触发器等的方法。它们都不是特别好,因为即使禁用外键也无法截断 - 你必须删除,这需要 300 个巨大的表。我在问如何将所有 PRIMARY 键编写为 ALTER 语句,以便在完成我需要的操作后将它们添加回来。\
  • 你只需要修改上面的代码使用KEY_COLUMN_USAGE和REFERENTIAL_CONSTRAINTS并修改ALTER语句。触发器的代码应该是有效的。您应该在删除密钥之前生成 ALTER 语句来创建密钥。
  • 如何生成主键 ALTER 语句是我的问题。如果我知道该怎么做,我就不会问了。我已经知道如何删除约束和主键了。
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-16
  • 1970-01-01
相关资源
最近更新 更多