Как проверить, могу ли я удалить индекс из БД в SQL Server - PullRequest
1 голос
/ 05 апреля 2011

После большого изменения структуры БД мне нужно удалить все индексы из нее и установить новые индексы.
Я нашел хороший scrpipt для получения и удаления всех индексов, но у меня проблема - я не могу удалить индексы, созданные ограничением PRIMARY KEY. (возможно, есть и другие виды индексов, которые я не могу удалить).

У меня вопрос: как изменить код ниже, чтобы удалить все индексы, кроме индексов, созданных для первичных ключей или других, которые я не могу удалить вручную.

DECLARE @indexName VARCHAR(128)
DECLARE @tableName VARCHAR(128)

DECLARE [indexes] CURSOR FOR
    SELECT  [sysindexes].[name] AS [Index], [sysobjects].[name] AS [Table]
    FROM [sysindexes]
    INNER JOIN [sysobjects] ON [sysindexes].[id] = [sysobjects].[id]    
    WHERE [sysindexes].[name] IS NOT NULL AND [sysobjects].[type] = 'U'

OPEN [indexes]

FETCH NEXT FROM [indexes] INTO @indexName, @tableName
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('DROP INDEX [' + @indexName + '] ON [' + @tableName + ']')
    FETCH NEXT FROM [indexes] INTO @indexName, @tableName
END

CLOSE [indexes]
DEALLOCATE [indexes]

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Вы можете попытаться использовать представление каталога sys.indexes вместо устаревшего sysindexes.

Это представление каталога имеет вызов столбца is_primary_key, поэтому вы сможете найти все неосновныеключевые индексы, подобные этому:

SELECT *
FROM sys.indexes
WHERE is_primary_key = 0

Вы можете легко создать свои операторы DROP INDEX из этого:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0
AND object_ID > 255     -- exclude system-level tables with object_id <= 255
AND name IS NOT NULL    -- exclude heaps with a NULL index name

Просто скопируйте и вставьте выходные данные этого оператора и выполните его - и вы должнысделано.

1 голос
/ 05 апреля 2011

На основании ответа Marc_s я нашел правильную версию скрипта:

SELECT 'DROP INDEX ' + name + ' ON ' + object_name(object_id)
FROM sys.indexes
WHERE is_primary_key = 0 AND is_unique_constraint = 0
AND OBJECTPROPERTY(object_id, 'IsMSShipped') = 0     -- exclude system-level tables
AND name IS NOT NULL

Проверка, если object_Id больше 255, недостаточна:
- нам пришлось использовать OBJECTPROPERTY (object_id, 'IsMSShipped') = 0, потому что некоторые системные таблицы, такие как queue_messages, имеют очень высокий идентификатор
- также мы должны проверить, создан ли индекс по уникальному ограничению: is_unique_constraint = 0

После этих улучшений будут удалены все индексы, созданные пользователем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...