2009-09-17 13 views

risposta

2

Penso che scoprirete che non esiste un modo semplice per eliminare i vincoli su una tabella in SQL Server 2000. Detto questo, ci sono molte persone che hanno scritto script in grado di identificare e rimuovere/disabilitare/ricreare la chiave esterna vincoli. Un esempio è http://www.mssqltips.com/tip.asp?tip=1376, ma non l'ho provato su SQL Server 2000.

MODIFICA: ecco un altro example che genera script di rilascio/creazione per te.

13

Se semplicemente disattivazione dei vincoli è un'opzione qui, si può utilizzare:

ALTER TABLE myTable NOCHECK CONSTRAINT all 

allora si può tornare sulla semplicemente usando:

ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all 

Se si desidera disabilitare vincoli in tutte le tabelle è possibile utilizzare:

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

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

più nella domanda: Can foreign key constraints be temporarily disabled using TSQL?

Tuttavia, se è necessario eliminare i vincoli in modo permanente, è possibile utilizzare this script posted on databasejurnal.com.

Basta modificarlo leggermente per cadere solo le chiavi esterne

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

qui si va: (non testato su SQL2000, ma dovrebbe essere ok)

Genera 'disabilita':

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 

Genera "abilita":

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 
Aggiornamento

: Oops, pensavo lo avessi voluto per tutti i tavoli :) Puoi solo modificare sopra per il tuo singolo tavolo.

+1

Le tabelle di sistema sono diverse ma denominate in modo simile in SQL Server 2000: http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx – Emyr

Problemi correlati