2010-09-09 6 views
4

Si vous déposez une table dans SQL Server qui contient des clés, des index, des contraintes, etc. Je me demandais juste quand je construisais mes scripts si je devais créer des scripts de dépôt pour tous ceux-ci ou si je pouvais simplement laisser tomber les tables?Table de dépôt SQL Server

Merci,

S

Répondre

8

Oui, mais vous ne pouvez pas supprimer une table qui est référencée par une clé étrangère dans une autre table.

Voici une procédure de suppression d'une table avec des clés étrangères qui y font référence dans SQL Server 2008:

create table TA (AID int identity(1, 1), OtherId int, Name varchar(512), constraint PK_TA primary key (AID)) 
create table TB (BID int identity(1, 1), OtherId int, Name varchar(512), constraint PK_TB primary key (BID)) 
alter table TA add constraint FK_TA_TB foreign key (OtherId) references TB (BID) 
alter table TB add constraint FK_TB_TA foreign key (OtherId) references TA (AID) 

drop table ta -- doesn't work 
drop table tb -- doesn't work 

create procedure my_DropTable @tableName varchar(512) as 
begin 
    if OBJECT_ID(@tableName) is null begin print 'OBJECT DOES NOT EXIST' return end 
    declare @sql nvarchar(max) 
    while exists (select * from sys.foreign_keys where referenced_object_id = object_id(@tableName)) 
    begin 
     select @sql = 'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + OBJECT_NAME(object_id) 
     from sys.foreign_keys where referenced_object_id = object_id(@tableName) 

     exec sp_executesql @sql 
    end 
    set @sql = 'DROP TABLE ' + @tableName 
    exec sp_executesql @sql 
end 

exec my_DropTable 'TA' 
exec my_DropTable 'TB' 
+0

En effet si vous écrivez un script pour tout laisser tomber par exemple, vous devez le faire dans un tel un manière que vous laissez d'abord tomber les tables qui référencent les autres. – bjorsig

+0

Yep a du sens, merci gusy – scarpacci

+0

@bjorsig: Sauf si vous avez des références circulaires qui, d'après mon expérience, ne sont pas courantes. –