【问题标题】:Why is my table creation failing when trying to recreate a deleted DynamoDB table?尝试重新创建已删除的 DynamoDB 表时,为什么我的表创建失败?
【发布时间】:2020-05-26 01:51:21
【问题描述】:

我在 DynamoDB 中有一个简单的表

名称:测试

主分区键:ID

我已经读过有效清空 DynamoDB 表的方法是删除该表,然后重新创建它。

所以,我写了这个:

public bool DeleteAllRecords()
{
    DeleteTableRequest deleteTableRequest = new DeleteTableRequest
    {
       TableName = "TEST"
    };

    TableDescription tableDescription = _dynamoDbClient.DeleteTable(deleteTableRequest).TableDescription;

    CreateTableRequest createTableRequest = new CreateTableRequest
    {
        TableName = tableDescription.TableName,
        AttributeDefinitions = tableDescription.AttributeDefinitions,
        KeySchema = tableDescription.KeySchema,
        ProvisionedThroughput = new ProvisionedThroughput
        {
           ReadCapacityUnits = tableDescription.ProvisionedThroughput.ReadCapacityUnits,
           WriteCapacityUnits = tableDescription.ProvisionedThroughput.WriteCapacityUnits
        }
    };

    CreateTableResponse response = _dynamoDbClient.CreateTable(createTableRequest);

    return true;
}

当我运行上面的代码时,我得到了这个异常。

检测到 2 个验证错误:“keySchema”处的值为 null 未能满足约束:成员不得为 null; 'attributeDefinitions' 处的值为 null 未能满足约束:成员不得为 null

tableDescription 中返回的 keySchema 和 attributeDefinitions 的值是空列表。 如果这些值不是从表格开始的,我在哪里/如何获得这些值;请记住,它们可能在某些时候具有值。

【问题讨论】:

    标签: c# amazon-dynamodb


    【解决方案1】:

    鉴于大多数 AWS 操作的异步性质,以下流程是正确的:

    DeleteTable 请求后,指定表处于 DELETING 状态,直到 DynamoDB 完成删除。如果表处于 ACTIVE 状态,您可以将其删除。如果表处于 CREATING 或 UPDATING 状态,则 DynamoDB 返回 ResourceInUseException。如果指定的表不存在,DynamoDB 将返回 ResourceNotFoundException。如果 table 已经处于 DELETING 状态,则不返回错误。

    在收到 CreateTable 请求后,DynamoDB 会立即返回一个 TableStatus 为 CREATING 的响应。创建表后,DynamoDB 将 TableStatus 设置为 ACTIVE。您只能对 ACTIVE 表执行读写操作。

    [...] 您可以使用 DescribeTable 操作检查表格状态。

    所有引用均来自这篇文章中包含的链接

    【讨论】:

      【解决方案2】:

      您需要先发送DescribeTable。这将返回您正在寻找的值。 DeleteTable 操作中的响应主要是为您提供 TableStatus 值。

      请记住,删除操作不是即时的,因此您需要在创建新表之前检查表的状态。如果表仍然是DELETING,您将无法创建新表。

      【讨论】:

      • 不应该检测到“仍在删除”或等到它“被删除”成为涵盖删除操作的正常锁定/事务的一部分吗?
      • 不确定您所说的“正常锁定/事务”是什么意思。我只知道在实际删除表之前调用DeleteTable 返回。
      • "我只知道在实际删除表之前调用 DeleteTable 返回。"那么这是一个非常不幸的设计决定和一个很好的建议。从普通 DML 语句中,我有点希望在尝试新操作之前正确完成先前的操作。并确保旧表至少不在数据库中的“表中”听起来应该是安全的。
      • DynamoDB 与“普通”数据库有很大不同,“表的表”等大多数概念并不真正适用于它。异步 API 调用在任务完成之前返回是“正常的”。
      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 2018-01-05
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多