2014-05-03 34 views
1

我每天收到很多更改請求,要求在生產環境中刪除或更新記錄。在從生產數據庫中的表中刪除記錄之前需要採取什麼預防措施

我一般不自己的數據庫,所以沒有觸發,歷史記錄表等

例如

delete 
from orders 
where orderNo in ('x123', 'x124', 'x129') 

我通常有作爲預防措施如下:

1)找到表有多大 - >

sp_spaceused 'dbo.orders' 

取決於表格的大小e口備份整個表或只受刪除的範圍/更新

例如:

select * into tablebackups.dbo._MM_20140502_orders_1515 
from Orders 
where orderNo in ('x123', 'x124', 'x129') 

這使我恢復數據如果需要的話。

2)我檢查約束條件,我特別尋找依賴於這個的表格,什麼類型的約束以及是否存在ON CASCADE DELETE/UPDATE

sp_helpconstraint 'dbo.orders' 

根據這個我可以繼續打開事務,消防刪除,如果經過COMMIT交易的結果。

問題:

  1. 沒有任何人有一個腳本來顯示ON CASCADE約束?
  2. 沒有人有腳本顯示依賴記錄嗎?

回答

1

如果可能,我創建數據庫快照(僅限企業版)或使用copy_only選項進行完整備份。在刪除或更新之前始終打開一個事務,並在我確信一切順利後才進行提交。

要了解有關FK的信息,請檢查sys.foreign_keys目錄視圖。例如,要看到級聯動作表的所有FKS上的更新或刪除,請使用以下查詢:

select * 
from sys.foreign_keys 
where parent_object_id = object_id('your_table') and 
(delete_referential_action = 1 or update_referential_action = 1) 

同樣,這個查詢將返回FKS一個表,列出包括鍵和被引用表列:

select fk.name as foreign_key_name, 
    object_name(pc.object_id) as parent_table, pc.name as parent_column, 
    object_name(rc.object_id) as referenced_table, rc.name as referenced_column 
from sys.foreign_keys fk 
inner join sys.foreign_key_columns fkc on 
fk.object_id = fkc.constraint_object_id 
inner join sys.columns pc 
on fkc.parent_object_id = pc.object_id and fkc.parent_column_id = pc.column_id 
inner join sys.columns rc 
on fkc.referenced_object_id = rc.object_id and fkc.referenced_column_id = rc.column_id 
where fk.parent_object_id = object_id('your_table') 
相關問題