2016-08-01 37 views
0

我使用Sql Server Bulkinsert將一大組數據從XML文件上傳到數據庫,通過在晚上默默運行的計劃作業。bulkinsert會導致殭屍記錄嗎?

背景

考慮這個假人模型:

+====================+  +====================+ 
+ INVOICE   +  + INVOICE LINES  + 
+====================+  +====================+ 
+ PK + InvoiceId  +-I-┐ + PK + InvoiceLineId + 
+ + ...   + └IX-+ FK + InvoiceId  + 
+ + ...   +  + + ...   + 
+====================+  +====================+ 

我的源有望給我提供可靠的數據,但錯誤/錯誤時有發生。 Invoice Lines中的InvoiceId FK可能會指向表Invoice中不存在的InvoiceId

我的問題

可以餵養錯誤引用數據Bulkinsert原因殭屍記錄?

插入它們會導致(可記錄)警告一旦約束再次打開?

如果是這樣,這些將是人類可檢測的。我可以創建一個上傳後清理。預先上傳支票將非常複雜,如上所述,這不是我的責任。

PS

要什麼我與殭屍記錄意味着額外的明確:

記錄存儲在數據庫中沒有存在的理由,因爲他們 有向相關性的參考,通過一個外鍵, 在另一個不存在的表中。

據我所知,這是一個普遍接受的術語。

+0

什麼是殭屍記錄檢測壞行? – TheGameiswar

+2

最簡單的事情就是使用NOT EXISTS運行審計報告來事先查找這些報告。重新啓用FK約束不會給你一個損壞的約束列表,但一個簡單的SELECT將會。你會用這些不良記錄做什麼?轉發給人檢查或刪除? –

+0

回到約束時,約束將失敗。 – TheGameiswar

回答

1

是的,它可能會導致INVOICE LINES行引用不存在INVOICE(「殭屍記載」如你所說的話),如果沒有指定CHECK_CONSTRAINTS選項

CHECK_CONSTRAINTS指定目標表上的所有約束 或必須在批量導入操作期間檢查視圖。如果沒有 CHECK_CONSTRAINTS選項,則任何CHECK和FOREIGN KEY約束都將被忽略,並且在操作之後,該表上的約束將被標記爲不可信的 。

https://msdn.microsoft.com/en-us/library/ms188365.aspx

您可以用負載後查詢

SELECT * 
FROM [INVOICE LINES] il 
    WHERE NOT EXISTS (
    SELECT 1 FROM INVOICE i WHERE i.InvoiceId =il.InvoiceId) ;