2013-06-12 51 views
1

對於SQL專家來說,這可能非常容易,但SQL(儘管我可以使用它)實際上並不是我的東西。保留表格的影子副本,同時保留原來的記錄

我在DB中有一張表。 (我們稱之爲計算機)
約10,000行。 25列。 1個唯一鍵:列ASSETS。

偶爾外部程序會刪除一個或多個行,但不應該這樣做,因爲我們仍然需要從這些行中知道一些信息,然後才能真正刪除這些項目。

我們無法控制外部應用程序的行爲,所以我們想出了一個不同的想法:

我們要創建第二個相同的表(COMPUTERS_BACKUP),並初步形成了具有單對單的填寫此計算機的副本。
之後,每天一次將新記錄從計算機複製到COMPUTERS_BACKUP,並更新COMPUTERS_BACKUP中COMPUTERS中原始文件已更改(ASSETS列永遠不會更改)的那些記錄。

這樣我們保持從計算機中刪除記錄的最後一個狀態。

有人可以提供可以安排每天運行一次的存儲過程的代碼嗎?我大概可以自己弄清楚這一點,但這需要幾個小時左右的時間,而且我非常緊張。

+3

爲什麼不添加'DELETE'觸發器來記錄刪除的行?您可能可以在「APP_NAME()」上過濾僅記錄有問題的應用程序刪除的內容。 –

+0

是否曾經從應用程序中的表中刪除行? – peterm

+0

@MartinSmith這也是我的第一本能,但是......我沒有告訴洞的故事:表格實際上被截斷,然後被外部應用程序重新填充。愚蠢的設計,但我們必須忍受它。 – Tonny

回答

1

剛剛創建插入電腦桌觸發

CREATE TRIGGER newComputer 
ON [Computers] 
AFTER INSERT 
Begin 

INSERT INTO COMPUTERS_BACKUP 
    SELECT * FROM Inserted 

End 

當您插入新的電腦電腦桌它會工作,它還將插入記錄bakcup表

當你更新計算機你可以更改電腦備份與更新觸發器

CREATE TRIGGER newComputer 
ON [Computers] 
AFTER UPDATE 
Begin 
//can access before updating the record through SELECT * FROM Deleted 
//can access after updating the record through SELECT * FROM Inserted 
UPDATE Computers_BACKUP SET 
(attributes) = inserted.(attribute) 
WHERE id = inserted.id 

End 

最後我猜你不想刪除備份時,原始記錄是從電腦表中刪除。您可以使用觸發器從msdn中挑選更多示例。

當一條記錄從電腦桌

CREATE TRIGGER computerDeleted ON [Computers] AFTER DELETE 
Begin 

INSERT INTO Computers_BACKUP 
    SELECT * FROM Deleted 

End 
+0

它應該是'FOR DELETE'觸發器,而不是'Update' – Stoleg

+0

當然,如果你想要保留剛剛刪除的記錄,您只需寫入已刪除的觸發器即可插入備份表。但在您的問題中,您已寫入保留整個表副本,以便在嘗試插入已刪除的記錄時可能不會插入已刪除的記錄存在,我可能會誤解,我會更新我的回答 –

+0

然後應該有3個觸發器插入,更新和刪除,每次更改tim estapmed。 – Stoleg

0

一種Before Delete事件觸發器可以幫你守護這個表:

CREATE TRIGGER backup_row_before_delete ON COMPUTERS_Table FOR Delete 
as 
    INSERT INTO Computers_Backup 
    SELECT deleted.* from deleted 

您可以deleted.col1, deleted.col2改變deleted.*如果你想保持只有某些列。

+0

這不是SQL Server的語法我很害怕:( – Bridge

+2

這是無效的SQL Server語法CREATE TRIGGER backup_row_before_delete ON COMPUTERS_Table FOR DELETE AS INSERT INTO Computers_Backup SELECT * FROM DELETED;' –

+0

我不是SQL大師,但我如果你想要觸發一個截斷的表格,請參考上面 – Tonny

1

恕我直言,一個可能的解決辦法去除,如果你從來沒有刪除您的應用程序從該表中的記錄(僅更新),可以引入一個INSTEAD OF DELETE觸發

CREATE TRIGGER tg_computers_delete ON computers 
INSTEAD OF DELETE AS 
DELETE computers WHERE 1=2; 

它會阻止刪除記錄。

這裏是SQLFiddle演示。

1

除了創建觸發器之外,您還可以考慮啓用Change Data Capture,它在SQL Server企業版中可用。這可能是一個過沖,但應該提及,你可能會發現它對其他表和對象有用。

0

將刪除1個或多個行,但不應該這樣做

就有權和完整性問題。

你可以肯定地使用觸發器來記錄刪除操作(當然還有更新),但我不建議你純粹用它來保存你不想刪除的東西的副本!

刪除刪除權限,如果您必須或如果可以的話加強您的數據完整性。如果沒有你的模式,很難確切地說明。

最後,使用您的(INSTEAD OF)觸發器檢查所需的任何條件,以防止在適當的時候刪除。

+0

請參閱我對MartinSmith的評論。這不是一個許可/完整的東西。我們獲得原始表格的副本,我們的應用程序將其用於不同的目的。只是我們使用這些數據的要求略有不同。實際上,原始應用的行爲在幾周前改變了。我們對這些數據的使用沒有。對外部提供的數據的依賴是幾年前做出的一個愚蠢的設計錯誤。現在我正在努力處理後果。 – Tonny