在从生产数据库中的表中删除记录之前需要采取哪些预防措施

时间:2014-05-03 20:25:04

标签: sql-server foreign-keys constraints

我每天都会收到许多变更请求,要求删除或更新生产环境中的记录。

我通常不拥有数据库,因此没有触发器,历史记录表等。

例如

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

我通常采取的预防措施如下:

1)找出桌子有多大 - >

sp_spaceused 'dbo.orders'

取决于表的大小,我备份整个表或仅受删除/更新

影响的范围

例如:

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 个答案:

答案 0 :(得分:1)

如果可能,我创建数据库快照(仅限企业版)或使用copy_only选项进行完整备份。在删除或更新之前始终打开一个事务,并且只有在我确定一切顺利之后才提交。

要了解有关FK的信息,请查看sys.foreign_keys目录视图。例如,要查看更新或删除时具有级联操作的表的所有FK,请使用以下查询:

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

类似地,此查询将返回表的FK,列出包含键和引用表的列:

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')