web-dev-qa-db-fra.com

SQL Server: équivalent de cascade d'une table de suppression?

Dans Oracle, pour supprimer toutes les tables et contraintes, vous devez taper quelque chose comme

DROP TABLE myTable CASCADE CONSTRAINTS PURGE;

et cela effacerait complètement les tables et leurs dépendances. Quel est l'équivalent serveur SQL?

20
Sinaesthetic

Je ne crois pas que SQL propose une solution aussi élégante. Vous devez supprimer toutes les contraintes liées avant de pouvoir supprimer la table.

Heureusement, tout cela est stocké dans le schéma d'information et vous pouvez y accéder pour obtenir votre liste de résultats.

Cet article de blog devrait pouvoir vous fournir ce dont vous avez besoin: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'DatabaseName'
set @table = 'TableName'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END
23
Vinnie

Dans SQL Server Management Studio, accédez à Options/Explorateur d'objets SQL Server/Script, puis activez «Générer un script pour les objets dépendants». Cliquez ensuite avec le bouton droit de la souris sur la table, le script> déposer vers> la nouvelle fenêtre de requête et elle sera générée à votre place.

30
rizzle

Cela pourrait être une solution horrible, mais je trouve que c'est rapide. Cela ressemble à la réponse de Vinnie, mais le produit de l'instruction SQL est une autre série d'instructions SQL qui supprimera toutes les contraintes et les tables.

(
select
  'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
  ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
where
  t.table_name = tc.table_name
  and tc.constraint_name not like '%_pk'
  and tc.constraint_name not like 'pk_%'
  and t.table_catalog='<schema>'
) UNION (
select
  'DROP TABLE ' + t.table_name + ';'
from
  INFORMATION_SCHEMA.TABLES t
where
  t.table_catalog='<schema>'
)
5
TJR

Tout cela est amusant et amusant jusqu'à ce qu'une table fasse référence à votre table ...

Ensuite, je dois modifier le code fourni comme suit:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL
as
DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME
      from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join
                  INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on
                   (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and
                    rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join
                  INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on
                   (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and
                    tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME)
     where tc.constraint_catalog = @database
       and tc_pk.TABLE_NAME = @table
    exec    sp_executesql @sql
END
go
2
Marco Polo

En fin de compte, nous supprimons notre table . Nous pouvons donc simplement exécuter la commande suivante: 

ALTER TABLE ... BAISSE DE CONTRAINTES ...

DROP TABLE ...

1> ALTER TABLEPRJ_DETAILSDROP CONSTRAINTFK_PRJ_TYPE;

- Le nom de la table et le nom de la contrainte sont les paramètres. 

2> DROP TABLE. 

Première contrainte de suppression avec son nom associé à la table Deuxièmement, vous pouvez supprimer la table.

Cela a fonctionné pour moi et c'est facile aussi. 

1
Laxman G

J'ai juste besoin de supprimer la clé étrangère

DECLARE @database nvarchar(50)
DECLARE @TABLE_NAME nvarchar(250)
DECLARE @CONSTRAINT_NAME nvarchar(250)
DECLARE @sql nvarchar(350)
set @database = 'XXX'


DECLARE db_cursor CURSOR FOR  
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY'

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME  

WHILE @@FETCH_STATUS = 0  
BEGIN  

    select    @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @TABLE_NAME
    exec    sp_executesql @sql 

       FETCH NEXT FROM db_cursor INTO  @TABLE_NAME, @CONSTRAINT_NAME 
END  

CLOSE db_cursor  
DEALLOCATE db_cursor 
0