我每天都会收到许多变更请求,要求删除或更新生产环境中的记录。
我通常不拥有数据库,因此没有触发器,历史记录表等。
例如
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
交易。
问题:
答案 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')