2010-04-13 10 views
2

J'ai un ensemble de tables (disons compte, client) dans un schéma (disons dbo) et j'ai d'autres tables (disons Order, OrderItem) dans un autre schéma (disons inventaire). Il existe une relation entre la table Order et la table Customer. Je veux supprimer toutes les relations entre les tables dans le premier schéma (dbo) et les tables dans le deuxième schéma (inventaire), sans supprimer les relations entre les tables dans le même schéma.
Script T-SQL pour supprimer toutes les relations entre un ensemble de tables dans un schéma et un autre ensemble dans un autre schéma?

Est-ce possible? Toute aide appréciée.

+1

pourquoi voudriez-vous faire cela? Il devrait y avoir une relation entre les commandes et les clients. – HLGEM

Répondre

7

Utilisez les métadonnées:

SELECT * 
FROM INFORMATION_SCHEMA.CONSTRAINT_TABLE_USAGE 
WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME 
          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
          WHERE CONSTRAINT_TYPE = 'FOREIGN KEY') 
SELECT * 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE 
WHERE CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME 
          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
          WHERE CONSTRAINT_TYPE = 'FOREIGN KEY') 
SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 

Ajouter des critères de filtre pour trouver les contraintes que vous souhaitez supprimer, puis les insérer dans le modèle:

ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME} 

et exécuter avec SQL dynamique.

4

vous pouvez obtenir les clefs étrangères disponibles qui existent dans votre base de données par script ci-dessous, puis de les supprimer:

select * from sys.objects o 
join sys.schemas s on o.schema_id = s.schema_id 
where o.type = 'F' 

après suppression comme ci-dessous

ALTER TABLE {TABLE_SCHEMA}.{TABLE_NAME} DROP {CONSTRAINT_NAME} 
1

Je ne jure que cela fonctionne sur SQL 2005, car je n'ai pas d'instance pour le tester, mais si c'est le cas, cela en fera un simple travail de copier/coller dans SSMS. Je vous laisse le soin de répéter les résultats et de les exécuter si c'est ce que vous voulez.

Remplacez schéma_1 et schéma_2 par les noms de schéma auxquels vous tentez de trouver des relations.

declare @s1 int 
declare @s2 int 

set @s1 = schema_id('schema_1') 
set @s2 = schema_id('schema_2') 

select 
    N'alter table [' + s.name + N'].[' + o_p.name + N'] drop constraint [' + fk.name + N']' 
from sys.foreign_keys fk 
join sys.schemas s on (s.schema_id = fk.schema_id) 
join sys.objects o_p on (o_p.object_id = fk.parent_object_id) 
join sys.objects o_r on (o_r.object_id = fk.referenced_object_id) 
where 
     (o_p.schema_id = @s1 and o_r.schema_id = @s2) 
    or (o_p.schema_id = @s2 and o_r.schema_id = @s1) 
1

S'il vous plaît utiliser le script ci-dessous en copiant et collant à SQL Studio:

SELECT 'ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP [' + CONSTRAINT_NAME + ']' 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 
Questions connexes