2009-09-17 8 views

Répondre

2

Je pense que vous trouverez qu'il n'y a aucun moyen facile de supprimer des contraintes sur une table dans SQL Server 2000. Cela dit, il y a beaucoup de gens qui ont écrit des scripts qui peuvent identifier et supprimer/recréer contraintes. Un exemple est à http://www.mssqltips.com/tip.asp?tip=1376 - mais je ne l'ai pas testé sur SQL Server 2000.

EDIT: Voici un autre example qui génère des scripts drop/create pour vous.

13

Si simplement désactiver les contraintes est une option ici, vous pouvez utiliser:

ALTER TABLE myTable NOCHECK CONSTRAINT all 

alors vous pouvez les rallume simplement en utilisant:

ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all 

Si vous souhaitez désactiver des contraintes dans toutes les tables vous pouvez utiliser:

-- disable all constraints 
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all" 

-- enable all constraints 
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all" 

Plus dans la question: Can foreign key constraints be temporarily disabled using TSQL?

Mais si vous devez supprimer des contraintes de façon permanente, vous pouvez utiliser this script posted on databasejurnal.com.

Il suffit de modifier légèrement pour déposer uniquement les clés étrangères

create proc sp_drop_fk_constraints 
    @tablename sysname 
as 
-- credit to: douglas bass 

set nocount on 

declare @constname sysname, 
    @cmd  varchar(1024) 

declare curs_constraints cursor for 
    select name 
    from sysobjects 
    where xtype in ('F') 
    and (status & 64) = 0 
    and  parent_obj = object_id(@tablename) 

open curs_constraints 

fetch next from curs_constraints into @constname 
while (@@fetch_status = 0) 
begin 
    select @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @constname 
    exec(@cmd) 
    fetch next from curs_constraints into @constname 
end 

close curs_constraints 
deallocate curs_constraints 

return 0 
5

Ici vous allez: (non testé sur SQL2000, mais devrait être ok)

Génère 'désactive':

SELECT 'IF EXISTS (SELECT * FROM sys.foreign_keys 
    WHERE object_id = OBJECT_ID(N''[dbo].' + FK +''') 
    AND parent_object_id = OBJECT_ID(N''[dbo].' + PT + ''')) 
    ALTER TABLE ' + PT + ' NOCHECK CONSTRAINT ' + FK + ';' 
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK, 
    OBJECT_NAME(parent_object_id) as PT 
    FROM [sys].[foreign_key_columns]) T 
ORDER BY FK 

Génère 'active':

SELECT 'ALTER TABLE ' + PT + ' WITH CHECK CHECK CONSTRAINT ' + FK + ';' 
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK, 
    OBJECT_NAME(parent_object_id) as PT 
    FROM [sys].[foreign_key_columns]) T 
ORDER BY FK 

Mise à jour: Oups, je pensais que vous le vouliez pour toutes les tables :) Vous pouvez simplement modifier ci-dessus pour votre table unique.

+1

Les tables système sont différentes mais nommées de manière similaire dans SQL Server 2000: http://msdn.microsoft.com/fr-fr/library/aa260604%28v=SQL.80%29.aspx – Emyr

Questions connexes