Creazione di indici SQL Server
Il provider OLE DB di SQL Server Native Client espone la funzione IIndexDefinition::CreateIndex, consentendo ai consumer di definire nuovi indici nelle tabelle SQL Server.
Il provider OLE DB di SQL Server Native Client crea gli indici di tabella come indici o vincoli. SQL Server fornisce privilegio di creazione del vincolo al proprietario della tabella, del database e ai membri di determinati ruoli amministrativi. Per impostazione predefinita, solo il proprietario di tabella può creare un indice in una tabella. L'esito positivo o negativo di CreateIndex dipende, pertanto, non solo dai diritti di accesso dell'utente dell'applicazione ma anche dal tipo di indice creato.
I consumer specificano il nome della tabella come stringa di caratteri Unicode nel membro pwszName dell'unione uName del parametro pTableID. Il membro eKind di pTableID deve essere DBKIND_NAME.
Il parametro pIndexID può essere NULL e, se lo è, il provider OLE DB di SQL Server Native Client crea un nome univoco per l'indice. Il consumer può acquisire il nome dell'indice specificando un puntatore valido a un DBID nel parametro ppIndexID.
Il consumer può specificare il nome dell'indice come stringa di caratteri Unicode nel membro pwszName dell'unione uName del parametro pTableID. Il membro eKind di pIndexID deve essere DBKIND_NAME.
Il consumer specifica la colonna o le colonne utilizzate nell'indice in base al nome. Per ogni struttura DBINDEXCOLUMNDESC utilizzata in CreateIndex, il membro eKind di pColumnID deve essere DBKIND_NAME. Il nome della colonna viene specificato come stringa di caratteri Unicode nel membro pwszName dell'unione uName in pColumnID.
Il provider OLE DB di SQL Server Native Client e SQL Server supportano l'ordine crescente nei valori dell'indice. Il provider OLE DB di SQL Server Native Client restituisce E_INVALIDARG se il consumer specifica DBINDEX_COL_ORDER_DESC in una qualsiasi struttura DBINDEXCOLUMNDESC.
CreateIndex interpreta le proprietà di indice come segue.
ID proprietà |
Descrizione |
---|---|
DBPROP_INDEX_AUTOUPDATE |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_CLUSTERED |
L/S: Lettura/scrittura Impostazione predefinita: VARIANT_FALSE Descrizione: controlla il clustering dell'indice. VARIANT_TRUE: il provider OLE DB di SQL Server Native Client tenta di creare un indice con cluster nella tabella SQL Server. SQL Server supporta al massimo un indice con cluster su una tabella. VARIANT_FALSE: il provider OLE DB di SQL Server Native Client tenta di creare un indice non cluster nella tabella SQL Server. |
DBPROP_INDEX_FILLFACTOR |
L/S: Lettura/scrittura Impostazione predefinita: 0 Descrizione: specifica la percentuale di una pagina di indice utilizzata per l'archiviazione. Per ulteriori informazioni, vedere CREATE INDEX. Il tipo della variante è VT_I4. Deve essere maggiore o uguale a 1 e minore o uguale a 100. |
DBPROP_INDEX_INITIALIZE |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLCOLLATION |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLS |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_PRIMARYKEY |
L/S: Lettura/scrittura Impostazione predefinita: descrizione VARIANT_FALSE: crea l'indice come integrità referenziale, vincolo PRIMARY KEY. VARIANT_TRUE: l'indice viene creato per supportare il vincolo PRIMARY KEY della tabella. È necessario che le colonne non ammettano valori Null. VARIANT_FALSE: l'indice non viene utilizzato come vincolo PRIMARY KEY per i valori di riga nella tabella. |
DBPROP_INDEX_SORTBOOKMARKS |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TEMPINDEX |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TYPE |
L/S: Lettura/scrittura Impostazione predefinita: nessuna Descrizione: il provider OLE DB di SQL Server Native Client non supporta questa proprietà. I tentativi di impostare la proprietà in CreateIndex determinano un valore restituito DB_S_ERRORSOCCURRED. Il membro dwStatus della struttura di proprietà indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_UNIQUE |
L/S: Lettura/scrittura Impostazione predefinita: VARIANT_FALSE Descrizione: crea l'indice come vincolo UNIQUE nella colonna o nelle colonne utilizzate. VARIANT_TRUE: l'indice viene utilizzato per vincolare in modo univoco i valori della tabella. VARIANT_FALSE: l'indice non vincola in modo univoco i valori di riga. |
Nel set di proprietà DBPROPSET_SQLSERVERINDEX specifico del provider il provider OLE DB di SQL Server Native Client definisce la seguente proprietà delle informazioni relative all'origine dati.
ID proprietà |
Descrizione |
---|---|
SSPROP_INDEX_XML |
Tipo: VT_BOOL (L/S) Impostazione predefinita: VARIANT_FALSE Descrizione: quando questa proprietà viene specificata con un valore VARIANT_TRUE con IIndexDefinition::CreateIndex, determina la creazione di un indice xml primario corrispondente alla colonna indicizzata. Se questa proprietà è VARIANT_TRUE, cIndexColumnDescs deve essere 1, in caso contrario si tratta di un errore. |
In questo esempio viene creato un indice di chiave primaria:
// 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);
}