Oto przykładowy kod SQL upuszczania i odtwarzając indeks bezpiecznie:
IF(select object_id from sys.indexes where [name] = 'IDX_RecordSubscription' and object_id = OBJECT_ID('[SystemSetup].[RecordSubscription]')) IS NOT NULL
BEGIN
DROP INDEX [SystemSetup].[RecordSubscription].IDX_RecordSubscription
END
GO
CREATE UNIQUE INDEX
IDX_RecordSubscription
ON
[SystemSetup].[RecordSubscription]
(
Subscriber ASC,
MenuItem ASC,
RecordPrimaryKeyGuid ASC
)
WITH
(
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF
) ON [PRIMARY]
GO
Oto kod C#, że pompy to uwagę:
protected override string GetCreateIndexScript(string uniquePart, string indexName, string fullTableName, string columnsPart)
{
return
$"IF(select object_id from sys.indexes where [name] = '{indexName}' and object_id = OBJECT_ID('{fullTableName}')) IS NOT NULL \r\n" +
"BEGIN \r\n" +
$" DROP INDEX {fullTableName}.{indexName} \r\n " +
"END\r\n\r\n" +
"GO\r\n\r\n" +
$"CREATE {uniquePart} INDEX\r\n" +
$"\t{indexName}\r\n" +
"ON\r\n" +
$"\t{fullTableName}\r\n" +
"\t(\r\n" +
$"\t\t{columnsPart}\r\n" +
"\t)\r\n" +
"\tWITH\r\n" +
"\t(\r\n" +
"\t\tPAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF\r\n" +
"\t) ON [PRIMARY] ";
}
Oto niektóre C# (które mogą być konwertowane do SQL), aby uzyskać schemat index:
const string selectStatement = "select " +
" SCHEMAs.name + '.' + tabs.name as OBJECT_ID, " +
" ind.name as INDEX_NAME, " +
" indcol.index_id AS INDEX_ID, " +
" indcol.key_ordinal AS COLUMN_ORDINAL, " +
" col.name AS COLUMN_NAME, " +
" ind.is_unique " +
"from " +
" sys.indexes ind " +
"inner join " +
" sys.index_columns indcol " +
"on " +
" ind.object_id = indcol.object_id and " +
" ind.index_id = indcol.index_id " +
"inner join " +
" sys.columns col " +
"on " +
" col.object_id = indcol.object_id and " +
" col.column_id = indcol.column_id " +
"inner join " +
" sys.tables tabs " +
"on " +
" tabs.object_id = ind.object_id " +
"inner join " +
" sys.schemas schemas " +
"on " +
" tabs.schema_id = schemas.schema_id " +
"where " +
" ind.type =2 and" +
" tabs.name <> 'sysdiagrams' " +
"order by " +
" tabs.object_id, " +
" indcol.index_id, " +
" indcol.key_ordinal ";
return DatabaseAdapter.Fill(selectStatement, null, null, null);
Zasadniczo, wykonujesz tutaj ostatni fragment kodu, przeglądasz wyniki (indeksy i kolumny) i wywołujesz GetCreateIndexScript dla każdego zwracanego indeksu. Następnie można bezpiecznie wykonać każdą z instrukcji, które zostały utworzone w celu upuszczenia i ponownego utworzenia indeksów.
To samo podejście można zastosować w przypadku języka TSQL lub innego języka.
Nie ma bezpośredniego sposobu na upuszczenie i ponowne utworzenie indeksów. Możesz skrypty wszystkich wymaganych indeksów przed upuszczeniem. Po zmianie typów danych można użyć tych skryptów CREATE do odtworzenia indeksów. –
Podałem przykładowy kod, jak to zrobić tutaj https://stackoverflow.com/a/46335197/1878141 –