Создание индексов SQL Server
Поставщик OLE DB собственного клиента SQL Server предоставляет функцию IIndexDefinition::CreateIndex , позволяющую потребителям определять новые индексы в таблицах SQL Server.
Поставщик OLE DB собственного клиента SQL Server создает табличные индексы в качестве индексов или ограничений. SQL Server предоставляет право создания ограничений владельцу таблицы, владельцу базы данных и членам некоторых ролей администрирования. По умолчанию только владелец таблицы может создавать в ней индекс. Таким образом, успех или сбой функции CreateIndex зависит не только от прав доступа пользователя приложения, но и от типа создаваемого индекса.
Пользователь задает имя таблицы в виде символьной строки в Юникоде в элементе pwszName объединения uName в параметре pTableID. Элемент eKind параметра pTableID должен быть равен DBKIND_NAME.
Параметр pIndexID может иметь значение NULL, и в этом случае поставщик OLE DB собственного клиента SQL Server создает для индекса уникальное имя. Потребитель может сам задать имя индекса, указав для DBID допустимый указатель в параметре ppIndexID.
Потребитель может задать имя индекса в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pIndexID. Элемент eKind параметра pIndexID должен быть равен DBKIND_NAME.
Потребитель указывает столбец или столбцы, входящие в индекс, по имени. Для каждой структуры DBINDEXCOLUMNDESC, используемой в функции CreateIndex, элемент eKind параметра pColumnID должен быть DBKIND_NAME. Имя столбца задается в виде символьной строки в Юникоде в элементе pwszName объединения uName параметра pColumnID.
Поставщик OLE DB собственного клиента SQL Server и SQL Server поддерживают возрастающий порядок значений в индексе. Поставщик OLE DB собственного клиента SQL Server возвращает значение E_INVALIDARG, если потребитель указывает значение DBINDEX_COL_ORDER_DESC в любой структуре DBINDEXCOLUMNDESC.
Функция CreateIndex интерпретирует свойства индекса следующим образом.
Cвойство |
Описание |
---|---|
DBPROP_INDEX_AUTOUPDATE |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_CLUSTERED |
Чтение-запись: чтение и запись По умолчанию: VARIANT_FALSE Описание: управляет кластеризацией индексов. VARIANT_TRUE: Поставщик OLE DB собственного клиента SQL Server пытается создать кластеризованный индекс в таблице SQL Server. SQL Server поддерживает не более одного кластеризованного индекса в любой таблице. VARIANT_FALSE: Поставщик OLE DB собственного клиента SQL Server пытается создать некластеризованный индекс в таблице SQL Server. |
DBPROP_INDEX_FILLFACTOR |
Чтение-запись: чтение и запись По умолчанию: 0 Описание: указывает процентное соотношение страниц индекса, используемых для хранения. Дополнительные сведения см. в разделе CREATE INDEX. Тип варианта — VT_I4. Значение должно находиться в диапазоне от 1 до 100. |
DBPROP_INDEX_INITIALIZE |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLCOLLATION |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLS |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_PRIMARYKEY |
Чтение-запись: чтение и запись По умолчанию: Описание VARIANT_FALSE: создает индекс в виде ссылочной целостности, ограничение PRIMARY KEY. VARIANT_TRUE: индекс создается для поддержки ограничения PRIMARY KEY таблицы. Столбцы не должны иметь значений NULL. VARIANT_FALSE: индекс не используется в качестве ограничения PRIMARY KEY для значений строк таблицы. |
DBPROP_INDEX_SORTBOOKMARKS |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TEMPINDEX |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TYPE |
Чтение-запись: чтение и запись По умолчанию: нет Описание: Поставщик OLE DB собственного клиента SQL Server не поддерживает это свойство. Попытки установить свойство в значение CreateIndex приводят к возврату значения DB_S_ERRORSOCCURRED. Элемент dwStatus структуры свойства указывает значение DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_UNIQUE |
Чтение-запись: чтение и запись По умолчанию: VARIANT_FALSE Описание: создает индекс в виде ограничения UNIQUE на определенном столбце или столбцах. VARIANT_TRUE: Индекс используется для уникального ограничения значений строк таблицы. VARIANT_FALSE: индекс не используется для уникального ограничения строк. |
В зависящем от поставщика наборе свойств DBPROPSET_SQLSERVERINDEX поставщик OLE DB собственного клиента SQL Server определяет следующее свойство сведений об источнике данных.
Cвойство |
Описание |
---|---|
SSPROP_INDEX_XML |
Тип: VT_BOOL (R/W) По умолчанию: VARIANT_FALSE Описание: Если это свойство при вызове функции IIndexDefinition::CreateIndex указывается со значением VARIANT_TRUE, создается первичный XML-индекс, соответствующий индексированному столбцу. Если это свойство имеет значение VARIANT_TRUE, параметр cIndexColumnDescs должен быть равен 1. В противном случае возникает ошибка. |
В данном примере создается индекс первичного ключа.
// This CREATE TABLE statement shows the referential integrity and // PRIMARY KEY constraint on the OrderDetails table that will be created // by the following example code.//// CREATE TABLE OrderDetails// (// OrderID int NOT NULL// ProductID int NOT NULL// CONSTRAINT PK_OrderDetails// PRIMARY KEY CLUSTERED (OrderID, ProductID),// UnitPrice money NOT NULL,// Quantity int NOT NULL,// Discount decimal(2,2) NOT NULL// DEFAULT 0// )//HRESULT CreatePrimaryKey ( IIndexDefinition* pIIndexDefinition ) { HRESULT hr = S_OK; DBID dbidTable; DBID dbidIndex; const ULONG nCols = 2; ULONG nCol; const ULONG nProps = 2; ULONG nProp; DBINDEXCOLUMNDESC dbidxcoldesc[nCols]; DBPROP dbpropIndex[nProps]; DBPROPSET dbpropset; DBID* pdbidIndexOut = NULL; // Set up identifiers for the table and index. dbidTable.eKind = DBKIND_NAME; dbidTable.uName.pwszName = L"OrderDetails"; dbidIndex.eKind = DBKIND_NAME; dbidIndex.uName.pwszName = L"PK_OrderDetails"; // Set up column identifiers. for (nCol = 0; nCol < nCols; nCol++) { dbidxcoldesc[nCol].pColumnID = new DBID; dbidxcoldesc[nCol].pColumnID->eKind = DBKIND_NAME; dbidxcoldesc[nCol].eIndexColOrder = DBINDEX_COL_ORDER_ASC; } dbidxcoldesc[0].pColumnID->uName.pwszName = L"OrderID"; dbidxcoldesc[1].pColumnID->uName.pwszName = L"ProductID"; // Set properties for the index. The index is clustered, // PRIMARY KEY. for (nProp = 0; nProp < nProps; nProp++) { dbpropIndex[nProp].dwOptions = DBPROPOPTIONS_REQUIRED; dbpropIndex[nProp].colid = DB_NULLID; VariantInit(&(dbpropIndex[nProp].vValue)); dbpropIndex[nProp].vValue.vt = VT_BOOL; } dbpropIndex[0].dwPropertyID = DBPROP_INDEX_CLUSTERED; dbpropIndex[0].vValue.boolVal = VARIANT_TRUE; dbpropIndex[1].dwPropertyID = DBPROP_INDEX_PRIMARYKEY; dbpropIndex[1].vValue.boolVal = VARIANT_TRUE; dbpropset.rgProperties = dbpropIndex; dbpropset.cProperties = nProps; dbpropset.guidPropertySet = DBPROPSET_INDEX; hr = pIIndexDefinition->CreateIndex(&dbidTable, &dbidIndex, nCols, dbidxcoldesc, 1, &dbpropset, &pdbidIndexOut); // Clean up dynamically allocated DBIDs. for (nCol = 0; nCol < nCols; nCol++) { delete dbidxcoldesc[nCol].pColumnID; } return (hr); }