多维数据集、分区或维度对象上的错误配置属性确定服务器在处理过程中发生数据完整性错误时如何响应。 键列中的重复键、缺失键和 null 值通常触发此类错误,虽然导致错误的记录不会添加到数据库中,但可以设置确定下一步发生的情况的属性。 默认情况下,处理停止。 但是,在多维数据集开发期间,你可能希望在发生错误时继续处理,以便你能够使用导入的数据测试多维数据集行为,即使数据不完整也是如此。
本主题包含下列部分:
执行顺序
服务器始终在每个记录的ErrorConfiguration规则之前执行NullProcessing规则。 这一点很重要,因为当两个或多个错误记录在键列中具有零时,将 null 转换为零的 null 处理属性随后可能会引入重复的键错误。
默认行为
默认情况下,处理在第一个与键列有关的错误时停止。 此行为由错误限制控制,该限制将零指定为允许的错误数和停止处理指令,该指令指示服务器在达到错误限制时停止处理。
由空值、缺失或重复值触发错误的记录将转换为未知成员或被丢弃。 Analysis Services 不会导入违反数据完整性约束的数据。
由于
ConvertToUnknownKeyErrorAction的设置,默认情况下将转换为未知成员。 分配给未知成员的记录在数据库中被隔离,作为在处理完成后可能需要调查的问题的证据。未知成员从查询工作负荷中排除,但如果将某些客户端应用程序设置为“可见”,则这些成员将在一些客户端应用程序
UnknownMember中可见。如果要跟踪转换为未知成员的 null 数,可以修改
NullKeyConvertedToUnknown属性以将这些错误报告给日志或在“处理”窗口中。手动将
KeyErrorAction属性设置为DiscardRecord时,将发生放弃。
通过错误配置属性,可以确定服务器在发生错误时如何响应。 选项包括立即停止处理、继续处理但停止日志记录,或继续处理和记录错误。 默认值因错误的严重性而异。
错误计数器记录错误发生的次数。 设置上限时,当达到该限制时,服务器响应会更改。 默认情况下,服务器在达到限制后停止处理。 默认限制为 0,导致处理在计数的第一个错误时停止。
应快速解决影响较高的错误,例如键字段中缺少的键或 null 值。 默认情况下,这些错误遵循 ReportAndContinue 服务器行为,其中服务器捕获错误,将其添加到错误计数,然后继续处理(错误限制为零除外,因此处理会立即停止)。
生成其他错误,但默认情况下不会进行计数或记录(这是 IgnoreError 设置),因为错误不一定构成数据完整性问题。
错误计数受 null 处理设置的影响。 对于维度属性,null 处理选项确定在遇到 null 值时服务器如何响应。 默认情况下,数值列中的 null 值将转换为零,而字符串列中的 null 将作为空字符串进行处理。 可以重写NullProcessing属性,以便在其变成KeyNotFound或KeyDuplicate错误之前捕获 null 值。 有关维度中空键的详细信息,请参阅Null keys in a dimension。
错误记录在“进程”对话框中,但未保存。 可以指定密钥错误日志文件名称来收集文本文件中的错误。
错误配置属性
有九个错误配置属性。 5 用于确定发生特定错误时的服务器响应。 其他四个范围限定为错误配置工作负荷,例如允许的错误数、达到该限制时该怎么办、是否在日志文件中收集错误。
服务器响应特定错误
| 资产 | 违约 | 其他值 |
|---|---|---|
CalculationError初始化错误配置时发生。 |
IgnoreError 既不记录也不计算错误;只要错误计数低于最大限制,处理就继续。 |
ReportAndContinue 记录并计算错误。ReportAndStop 报告错误并立即停止处理,而不考虑错误限制。 |
KeyNotFound当事实表中的外键在相关维度表中没有匹配的主键时发生(例如,Sales 事实表中有一个产品 ID 的记录,而该 ID 不存在于产品维度表中)。 在分区处理或雪花模型维度的处理过程中,可能会出现此错误。 |
ReportAndContinue 记录并计算错误。 |
ReportAndStop 报告错误并立即停止处理,而不考虑错误限制。IgnoreError 既不记录也不计算错误;只要错误计数低于最大限制,处理就继续。 默认情况下,触发此错误的记录将转换为未知成员,但你可以更改 KeyErrorAction 属性以放弃它们。 |
KeyDuplicate在维度中找到重复的属性键时发生。 在大多数情况下,可以接受具有重复属性键,但此错误会通知你重复项,以便你可以检查维度中是否存在可能导致属性之间不一致关系的设计缺陷。 |
IgnoreError 既不记录也不计算错误;只要错误计数低于最大限制,处理就继续。 |
ReportAndContinue 记录并计算错误。ReportAndStop 报告错误并立即停止处理,而不考虑错误限制。 |
NullKeyNotAllowed当在维度属性上设置 NullProcessing = Error或在用于唯一标识成员的属性键列中存在空值时,会发生问题。 |
ReportAndContinue 记录并计算错误。 |
ReportAndStop 报告错误并立即停止处理,而不考虑错误限制。IgnoreError 既不记录也不计算错误;只要错误计数低于最大限制,处理就继续。 默认情况下,触发此错误的记录会被转换为未知成员,但您可以将KeyErrorAction 属性设置为放弃它们。 |
NullKeyConvertedToUnknown当 null 值随后被转换为未知成员对象时,该事件会发生。 NullProcessing
=
ConvertToUnknown设置维度属性将触发此错误。 |
IgnoreError 既不记录也不计算错误;只要错误计数低于最大限制,处理就继续。 |
如果认为此错误是信息性的,请保留默认值。 否则,你可以选择 ReportAndContinue 将错误报告到“处理”窗口,并将该错误计入错误限制。ReportAndStop 报告错误并立即停止处理,而不考虑错误限制。 |
常规属性
| 财产 | 价值观 |
|---|---|
KeyErrorAction |
这是服务器在KeyNotFound错误发生时采取的措施。 对此错误的有效响应包括 ConvertToUnknown 或 DiscardRecord。 |
KeyErrorLogFile |
这是一个用户定义的文件名,该文件名必须具有.log文件扩展名,位于服务帐户具有读写权限的文件夹中。 此日志文件将仅包含处理过程中生成的错误。 如果需要更详细的信息,请使用飞行记录器。 |
KeyErrorLimit |
这是服务器在处理失败之前允许的最大数据完整性错误数。 -1 值指示没有限制。 默认值为 0,这意味着在发生第一个错误后,处理将停止。 还可以将其设置为整数。 |
KeyErrorLimitAction |
这是当密钥错误数达到上限时服务器执行的作。 停止 处理后,处理将立即终止。 使用 “停止日志记录”时,处理会继续,但不再报告或计数错误。 |
在哪里设置错误配置属性
在部署数据库后或在 SQL Server Data Tools 中的模型项目中使用 SQL Server Management Studio 中的属性页。 这两个工具中都发现了相同的属性。 还可以在 msmdrsrv.ini 文件中设置错误配置属性,以更改错误配置的服务器默认值;如果处理作为脚本作运行,则还可以在 Batch 和 Process 命令中设置错误配置属性。
可以对可以单独处理的任何对象设置错误配置。
SQL Server Management Studio
在对象资源管理器中右键单击“属性”,选择以下对象之一:维度、多维数据集或分区。
在“属性”中,单击“ 错误配置”。
SQL Server 数据工具
在解决方案资源管理器中,双击一个维度或一个立方体。
ErrorConfiguration显示在下面的窗格中的属性中。或者,对于单个维度,请在解决方案资源管理器中右键单击维度,选择
Process,然后在“进程维度”对话框中选择 “更改设置 ”。 错误配置选项显示在“维度键错误”选项卡上。
缺少密钥 (KeyNotFound)
无法将缺少键值的记录添加到数据库中,即使忽略错误或错误限制不受限制也是如此。
当实际记录中的表包含外键值,但外键在相关维度表中没有相应的记录时,服务器在分区处理过程中会生成 KeyNotFound 错误。 处理相关维度表或雪花维度表时也会出现此错误,其中一个维度表中的记录指定了在相关维度中不存在的外键。
KeyNotFound发生错误时,冒犯记录将分配给未知成员。 此行为通过 关键操作 控制,设置为 ConvertToUnknown,以便可以查看分配的记录以供进一步调查。
事实表中的 Null 外键【KeyNotFound】
默认情况下,事实数据表外键列中的 null 值将转换为零。 假设零不是有效的外键值,则 KeyNotFound 错误将记录并计入默认为零的错误限制。
若要允许继续处理,可以在转换和检查错误之前处理空值。 为此,请将 NullProcessing 设置为 Error.
对度量值设置 NullProcessing 属性
在 SQL Server Data Tools 的“解决方案资源管理器”中,双击数据立方体以在立方体设计器中打开它。
右键单击“度量值”窗格中的度量值,然后选择 “属性”。
在“属性”中,展开 源以查看
NullProcessing属性。 默认情况下,它设置为 “自动” ,对于 OLAP 项,对于包含数值数据的字段,NULL 值将转换为零。将值更改为
Error排除任何具有 null 值的记录,从而避免 null 到数值(零)转换。 通过此修改,可以避免与键列中具有零的多个记录相关的重复键错误,并在零值外键在相关维度表中没有等效主键时避免KeyNotFound错误。
维度中的 Null 键
若要在雪化维度的外键中找到 null 值时继续处理,请首先通过在维度属性的KeyColumn 上设置NullProcessing 以处理这些 null 值。 在KeyNotFound错误发生之前,这会放弃或转换记录。
您有两个选项可用于处理维度属性中的空值:
设置为
NullProcessing=UnknownMember将具有 null 值的记录分配给未知成员。 这会生成NullKeyConvertedToUnknown错误,该错误默认会被忽略。设置为
NullProcessing=Error排除具有 null 值的记录。 这会生成NullKeyNotAllowed错误,这被记录并计入密钥错误限制。 可以在 不允许使用空键 上设置错误配置属性为IgnoreError,以允许继续处理。
对于非键字段,Null 可能是个问题,因为 MDX 查询返回不同的结果,具体取决于 null 是解释为零还是空。 因此,Analysis Services 提供了 null 处理选项,可用于预定义所需的转换行为。 有关详细信息,请参阅 定义未知成员和 Null 处理属性 和 NullProcessing。
在维度属性上设置 NullProcessing 属性
在 SQL Server Data Tools 的解决方案资源管理器中,双击维度以在维度设计器中打开它。
右键单击“属性”窗格中的属性,然后选择 “属性”。
在“属性”中,展开 KeyColumns 以查看
NullProcessing属性。 默认情况下,它设置为 自动,会将包含数值数据的字段中的空值转换为零。 将值更改为任一Error值或UnknownMember。此修改会删除在检查记录是否存在错误之前放弃或转换记录所触发
KeyNotFound的基础条件。根据错误配置,这些操作中的任何一个都可能导致报告并计数的错误。 可能需要调整其他属性,例如将
KeyNotFound设置为ReportAndContinue或将KeyErrorLimit设置为非零值,以便在报告和统计这些错误时继续处理。
由于键重复引起的不一致关系(KeyDuplicate)
默认情况下,存在重复键不会停止处理,但将忽略错误,并且将从数据库中排除重复记录。
若要更改此行为,请将KeyDuplicate设置为ReportAndContinue或者将ReportAndStop设置为报告错误。 然后,可以检查错误以确定维度设计中的潜在缺陷。
更改错误限制或错误控制措施
可以提高错误限制,以便在处理过程中容许更多错误。 没有关于提高错误限制的指导;相应的值将因方案而异。 错误限制在 SQL Server Data Tools 的属性中ErrorConfiguration指定为KeyErrorLimit“错误配置”选项卡中的“错误数”,用于 SQL Server Management Studio 中维度、多维数据集或度量值组的属性。
达到错误限制后,可以指定处理停止或日志记录停止。 例如,假设您将操作设置为 StopLogging,错误限制为 100。 在 101 错误中,处理会继续,但不再记录或计数错误。 错误限制操作在 SQL Server Data Tools 中的ErrorConfiguration属性KeyErrorLimitAction中被指定,或者在 SQL Server Management Studio 中维度、多维数据集或度量值组的属性的“错误配置”选项卡中指定为“错误操作”。
设置错误日志路径
可以指定一个文件来存储处理过程中报告的与密钥相关的错误消息。 默认情况下,错误在“进程”窗口中进行交互式处理期间可见,然后在关闭窗口或会话时被丢弃。 日志将仅包含与密钥相关的错误信息,与在处理对话框中报告的错误相同。
错误将记录到文本文件中,并且必须具有.log文件扩展名。 除非发生错误,否则文件将为空。 默认情况下,将在 DATA 文件夹中创建一个文件。 只要 Analysis Services 服务帐户可以写入该位置,就可以指定另一个文件夹。
后续步骤
确定错误是停止处理还是被忽略。 记住,只有错误会被忽略。 导致错误的记录不会被忽略,而是被丢弃或转换为未知成员。 违反数据完整性规则的记录永远不会添加到数据库中。 默认情况下,处理在发生第一个错误时停止,但可以通过提高错误限制来更改此错误。 在多维数据集开发中,放宽错误配置规则很有用,允许继续处理,以便有数据需要测试。
确定是否更改默认的 null 处理行为。 默认情况下,字符串列中的 null 值作为空值进行处理,而数值列中的 null 值则作为零进行处理。 有关在属性上设置 null 处理的说明,请参阅 “定义未知成员”和“Null 处理属性 ”。