【问题标题】:Truncate table failed with error "Could not drop constraint" in SSIS package in SQL Server 2016在 SQL Server 2016 的 SSIS 包中截断表失败并出现错误“无法删除约束”
【发布时间】:2021-10-28 21:51:04
【问题描述】:

SSIS 包运行良好,但今天突然开始出错。 不知道出了什么问题。

这是表结构

根据@Tyron78 的建议更改了脚本,但仍然出现错误

执行 SQL 任务] 错误:执行查询“截断表 AuditEventParameter IF OBJECT_ID('d..." 失败并出现以下错误:“无法截断表 'AuditEvent',因为它被 FOREIGN KEY 约束引用。”。可能的失败原因:查询有问题,“ResultSet”属性未设置正确,参数设置不正确,或连接未正确建立。

    Truncate table AuditEventParameter
    IF OBJECT_ID('dbo.FK_AuditEvent_AuditEventParameter', 'FK') IS NOT NULL
    ALTER TABLE [dbo].[AuditEventParameter] DROP CONSTRAINT FK_AuditEvent_AuditEventParameter
    Truncate table AuditEvent
    ALTER TABLE [dbo].[AuditEventParameter]  WITH NOCHECK ADD CONSTRAINT [FK_AuditEvent_AuditEventParameter] FOREIGN KEY([eventID])
    REFERENCES [dbo].[AuditEvent] ([eventID])

【问题讨论】:

  • 您下次运行它时是否正常工作?我猜有一个先前的问题,即没有重新创建约束,并且下次运行 SSIS 时。它找不到它来丢弃它。
  • @Nick.McDermaid,不。在那之后它失败了。我在这里有点迷路,为什么我突然开始出错。在此错误之前,SSIS 包运行顺利。当包接下来运行时,为什么没有重新创建它。你觉得脚本有什么错误吗。
  • 为什么下一次运行包时没有重新创建它 因为它可能设法在一次运行中重新创建了约束,所以下一次运行它可能会在没有错误的情况下删除它。

标签: sql-server ssis truncate


【解决方案1】:

在删除任何对象之前,我强烈建议先检查它是否存在。尝试以下方法而不是您的 drop:

IF OBJECT_ID('dbo.FK_AuditEvent_AuditEventParameter', 'FK') IS NOT NULL
  ALTER TABLE [dbo].[AuditEventParameter] DROP CONSTRAINT FK_AuditEvent_AuditEventParameter

正如之前的评论中所提到的,看起来您的包在删除之后和过去重新创建之前的某个地方崩溃了 - 所以包现在尝试删除不再存在的约束。

【讨论】:

  • 嗨@Tyron78,崩溃的可能性是什么?突然,为什么它崩溃了?你能告诉我完整的解决方案吗?谢谢
  • @RjLearn 我们不可能知道在你之前的执行过程中发生了什么崩溃!有很多可能性:Truncate table AuditEvent 期间的错误、一些服务器问题、已执行包的取消……任何事情都可能导致这种行为。因此,在尝试删除对象之前,您应该始终检查对象是否存在。对于“完整解决方案”,只需将代码中的 ALTER TABLE [dbo].[AuditEventParameter] DROP CONSTRAINT [FK_AuditEvent_AuditEventParameter] 替换为我发布的代码...
  • 如果IF OBJECT_ID('dbo.FK_AuditEvent_AuditEventParameter', 'FK') IS NOT NULL 为空,我的 SSIS 包仍然会失败。我说的对吗?
  • 不,它根本不会执行 DROP 语句并继续执行下一条语句
  • 谢谢@Tyron78。我将在查询中使用此If 语句清理表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多