在立方體、分割或維度物件上的錯誤設定屬性決定伺服器在處理過程中發生數據完整性錯誤時的回應方式。 索引鍵數據行中的重複索引鍵、遺漏索引鍵和 Null 值通常會觸發這類錯誤,而造成錯誤的記錄不會新增至資料庫,您可以設定屬性來決定接下來會發生什麼事。 根據預設,處理會停止。 不過,在cube開發期間,您可能會希望在發生錯誤時仍繼續處理,以便透過匯入的數據測試cube的行為,即使數據不完整。
本主題包含下列各節:
執行順序
伺服器一律會在 NullProcessing 每個記錄的規則之前 ErrorConfiguration 執行規則。 請務必瞭解,因為將 Null 轉換成零的 Null 處理屬性,在索引鍵數據行中有兩個以上的錯誤記錄時,後續可能會引發重複的索引鍵錯誤。
預設行為
根據預設,處理會在涉及索引鍵數據行的第一個錯誤時停止。 此行為是由錯誤限制所控制,將零指定為允許的錯誤數目,以及「停止處理」指示詞,指示伺服器在達到錯誤限制時停止處理。
由於空值或遺漏或重複的數值觸發錯誤的記錄,會被捨棄或轉換為未知成員。 Analysis Services 不會匯入違反數據完整性條件約束的數據。
由於
ConvertToUnknown的設定,KeyErrorAction會預設轉換成未知成員。 配置給未知成員的記錄會隔離在資料庫中,作為您在處理完畢後可能想要調查的問題證據。未知的成員會從查詢工作負載中排除,但如果 設定為 Visible,則某些用戶端應用程式
UnknownMember中會顯示這些成員。如果您要追蹤已轉換成未知成員的 Null 數目,您可以修改
NullKeyConvertedToUnknown屬性,將這些錯誤報告至記錄檔或在 [處理] 視窗中。當您手動將
KeyErrorAction屬性設定為DiscardRecord時,就會捨棄。
透過錯誤組態屬性,您可以判斷伺服器在發生錯誤時如何回應。 選項包括立即停止處理、繼續處理但停止記錄,或繼續處理和記錄錯誤。 預設值會根據錯誤的嚴重性而有所不同。
錯誤計數會追蹤發生多少錯誤。 當您設定上限時,當達到該限制時,伺服器回應就會變更。 根據預設,伺服器會在達到限制之後停止處理。 默認限制為 0,導致處理在第一個計算錯誤時停止。
應該迅速解決高影響錯誤,例如在關鍵字段中遺漏的關鍵或 Null 值。 根據預設,這些錯誤會遵守 ReportAndContinue 伺服器行為,其中伺服器攔截錯誤、將其新增至錯誤計數,然後繼續處理(錯誤限制除外為零,因此處理會立即停止)。
其他錯誤是產生,但預設不會計算或記錄(這是 IgnoreError 設定),因為錯誤不一定會造成數據完整性問題。
錯誤計數會受到空值處理設定的影響。 對於維度屬性,Null 處理選項會決定伺服器在遇到 Null 值時回應的方式。 根據預設,數值數據行中的 Null 會轉換成零,而字串數據行中的 Null 會當做空白字串處理。 您可以覆寫NullProcessing屬性,來攔截在變成KeyNotFound或KeyDuplicate錯誤之前的 Null 值。 請參閱維度中的 Null 鍵以獲得詳細資訊。
錯誤會記錄在 [處理] 對話框中,但不儲存。 您可以指定索引鍵錯誤記錄檔名稱,以收集文字檔中的錯誤。
錯誤組態屬性
有九個錯誤組態屬性。 當發生特定錯誤時,會使用五個來判斷伺服器回應。 其他四個範圍是錯誤組態工作負載,例如允許的錯誤數目、達到該限制時該怎麼做、是否要在記錄檔中收集錯誤。
伺服器回應特定錯誤
| 房產 | 預設 | 其他值 |
|---|---|---|
CalculationError初始化錯誤組態時發生。 |
IgnoreError 不會記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 |
ReportAndContinue 會記錄並計算錯誤。ReportAndStop 會報告錯誤並立即停止處理,而不論錯誤限制為何。 |
KeyNotFound當事實表中的外鍵在相關維度表中沒有對應的主鍵時,就會發生這種情況(例如,銷售事實表中有一個記錄,其中的產品識別碼在產品維度表中不存在)。 這個錯誤可能發生在分割區處理或雪花維度的處理過程中。 |
ReportAndContinue 會記錄並計算錯誤。 |
ReportAndStop 會報告錯誤並立即停止處理,而不論錯誤限制為何。IgnoreError 不會記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 觸發此錯誤的記錄預設會轉換成未知的成員,但您可以變更 KeyErrorAction 屬性以改為捨棄它們。 |
KeyDuplicate在維度中找到重複的屬性索引鍵時發生。 在大多數情況下,可以接受重複的屬性鍵,但此錯誤會通知您重複的鍵,便於檢查維度是否存在可能導致屬性間不一致關聯性的設計缺陷。 |
IgnoreError 不會記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 |
ReportAndContinue 會記錄並計算錯誤。ReportAndStop 會報告錯誤並立即停止處理,而不論錯誤限制為何。 |
NullKeyNotAllowed發生於 NullProcessing = Error 在維度屬性上設定時,或當 Null 值存在於用來唯一識別成員的屬性索引鍵數據行時。 |
ReportAndContinue 會記錄並計算錯誤。 |
ReportAndStop 會報告錯誤並立即停止處理,而不論錯誤限制為何。IgnoreError 不會記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 觸發此錯誤的記錄預設會轉換成未知的成員,但您可以設定 KeyErrorAction 屬性來改為捨棄它們。 |
NullKeyConvertedToUnknown當 Null 值後續轉換成未知成員時發生。 在維度屬性上設定 NullProcessing = ConvertToUnknown 會觸發此錯誤。 |
IgnoreError 不會記錄或計算錯誤;只要錯誤計數低於上限,處理就會繼續。 |
如果您將此錯誤視為參考,請保留預設值。 否則,您可以選擇 ReportAndContinue 將錯誤報告至 [處理] 視窗,並將錯誤計入錯誤限制。ReportAndStop 會報告錯誤並立即停止處理,而不論錯誤限制為何。 |
一般屬性
| 財產 | 價值 |
|---|---|
KeyErrorAction |
當伺服器發生 KeyNotFound 錯誤時,這是所採取的動作。 此錯誤的有效回應包括 ConvertToUnknown 或 DiscardRecord。 |
KeyErrorLogFile |
這是使用者定義的檔名,一定要有.log 的副檔名,位於服務帳戶具有讀寫許可權的資料夾中。 此記錄檔只會包含處理期間所產生的錯誤。 如果您需要更詳細的資訊,請使用 Flight Recorder。 |
KeyErrorLimit |
這是伺服器在處理失敗之前允許的數據完整性錯誤數目上限。 -1 值表示沒有限制。 默認值為 0,這表示在第一個錯誤發生之後,處理會停止。 您也可以將它設定為整數。 |
KeyErrorLimitAction |
這是伺服器在金鑰錯誤數目達到上限時所採取的動作。 使用 停止處理 時,處理會立即終止。 使用 停止記錄時,處理會繼續,但不再報告或計算錯誤。 |
設定錯誤組態屬性的位置
在部署資料庫之後,或在 SQL Server Data Tools 的模型專案中,使用 SQL Server Management Studio 中的屬性頁。 這兩個工具中都找到相同的屬性。 您也可以在 msmdrsrv.ini 檔案中設定錯誤組態屬性,以變更錯誤組態的伺服器預設值,並且如果處理程序以腳本形式運行,可以在 Batch 和 Process 命令中進行設定。
您可以在任何可當作獨立作業處理的物件上設定錯誤組態。
SQL Server Management Studio
在 [物件總管] 中,按右鍵 屬性,選擇其中一個物件:維度、Cube 或分割區。
在 [屬性] 中,按兩下 [ 錯誤設定]。
SQL Server 資料工具
在 [方案總管] 中,按兩下維度或 Cube。
ErrorConfiguration會出現在下方窗格中的 [屬性] 中。或者,僅針對單一維度,以滑鼠右鍵按兩下 [方案總管] 中的維度,選擇
Process,然後選擇 [進程維度] 對話方塊中的 [變更設定 ]。 錯誤組態選項會出現在 [維度索引鍵錯誤] 索引標籤上。
遺漏金鑰 (KeyNotFound)
遺漏索引鍵值的記錄無法新增至資料庫,即使忽略錯誤或錯誤限制不受限制也一定。
當數據表事實上包含外鍵值,但外鍵在相關維度數據表中沒有對應的記錄時,伺服器會在數據分割處理期間產生 KeyNotFound 錯誤。 當處理相關或雪花型維度數據表時,也可能會發生此錯誤,因為某個維度中的記錄指定了一個在相關維度中不存在的外鍵。
KeyNotFound發生錯誤時,冒犯的記錄會配置給未知的成員。 此行為是透過 [ 金鑰動作] 設定為 ConvertToUnknown來控制,以便您可以檢視已配置記錄以進行進一步調查。
事實資料表中的 Null (空值)外鍵 (KeyNotFound)
根據預設,事實數據表外鍵數據行中的 Null 值會轉換成零。 假設零不是有效的外鍵值, KeyNotFound 則會記錄錯誤,並計入預設為零的錯誤限制。
為了讓處理能夠繼續,您應在轉換之前處理 null 並檢查錯誤。 若要這樣做,請將 設定 NullProcessing 為 Error。
在量值上設定 NullProcessing 屬性
在 SQL Server Data Tools 中的解決方案總管中,雙擊立方體以在立方體設計工具中開啟它。
以滑鼠右鍵按兩下 [量值] 窗格中的量值,然後選擇 [ 屬性]。
在 [屬性] 中,展開 [來源 ] 以檢視
NullProcessing屬性。 它預設會設定為 自動,針對 OLAP 項目,將包含數值資料欄位中的 Null 值轉換為零。將 值變更為
Error以排除具有 Null 值的任何記錄,以避免 Null 到數值 (零) 轉換。 這項修改可讓您避免與索引鍵數據行中具有零的多個記錄相關的重複索引鍵錯誤,而且當零值外鍵在相關維度數據表中沒有對等主鍵時,也會避免KeyNotFound錯誤。
維度中的空鍵
若要在雪花型維度的外鍵中發現 Null 值時繼續處理,請先在維度屬性的 KeyColumn 上設定 NullProcessing 以處理 Null 值。 這會在錯誤發生之前捨棄或轉換記錄,KeyNotFound。
您有兩個選項來處理維度屬性上的空值:
設定
NullProcessing=UnknownMember為將具有 Null 值的記錄配置給未知的成員。 這會產生NullKeyConvertedToUnknown錯誤,而預設情況下會忽略。設定
NullProcessing=Error為排除具有 Null 值的記錄。 這會產生NullKeyNotAllowed錯誤,該錯誤會記錄並計入索引鍵錯誤限制。 您可以在 Null 索引鍵不允許 上設定錯誤配置屬性為IgnoreError,以允許繼續處理。
非鍵欄位的 Null 可能會有問題,因為 MDX 查詢會根據 Null 被解釋為零或空值,傳回不同的結果。 基於這個理由,Analysis Services 提供 Null 處理選項,讓您預先定義所需的轉換行為。 如需詳細資訊,請參閱 定義未知的成員和 Null 處理屬性 以及 NullProcessing。
在維度屬性上設定 NullProcessing 屬性
在 SQL Server Data Tools 的 [方案總管] 中,雙擊該維度以在維度設計師中開啟它。
以滑鼠右鍵按兩下 [屬性] 窗格中的屬性,然後選擇 [ 屬性]。
在 [屬性] 中,展開 [KeyColumns ] 以檢視
NullProcessing屬性。 它預設會設定為 [自動 ],這會針對包含數值數據的欄位,將 Null 轉換成零。 將值變更為Error或UnknownMember。這項修改會移除在檢查記錄是否有錯誤之前捨棄或轉換記錄所觸發
KeyNotFound的基礎條件。視錯誤設定而定,這兩個動作中的任一個都可能導致報告並計數的錯誤。 您可能需要調整其他屬性,例如將 設定
KeyNotFound為ReportAndContinue或KeyErrorLimit設為非零值,以允許在報告和計算這些錯誤時繼續處理。
產生不一致關聯性的重複鍵值 (KeyDuplicate)
根據預設,重複索引鍵的存在不會停止處理,但會忽略錯誤,並將重複的記錄從資料庫排除。
若要變更此行為,請將 設定 KeyDuplicate 為 ReportAndContinue 或 ReportAndStop 以報告錯誤。 然後,您可以檢查錯誤,以判斷維度設計的潛在缺陷。
變更錯誤限制或錯誤限制動作
您可以提高錯誤上限,以便在處理期間允許更多錯誤。 沒有提高錯誤限制的指導;適當的值會根據您的情境而有所不同。 錯誤限制在 SQL Server Data Tools 中指定為 KeyErrorLimitErrorConfiguration 屬性,或在 SQL Server Management Studio 中的維度、cube 或量值群組屬性之 [錯誤組態] 索引標籤中指定為 錯誤數目 。
達到錯誤限制后,您可以指定處理停止或記錄停止。 例如,假設您在錯誤限制為 100 時將 動作設定為 StopLogging 。 在 101 發生錯誤時,處理會繼續,但不會再記錄或計算錯誤。 錯誤限制動作會在 SQL Server Data Tools 中指定為 KeyErrorLimitActionErrorConfiguration 屬性,或在 SQL Server Management Studio 中維度、Cube 或量值群組屬性的 [錯誤組態] 索引標籤上指定為 錯誤發生時的動作。
設定錯誤記錄檔路徑
您可以指定檔案來儲存在處理期間報告的金鑰相關錯誤訊息。 根據預設,錯誤會在 [處理] 視窗中的互動式處理期間顯示,然後在您關閉視窗或會話時被捨棄。 記錄檔只會包含與鍵值相關的錯誤資訊,與您在處理對話方塊中所報告的錯誤相同。
錯誤會記錄到文本檔,而且必須有.log擴展名。 除非發生錯誤,否則檔案會是空的。 根據預設,將會在 DATA 資料夾中建立檔案。 只要 Analysis Services 服務帳戶可以寫入該位置,您就可以指定另一個資料夾。
後續步驟
決定是否要停止處理或忽略錯誤。 請記住,只有錯誤會被忽略。 不會忽略造成錯誤的記錄﹔它會被捨棄,或轉換為未知成員。 違反數據完整性規則的記錄永遠不會新增至資料庫。 根據預設,處理會在發生第一個錯誤時停止,但您可以藉由提高錯誤限制來變更這個。 在 Cube 開發過程中,若放寬錯誤配置規則,允許持續處理,便能提供資料進行測試,這將非常有用。
決定是否要變更預設 Null 處理行為。 根據預設,字串數據行中的 Null 會當做空值處理,而數值數據行中的 Null 則會以零處理。 如需在屬性上設定 Null 處理的指示,請參閱定義未知的成員和 Null 處理屬性 。