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.
fonte
2013-07-12 18:16:27
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
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
Sembra impossibile determinare il nome della colonna dalla tabella sysobjects –