2010-06-08 11 views
9

Mantengo un prodotto che è installato in più posizioni che è stato aggiornato a caso. Sono stati aggiunti vincoli univoci a un certo numero di tabelle, ma non ho idea di quali siano i nomi in una particolare istanza. Quello che so è la coppia table/columnname che ha i vincoli univoci e vorrei scrivere uno script per eliminare qualsiasi restrizione univoca su queste combinazioni colonna/tabella.Ho bisogno di rimuovere un vincolo univoco che non conosco i nomi di

Questo è SQL Server 2000 e versioni successive. Qualcosa che funziona su 2000/2005/2008 sarebbe la cosa migliore!

risposta

5

Questo script potrebbe generare un elenco di ALTER TABLE..... DROP CONSTRAINT.... comandi, che è quindi possibile copiare + incollare ed eseguire (o modificare prima di eseguire, se necessario) far cadere tutti i vincoli unici/indici unici:

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(so.parent_obj) + ' DROP CONSTRAINT ' + so.name 
FROM sysobjects so 
WHERE so.xtype = 'UQ' 

Spero che dovrebbe funzionare su tutte le versioni di SQL Server 2000-2008 R2.

+0

Questo è molto vicino, ma non mi consente di filtrare il nome della colonna in cui è applicato il vincolo. Trascorrerò del tempo cercando di modificare la query, grazie! – Bill

+1

In realtà, esistono pochissimi vincoli oltre a quelli che voglio eliminare. Lo userò per lasciarli tutti e ricreare i pochi di cui ho bisogno. Grazie mille! – Bill

+0

Sembra impossibile determinare il nome della colonna dalla tabella sysobjects –

0

This page ha un modo rapido e sporco per tirare fuori tutte le CONSTRAINT s nel database, e da lì si poteva costruire SQL dinamico a farli cadere:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, 
SCHEMA_NAME(schema_id) AS SchemaName, 
OBJECT_NAME(parent_object_id) AS TableName, 
type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc LIKE '%CONSTRAINT'; 
+0

"sys.objects" funzionerà solo nel 2005 e fino ..... –

2

Questo è molto più complicato di quanto possa sembrare, ho trovato un modo che funziona per me, credo che funzionerà solo su SQL Server 2005 o versioni successive. Ecco lo scenario completo:

tabella è stata creata con un vincolo univoco su una colonna, es:

CREATE TABLE table_name (
    id bigint identity not null, 
    column_name varchar(255) not null, 
    primary key(id), 
    unique (column_name) 
); 

Qualche tempo dopo, si è scoperto che questo vincolo univoco non è desiderata.

INSERT INTO table_name(column_name) VALUES('col1'); 

risultati in: Violazione di vincolo UNIQUE KEY 'UQ__table_na__9FA0BA59160F4887'. Impossibile inserire la chiave duplicata nell'oggetto 'dbo.table_name'.

Se si ha il controllo manuale di questo db e possibile esegue SQL direttamente su di essa è possibile, basta fare:

ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887; 

Nel mio caso, questi script sarà stato eseguito su ambienti diversi e le chiavi vinto' Ho nomi identici, quindi per rimuovere il vincolo ho bisogno di SQL che prende il nome della tabella e della colonna come input e capisce il resto.

DECLARE @table_name nvarchar(256) 
DECLARE @col_name nvarchar(256) 
DECLARE @Command nvarchar(1000) 

-- set your table and column name here: 
SET @table_name = N'table_name' 
SET @col_name = N'column_name' 

SELECT @Command = 'ALTER TABLE ' + @table_name + ' DROP CONSTRAINT ' + d.name 
    FROM sys.tables t 
    JOIN sys.indexes d ON d.object_id = t.object_id AND d.type=2 and d.is_unique=1 
    JOIN sys.index_columns ic on d.index_id=ic.index_id and ic.object_id=t.object_id 
    JOIN sys.columns c on ic.column_id = c.column_id and c.object_id=t.object_id 
    WHERE t.name = @table_name and [email protected]_name 

--if you want to preview the generated command before running 
SELECT @Command 

EXEC sp_executesql @Command; 

Questo rimuove il vincolo univoco sulla colonna e consente di procedere con l'inserimento.

+0

Quest'ultimo bit è perfetto, grazie! –

Problemi correlati