Bir sütuna bir kısıtlama (dizin) düşürme


12

Dizini olan bir tablodaki türü nasıl değiştirebilirim? Varchar (15) tarih zaman türünü değiştirmek için boş bir tablo üzerinde bir alter sütun yapmaya çalıştım ve (ki dizinler olduğu ortaya çıktı) sütununda bağımlılıkları olduğunu söyleyerek hatalar aldım.

Kolayca dizin sağ tıklatarak ve bir komut dosyası komut dosyası ile kolayca bu başardı, ama ben dizin adı erişemeyeceğim diğer sunucular üzerinde bu rulo gerekir.

Herhangi bir dizini bırakacak bir komut dosyası yapabilirim, bu sütunda veri türü değişikliği yapalım ve sonra dizini okuyalım bir yolu var mı? Teşekkürler!

Yanıtlar:


7

Dizin almak için sys.indexes görünümünü kullanabilirsiniz. Dinamik bir düşüş dizini oluşturmak üzere bilgi almak için bu tabloya sys.tables, sys.columns ve sys.index_column adreslerine katılabilirsiniz. Bırakma dizininizi oluşturmak için bu basit seçimi kullanabilirsiniz. Tabloları ve sütunları filtrelemek için where yan tümcesini kullanabilirsiniz. Table1.Column1 değiştirmek istiyorsanız, doğru silme deyimi almak için seçime filtre uygulamak için bu adı kullanmalısınız

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

Umarım bu sana yardımcı olur


3
katılırken join ifadelerini idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id ile zenginleştirmelisiniz ve gruplamaya gerek yoktur.
Bax

2

Herhangi bir sütunu değiştirmek için, önce dizini veya o sütunu içeren diğer kısıtlamaları bırakmanız ve ardından dizini / kısıtlamayı yeniden oluşturmanız gerekir. Ancak bu görev bir DBA tarafından gerçekleştirilmelidir, çünkü dizin veya kısıtlamadaki herhangi bir düşüş bir yandan sorgulanan verileri etkiler - dizin bırakılırken ve diğer yandan dizinin yeniden oluşturulduğu süre boyunca tüm tabloya tıkanıklık getirir. yarattı. Kullanıcıların bu küçük veya büyük (tablo boyutuna bağlı olarak) bakımdan haberdar olacağından emin olmanız gerekir. İyi şanslar!

Ancak Dizin oluşturma, daha az engelleme olan Çevrimiçi seçeneğiyle yapılabilir.


0

Önce dizini bırakırsanız, dizin yeniden oluşturulmadıkça dizinden tekrar okuyamazsınız. Kısıtlamanın uygulanmasını devre dışı bırakmak için ne yapabilirsiniz?

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Bu komut dosyası çalıştırıldıktan sonra, kısıtlama uygulanmayacak ve kısıtlama denetimleri hakkında endişelenmeden veri girebilirsiniz. Kısıtlamaları yeniden etkinleştirmek için tabloyu tekrar değiştirebilirsiniz.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Önceki ihlaller kontrol edilmeyecek veya düzeltilmeyecek, ancak kısıtlama uygulandıktan sonraki tüm girişler kontrol edilecektir.


-2

Niko'nun cevabında 2 hata var (2 nesne_kimliği koşulu eksik). Ve gerek yok 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
Lütfen Neden hesabımı kaydetmeliyim? Yığın Değişimi SSS bölümünde.
Paul White 9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.