Видалення обмеження (індексу) на стовпчик


12

Як я можу змінити тип таблиці, на якій є індекс? Я спробував зробити стовпчик «alter» у порожній таблиці, щоб змінити тип від дати дати до varchar (15), і я отримав помилки, кажучи, що він має залежності від стовпця (який виявився індексами).

Мені вдалося легко обійти цю проблему локально, клацнувши правою кнопкою миші на індексі та написавши краплю, але мені потрібно розгорнути це на інших серверах, де я не матиму доступу до імені індексу.

Чи є спосіб я створити сценарій, який видалить будь-який індекс, дозвольте мені змінити тип даних у стовпці, а потім прочитати індекс? Дякую!

Відповіді:


7

Ви можете використовувати sys.indexes view, щоб отримати індекси. Ви можете приєднати цю таблицю до sys.tables, sys.column і sys.index_column, щоб отримати інформацію для створення індексу динамічного падіння. Ви можете використовувати цей простий вибір для створення індексу падіння. Ви можете використовувати пункт де для фільтрації таблиць і стовпців. Якщо ви хочете змінити Table1.Column1, ви повинні використовувати це ім'я для фільтрування вибору, щоб отримати правильний оператор видалення

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

Сподіваюся, що це вам допоможе


3
при приєднанні ви повинні збагачувати заяви приєднання з idx.object_id = idxCol.object_id & idxCol.object_id = col.object_id, і групування не потрібно.
Бакс

2

Щоб змінити будь-який стовпець, спершу вам потрібно скинути індекс або будь-які інші обмеження, які містять цей стовпець, а потім знову створити індекс / обмеження. Але це завдання повинно виконувати DBA, оскільки будь-яке падіння індексу або обмеження вплине з одного боку на запитання даних - поки індекс знижується, а з іншого - поставить блокування на всю таблицю протягом часу, коли індекс буде повторно створено. Вам потрібно переконатися, що користувачі будуть знати про це невелике чи велике (залежить від розміру таблиці) обслуговування. Удачі!

Однак створення індексу можна виконати за допомогою он-лайн опції, яка менше блокує.


0

Якщо ви кинете індекс спочатку, ви не зможете прочитати з нього знову, якщо індекс не буде відтворено. Що ви можете зробити, щоб відключити виконання обмеження.

ALTER TABLE name_of_the_table NOCHECK CONSTRAINT name_of_the_constraint;

Після запуску цього сценарію обмеження не буде застосовано, і ви можете вводити дані, не турбуючись про перевірки обмежень. Ви можете знову змінити таблицю, щоб знову включити обмеження.

ALTER TABLE name_of_the_table CHECK CONSTRAINT name_of_the_constraint;

Будь-які попередні порушення не перевірятимуться і не будуть виправлені, але будь-які записи після виконання обмеження будуть перевірені.


-2

У відповіді Ніко 2 помилки (2 умови об’єкта_id відсутні). І не потрібно 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
Будь ласка, подивіться, чому я повинен зареєструвати свій рахунок? у FAQ FAQ про обмін стеками.
Пол Білий 9
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.