---
title: 数据库映射与数据库异常处理
date: 2019-06-05
categories:
  - data-integration
  - database
  - database-mapping
tags:
  - data-mapping
  - database-exception-handling
  - database-mapping
  - mapforce
description: Altova MapForce 包含数据库异常处理功能，可以在出现异常时回滚受影响的数据，并可以选择继续执行数据库映射的其余部分。
---
Status: #blog

Tags:  #data-mapping #database-exception-handling #database-mapping #mapforce

Categories: [data-integration](/blog/zh/category/data-integration.md) | [database + sql](/blog/zh/category/database-sql.md) | [data-integration](/blog/zh/category/data-integration.md)
# 数据库映射与数据库异常处理

关键业务流程依赖于可靠的数据，而数据库管理员和其他数据分析师希望能够确信存储在数据库表中的信息的完整性。在自动化 ETL（提取、转换、加载）操作或其他数据库导入任务期间，可能会遇到无效数据，这可能会危及流程的成功。Altova MapForce 包含数据库异常处理功能，当发生错误时，它可以回滚受影响的数据，并且可以选择继续执行数据库映射的其余部分。

例如，即使单个记录出现错误，也不一定需要停止映射过程的继续。例如，当某些数据库约束阻止映射过程插入或更新无效数据时，映射过程仍然可以继续。

![](/blog/images/container_ship5.jpg)

<!--more-->

启用数据库异常处理功能，会将对数据库组件的所有更改都包含在事务中，以便在出现错误时能够回滚。用户可以选择继续执行后续操作，也可以选择停止进一步执行。可以对数据库组件、表或存储过程分别启用事务。

异常处理甚至可以与数据库输出日志（追踪）相结合，从而记录自动化处理过程中发生的错误。

我们来看看它是如何运作的。

MapForce 示例文件夹包含一个数据库映射和 SQLite 数据库，它们展示了事务处理和回滚功能。当然，这些功能也适用于 [所有流行的关系型数据库](https://www.altova.com/zh/mapforce#db_mapping), 用于执行常见任务，例如： [将 PostgreSQL 数据库转换为 SQLite 数据库](https://www.altova.com/zh/mapforce/convert-mysql) 数据转换，例如将XML数据映射到SQL Server，将JSON数据转换为Access格式，等等。

[![数据映射示例，用于说明数据库异常处理](/blog/images/database-mapping-1.png)](database-mapping-1.png)

这个映射会将数据从两个数据库表复制到新的表中，这些新表具有相似的结构，但存在一个重要的区别。在目标数据库的“new_addresses”表中，"is_shipping"和"is_billing"字段不允许包含空值，而在源数据库的“addresses”表中，这两个字段允许包含空值。这意味着，如果在映射执行过程中遇到缺失值，将会发生错误。

我们将探讨三种情况，利用数据库异常处理选项，以不同的方式来管理错误

- 在第一次出现错误时，撤销所有更改，并停止映射执行

- 仅回滚出现错误的事务，然后继续执行

- 撤销最近一次交易，并继续

### 撤销所有更改

在第一种情况下，我们希望应用数据库异常处理机制，以确保在映射执行过程中出现任何错误时，目标数据库完全保持不变。为了实现此功能，我们可以打开目标数据库组件的“属性”对话框，并启用事务处理：

[![数据库异常处理的事务设置示例](/blog/images/transaction-setting-1.png)](transaction-setting-1.png)

现在，我们可以通过点击映射窗口底部的“输出”按钮来生成SQL执行脚本。然后，在脚本窗口上方的“输出”菜单中选择“运行SQL脚本”选项，即可执行该脚本

[![以下是一个运行 SQL 脚本的示例，用于数据库异常处理](/blog/images/run-SQL-script-1.png)](run-SQL-script-1.png)

当执行过程中出现第一个错误时，会弹出一个对话框，允许我们确认或修改之前选择的交易设置

[![确认数据库异常处理的事务设置](/blog/images/error-message-1.png)](error-message-1.png)

我们只需点击“确定”按钮来确认之前的设置。映射执行会停止，并且“消息”窗口会显示错误信息：

[![消息窗口会显示数据库异常处理过程中出现的第一个错误](/blog/images/Messages-1.png)](Messages-1.png)

我们可以使用MapForce内置的“数据库查询”窗口来选择并查看名为“new_users”和“new_addresses”的表。我们预期这两个表都应该是空的

[![数据库查询用于验证事务回滚操作](/blog/images/db-query-1.png)](db-query-1.png)

这验证了在出现错误之前插入的所有数据都已被回滚，换句话说，这些数据已经被从数据库中移除。

在 MapForce Server 的控制下，自动化执行过程中，组件的事务设置将始终生效，不会出现任何中断。

### 回滚一个交易，并继续

设想一种情况，需要将一个大型外部数据文件导入到数据库中，例如包含一万条或更多记录。我们期望外部文件是有效的，但如果其中有少量记录包含错误数据，我们希望导入所有有效的数据，并记录下错误。这对应于上述列表中的数据库异常处理情况2，同时结合了[数据库追踪，如前文所述](https://www.altova.com/blog/database-tracing/)

为了在新地址表（new_addresses table）中实现此数据库异常处理选项，我们点击表格操作按钮，并选择以下属性：

[![数据库异常处理的事务设置示例](/blog/images/table-actions-2.png)](table-actions-2.png)

现在，我们可以生成一个新的SQL脚本，并使用与前面所示的“运行SQL脚本”命令相同的方式来执行它。消息窗口会记录一些错误。我们可以重新在“数据库查询”窗口中运行SQL查询，以查看成功映射的数据：

[![SQL 查询语句和结果示例，用于回滚和继续数据库异常处理](/blog/images/db-query-2.png)](db-query-2.png)

此外，我们还生成了一个 XML 跟踪文件。下图显示了 XMLSpy [XML 编辑器](https://www.altova.com/zh/xmlspy-xml-editor) 窗口中关于一个错误的局部视图，该错误位于第 54 行，已用高亮显示：

[![在数据库异常处理过程中，记录跟踪文件的错误信息](/blog/images/trace-file.png)](trace-file.png)

这种日志文件可以帮助我们轻松地找到并修复一万条记录中可能存在的少量错误数据！

### 撤销最近的交易，并继续

数据库异常处理情况3满足以下业务需求：如果地址信息未能成功插入，则应避免插入其对应的父级用户记录，但其他关联数据的映射过程应继续进行。

这个例子在 MapForce 软件中自动安装的在线帮助文档中有详细描述，并且所有在这里展示的演示文件也与此相关。您可以 [下载免费试用版](https://www.altova.com/zh/download)，并按照该示例进行操作，或者直接开始在您自己的数据库映射中实现数据库异常处理！
