2014-05-03 1 views
1

Je reçois quotidiennement de nombreuses demandes de modification, demandant la suppression ou la mise à jour d'un enregistrement dans un environnement de production.Quelles précautions doivent être prises avant de supprimer des enregistrements d'une table dans la base de données de production?

Je ne généralement pas les bases de données propres donc pas déclencheurs, tables d'historique, etc.

Par exemple

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

ce que j'ai l'habitude que les précautions sont les suivantes:

1) trouve quelle est la taille de la table ->

sp_spaceused 'dbo.orders' 

en fonction de la taille du tabl sauvegarde e I la table entière ou seulement la plage affectée par la suppression/mise à jour

Par exemple:

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

Cela me permet de récupérer les données si besoin est.

2) Je vérifie les contraintes, je recherche particulièrement les tables qui dépendent de celle-ci, quel type de contraintes et s'il y a ON CASCADE DELETE/UPDATE.

sp_helpconstraint 'dbo.orders' 

En fonction du résultat de ce que je peux aller ouvrir avant une opération, la suppression feu, et si elle passe par COMMIT la transaction.

Questions:

  1. Quelqu'un at-il un script pour afficher des contraintes CASCADE?
  2. Quelqu'un at-il un script pour afficher les enregistrements dépendants?

Répondre

1

Si possible, je crée un instantané de base de données (édition entreprise uniquement) ou effectue une sauvegarde complète avec l'option copy_only. Toujours ouvrir une transaction avant les suppressions ou les mises à jour et valider seulement après je suis sûr que tout s'est bien passé. Pour en savoir plus sur les FK, consultez le catalogue sys.foreign_keys. Par exemple, pour voir tous FKs pour une table avec une action en cascade sur la mise à jour ou supprimer, utilisez cette requête:

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

De même, cette requête renvoie FKs pour une table, colonnes liste comprenant la clé et la table référencée:

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