Comment faire pour supprimer toutes les contraintes de Clé Étrangère dans tous les tableaux?
Je veux écrire la commande sql à abandonner toutes les contraintes de toutes les tables. J'ai cherché sur internet et trouvé ce qui fonctionne très bien si la base de données est petite et sans complexe.
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)
DECLARE @schema VARCHAR(128)
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
SELECT @schema = (SELECT TOP 1 schema_name(schema_id) FROM sys.objects WHERE [name] = @name)
WHILE @name is not null
BEGIN
SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
WHILE @constraint IS NOT NULL
BEGIN
SELECT @SQL = 'ALTER TABLE ' + @schema + '.[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
EXEC (@SQL)
PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
SELECT @schema = (SELECT TOP 1 schema_name(schema_id) FROM sys.objects WHERE [name] = @name)
END
GO
Il ne fonctionne pas si je le lance avec une base de données plus complexe ou même AdventureWork. Elle montre quelques erreurs comme ci-dessous.
Msg 3728, Level 16, State 1, Line 1
'FK_ap_invoice_modification_type_id' is not a constraint.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.
Msg 3725, Level 16, State 0, Line 1
The constraint 'PK_ap_invoice' is being referenced by table '_drop_now_ap_invoice_detail', foreign key constraint 'FK_ap_invoice_detail_ap_invoice'.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.
La raison en est que certains FKs sont référencés par une autre table. J'ai pour exécuter ce script pour un couple de fois jusqu'à ce que la base de données est propre.
Je veux savoir comment puis-je effacer tous les FKs dans la base de données.
En fonction de vos titre que vous souhaitez supprimer les clés étrangères. Mais votre dernière question, demander une "effacer tout", y compris les tables, procédures stockées, fonctions. Que voulez-vous dire?
Même si je suis sûr, vous devez avoir coché pour des questions similaires, mais je vous demande de revoir la solution ici : stackoverflow.com/a/1438933/1268844
Merci pour le point de sortir. Je suis en pleine charge avec des tâches. Je viens de mettre à jour ma question de détails pour le match avec le titre.
Il donne le même résultat que ma requête. "Msg 2801, Niveau 16, État 1, Procédure XXX, en Ligne 31 La définition de l'objet 'XXX' a changé depuis qu'il a été compilé."
Même si je suis sûr, vous devez avoir coché pour des questions similaires, mais je vous demande de revoir la solution ici : stackoverflow.com/a/1438933/1268844
Merci pour le point de sortir. Je suis en pleine charge avec des tâches. Je viens de mettre à jour ma question de détails pour le match avec le titre.
Il donne le même résultat que ma requête. "Msg 2801, Niveau 16, État 1, Procédure XXX, en Ligne 31 La définition de l'objet 'XXX' a changé depuis qu'il a été compilé."
OriginalL'auteur Anonymous | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Il y a beaucoup d'information sur le sujet tout autour. Vérifier cette réponse détaillée par @AaronBertrand. Il parle de la désactivation temporaire des clés étrangères mais la lecture de tout et de modifier à volonté, vous aurez une belle script pour jouer avec et de faire beaucoup de choses.
De mon côté, je peux proposer 2 scripts différents pour obtenir toutes les clés étrangères. Sur les deux cas, décommentez la
--EXEC (@SQL)
pour l'exécution de votreALTER
code. Ou vous pouvez attendre jusqu'à ce qu'il imprime tous les alter clauses et ensuite de copier coller les exécuter.Première utilise la
INFORMATION_SCHEMA
pour obtenir les contraintes:En utilisant différentes vues du système et un CTE table.
varchar(max)
et'ALTER TABLE ' + QUOTENAME(FK.TABLE_SCHEMA) + '.' + QUOTENAME(FK.TABLE_NAME) + '
pour éviter les erreurs de syntaxe.Ajouté @AntoineAubry, thx
OriginalL'auteur Yaroslav
Voici un court et doux script que j'utilise (sur SQL Server 2008 et jusqu') pour supprimer toutes les clés étrangères qui tient également compte de l'objet du schéma:
OriginalL'auteur arcain
J'ai amélioré le premier script fourni par @Yaroslav et le script fourni par @Dilemme de sorte qu'ils fonctionne maintenant pour les bases de données dont le SQL de la requête pour supprimer toutes les clés étrangères l'une par on dépasse la taille allouée pour la
SQL
variable (4000
ouMAX
caractères).La modification des scripts de déposer
5
clés étrangères par itération (juste pour être sûr, mis en œuvre par l'ajout deTOP 5
). Les scripts s'arrêter quand il n'y a pas de clé étrangère de gauche à goutte (laSQL
variable reste vide après l'exécution de laSELECT
).Premier script par @Yaroslav
Script par @Dilemme
OriginalL'auteur alik
Plus simple variante:
OriginalL'auteur Stefan Steiger
J'ai utilisé le INFORMATION_SCHEMA solution mentionnée par @Yaroslav, mais il avait trop de clé étrangère constantes dans ma base de données pour s'adapter à tous dans un varchar(MAX). J'ai donc dû modifier le script pour utiliser une table temporaire et un curseur à la place.
Aussi, j'ai ajouté
[]
autour de le nom de la table.OriginalL'auteur egeskov
Pour les bases de données avec beaucoup de contraintes autres solutions mentionnées échoué mais celui-ci a fonctionné pour moi.
OriginalL'auteur Michael23