Eliminazione di un vincolo (indice) su una colonna


12

Come posso modificare il tipo su una tabella che ha un indice su di esso? Ho provato a fare una colonna alter su una tabella vuota per modificare il tipo da data ora a varchar (15) e ho ricevuto errori dicendo che aveva dipendenze sulla colonna (che si è rivelata essere indici).

Sono stato in grado di aggirare facilmente questo problema localmente facendo clic con il pulsante destro del mouse sull'indice e scrivendo una goccia, ma ho bisogno di distribuirlo su altri server in cui non avrei accesso al nome dell'indice.

C'è un modo in cui posso creare uno script che rilascerà qualsiasi indice, permettimi di modificare quel tipo di dati sulla colonna e quindi leggere l'indice? Grazie!

Risposte:


7

È possibile utilizzare la vista sys.indexes per ottenere gli indici. È possibile unire questa tabella a sys.tables, sys.columns e sys.index_column per ottenere informazioni per creare un indice di rilascio dinamico. Puoi utilizzare questa semplice selezione per generare il tuo indice di rilascio. È possibile utilizzare la clausola where per filtrare le tabelle e le colonne. Se si desidera modificare Table1.Column1, è necessario utilizzare tali nomi per filtrare la selezione per ottenere l'istruzione di eliminazione corretta

use [testdb]
go
declare @sqlDropIndex NVARCHAR(1000)

select @sqlDropIndex = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
from sys.indexes idx inner join 
        sys.tables tbl on idx.object_id = tbl.object_id inner join
        sys.index_columns idxCol on idx.index_id = idxCol.index_id inner join
        sys.columns col on idxCol.column_id = col.column_id
where idx.type <> 0 and
        tbl.name = 'MyTableName' and
        col.name = 'MyColumnName'
group by idx.name, tbl.name
order by idx.name desc

print @sqlDropIndex
--exec sp_executeSql @sqlDropIndex
go

Spero che questo ti possa aiutare


3
quando ti iscrivi devi arricchire le istruzioni di join con idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id e non è necessario raggruppare.
Bax,

2

Al fine di modificare qualsiasi colonna, è innanzitutto necessario eliminare l'indice o qualsiasi altro vincolo che contenga quella colonna, quindi creare nuovamente l'indice / il vincolo. Ma questo compito deve essere svolto da un DBA perché qualsiasi caduta sull'indice o vincolo influenzerà da un lato i dati da interrogare - mentre l'indice viene lasciato cadere, e dall'altro lato blocca l'intera tabella per il tempo in cui l'indice viene ripristinato creato. È necessario assicurarsi che gli utenti siano a conoscenza di questa piccola o grande manutenzione (dipende dalle dimensioni della tabella). In bocca al lupo!

Tuttavia, la creazione dell'Indice può essere eseguita con l'opzione Online, che è meno bloccante.


0

Se si rilascia prima l'indice, non sarà possibile leggerlo nuovamente, a meno che l'indice non venga ricreato. Cosa puoi fare per disabilitare l'applicazione del vincolo.

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Dopo aver eseguito questo script, il vincolo non verrà applicato e sarà possibile inserire i dati senza preoccuparsi dei controlli dei vincoli. È possibile modificare nuovamente la tabella per riattivare i vincoli.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Eventuali violazioni precedenti non verranno verificate o corrette, ma verranno verificate tutte le voci dopo l'applicazione del vincolo.


-2

Ci sono 2 errori nella risposta di Niko (mancano 2 condizioni object_id). E non è necessario group by:

SELECT  @sql = 'DROP INDEX ' + idx.name + ' ON ' + tbl.name
FROM    sys.indexes             idx 
INNER JOIN sys.tables           tbl     ON idx.object_id = tbl.object_id 
INNER JOIN sys.index_columns    idxCol  ON idx.index_id = idxCol.index_id   AND idx.object_id = idxCol.object_id 
INNER JOIN sys.columns          col     ON idxCol.column_id = col.column_id AND  idxCol.object_id = col.object_id
WHERE   idx.type <> 0 
AND     tbl.name = 'file_transfer_log' 
AND     col.name = 'tender_id';

1
Per favore vedi Perché dovrei registrare il mio account? nelle Domande frequenti su Stack Exchange.
Paul White 9
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.