SSIS 插入时出错 - 维度 table 中出现新主键时出错
SSIS Error on insertion - Error when new primary keys in Dimension table
我每个月都使用 SSIS 将一大堆大文件合并到一个 table 中,然后将记录插入到 SQL 服务器 table 中。我的事实 table 是当月发生的实际金融交易。它看起来像:
事实交易
'Acct Number' 'Product Number' 'Total Value'
000001 1A 1000
000002 1A 2000
000001 3B 3000
我想根据 table 中一些手动生成的信息来跟踪此信息,其中 'Acct Number' 是 Dim Table
中的主键
DimAcct
'Acct Number' 'Acct Name' 'Acct Type'
000001 Sales Revenue
000002 Returns Revenue (Contra)
我的流程是:
1)清除交易table
2)重新加载所有交易,包括任何新的或更正的
3) 通过连接等进行分析
当我在新的一个月去 运行 table 时,我在 SSIS 中收到以下错误:
"The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_GLTransaction_List_Master_DimAccount". The conflict occurred in
database "GLTransactions", table "dbo.DimAccount", column 'Acct_Number'.".
我猜这是因为在交易中创建并使用了新帐户,但我没有手动更新我的 Dim 文件,也没有收到有关它们的警告。每个月都会发生这种情况,因为当新的交易账户发现新的会计项目要在自己的账户中单独跟踪时,就会添加新的交易账户。我还手动更新 table 以添加少数帐户。有没有办法避免这种情况,或者更好的是,我应该怎么做 before/during SSIS 运行 处理这些新帐户并避免错误?
您提到您只是手动插入维度表,需要更改。
作为 SSIS 流程的第一步,您应该将所有新帐户作为 "New/Unknown" 插入帐户维度。
然后您将得到一份打印这些新帐户的报告,您将手动或以其他方式更新这些帐户以包含正确的数据。
您可以在以下位置阅读有关可能解决方案的更多信息:https://www.matillion.com/blog/late-arriving-dimension/
您收到的消息告诉您,在您尝试在事实 table 中加载的数据中,至少有一条记录引用了维度 [=23= 中不存在的记录].
你如何加载维度table?您是否仅在 运行 事实加载之前加载它?如果是这种情况,您应该考虑管理所谓的 "inferred dimension",这是您在加载事实 table 之前不知道的维度。这种情况也被称为"early arriving facts".
因此,您应该扫描您尝试加载的事实,查找不在您的维度 table 中的维度记录。然后,您将在维度 table 中插入此记录并将其标记为已推断。在此阶段,您将加载事实。
请注意,将这些记录标记为 "Inferred" 将使您能够在以后优化维度记录。
假设您将插入一个您只知道帐号(业务密钥)但不知道其他信息(例如帐户描述等)的推断帐户......您可以稍后更新这些信息。
请注意,在 SSIS SCD 组件中,您可以定义适当的推断维度管理。
希望这对您有所帮助。
我每个月都使用 SSIS 将一大堆大文件合并到一个 table 中,然后将记录插入到 SQL 服务器 table 中。我的事实 table 是当月发生的实际金融交易。它看起来像:
事实交易
'Acct Number' 'Product Number' 'Total Value'
000001 1A 1000
000002 1A 2000
000001 3B 3000
我想根据 table 中一些手动生成的信息来跟踪此信息,其中 'Acct Number' 是 Dim Table
中的主键DimAcct
'Acct Number' 'Acct Name' 'Acct Type'
000001 Sales Revenue
000002 Returns Revenue (Contra)
我的流程是: 1)清除交易table 2)重新加载所有交易,包括任何新的或更正的 3) 通过连接等进行分析
当我在新的一个月去 运行 table 时,我在 SSIS 中收到以下错误:
"The INSERT statement conflicted with the FOREIGN KEY constraint
"FK_GLTransaction_List_Master_DimAccount". The conflict occurred in
database "GLTransactions", table "dbo.DimAccount", column 'Acct_Number'.".
我猜这是因为在交易中创建并使用了新帐户,但我没有手动更新我的 Dim 文件,也没有收到有关它们的警告。每个月都会发生这种情况,因为当新的交易账户发现新的会计项目要在自己的账户中单独跟踪时,就会添加新的交易账户。我还手动更新 table 以添加少数帐户。有没有办法避免这种情况,或者更好的是,我应该怎么做 before/during SSIS 运行 处理这些新帐户并避免错误?
您提到您只是手动插入维度表,需要更改。
作为 SSIS 流程的第一步,您应该将所有新帐户作为 "New/Unknown" 插入帐户维度。
然后您将得到一份打印这些新帐户的报告,您将手动或以其他方式更新这些帐户以包含正确的数据。
您可以在以下位置阅读有关可能解决方案的更多信息:https://www.matillion.com/blog/late-arriving-dimension/
您收到的消息告诉您,在您尝试在事实 table 中加载的数据中,至少有一条记录引用了维度 [=23= 中不存在的记录]. 你如何加载维度table?您是否仅在 运行 事实加载之前加载它?如果是这种情况,您应该考虑管理所谓的 "inferred dimension",这是您在加载事实 table 之前不知道的维度。这种情况也被称为"early arriving facts".
因此,您应该扫描您尝试加载的事实,查找不在您的维度 table 中的维度记录。然后,您将在维度 table 中插入此记录并将其标记为已推断。在此阶段,您将加载事实。
请注意,将这些记录标记为 "Inferred" 将使您能够在以后优化维度记录。 假设您将插入一个您只知道帐号(业务密钥)但不知道其他信息(例如帐户描述等)的推断帐户......您可以稍后更新这些信息。
请注意,在 SSIS SCD 组件中,您可以定义适当的推断维度管理。
希望这对您有所帮助。