Menjatuhkan batasan (indeks) pada kolom

12

Bagaimana saya bisa memodifikasi tipe pada tabel yang memiliki indeks di atasnya? Saya mencoba untuk melakukan perubahan kolom pada tabel kosong untuk memodifikasi jenis dari tanggal waktu ke varchar (15) dan mendapat kesalahan mengatakan bahwa itu memiliki ketergantungan pada kolom (yang ternyata merupakan indeks).

Saya dapat dengan mudah menyiasatinya secara lokal dengan mengeklik kanan indeks dan membuat skrip drop, tetapi saya harus meluncurkannya di server lain di mana saya tidak akan memiliki akses ke nama indeks.

Apakah ada cara saya bisa membuat skrip yang akan menjatuhkan indeks apa pun, biarkan saya membuat perubahan tipe data pada kolom lalu membaca indeks? Terima kasih!

pengguna1480
sumber

Jawaban:

7

Anda dapat menggunakan tampilan sys.indexes untuk mendapatkan indeks. Anda dapat bergabung dengan tabel ini ke sys.tables, sys.columns dan sys.index_column untuk mendapatkan informasi untuk membuat indeks penurunan dinamis. Anda dapat menggunakan pilihan sederhana ini untuk menghasilkan drop index Anda. Anda dapat menggunakan klausa where untuk memfilter tabel dan kolom. Jika Anda ingin mengubah Table1.Column1 Anda harus menggunakan nama itu untuk memfilter pilih untuk mendapatkan pernyataan penghapusan yang benar

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

Semoga ini bisa membantu Anda

Nico
sumber
3
ketika bergabung, Anda harus memperkaya pernyataan bergabung dengan idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id dan tidak perlu untuk dikelompokkan.
Bax
2

Untuk mengubah kolom apa pun, pertama Anda harus menjatuhkan indeks atau kendala lain yang mengandung kolom itu, dan setelah membuat indeks / kendala lagi. Tetapi tugas ini harus dilakukan oleh DBA karena setiap penurunan pada indeks atau kendala akan mempengaruhi di satu sisi data yang diminta - sementara indeks dijatuhkan, dan di sisi lain menempatkan penyumbatan di seluruh tabel untuk saat indeks dikembalikan. dibuat. Anda harus memastikan pengguna akan menyadari pemeliharaan ini kecil atau besar (tergantung pada ukuran tabel). Semoga berhasil!

Namun pembuatan Indeks dapat dilakukan dengan opsi Online yang kurang memblokir.

yrushka
sumber
0

Jika Anda menjatuhkan indeks terlebih dahulu, Anda tidak akan dapat membacanya lagi, kecuali jika indeks dibuat kembali. Apa yang dapat Anda lakukan untuk menonaktifkan penegakan batasan.

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Setelah skrip ini dijalankan, kendala tidak akan ditegakkan, dan Anda dapat memasukkan data tanpa khawatir tentang pemeriksaan kendala. Anda bisa mengubah tabel lagi, untuk mengaktifkan kembali kendala.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Setiap pelanggaran sebelumnya tidak akan diperiksa atau diperbaiki, tetapi setiap entri setelah kendala diberlakukan, akan diperiksa.

StanleyJohns
sumber
-2

Ada 2 kesalahan dalam jawaban Niko (2 kondisi object_id hilang). Dan tidak perlu 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';
Val Starovoitov
sumber
1
Silakan lihat Mengapa saya harus mendaftarkan akun saya? di FAQ Stack Exchange.
Paul White 9