Erstellen von SQL Server-Indizes
Der SQL Server Native Client OLE DB-Anbieter macht die IIndexDefinition::CreateIndex -Funktion verfügbar und ermöglicht es Consumern, neue Indizes für SQL Server-Tabellen zu erstellen.
Die Tabellenindizes werden vom SQL Server Native Client OLE DB-Anbieter entweder als Indizes oder als Einschränkungen erstellt. SQL Server gewährt dem Tabellenbesitzer, dem Datenbankbesitzer und Mitgliedern bestimmter administrativer Rollen Privilegien zum Erstellen von Einschränkungen. Standardmäßig kann nur der Tabellenbesitzer einen Index für eine Tabelle erstellen. Aus diesem Grund hängt es nicht nur von den Zugriffsrechten des Anwendungsbenutzers, sondern auch von der Art des erstellten Indexes ab, ob CreateIndex erfolgreich verläuft oder fehlschlägt.
Consumer geben den Tabellennamen als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pTableID-Parameters ein. Das eKind-Element von pTableID muss DBKIND_NAME sein.
Der pIndexID-Parameter kann NULL sein. In diesem Fall erstellt der SQL Server Native Client OLE DB-Anbieter einen eindeutigen Namen für den Index. Der Consumer kann den Namen des Indexes aufzeichnen, indem er einen gültigen Zeiger auf eine DBID im ppIndexID-Parameter angibt.
Der Consumer kann den Indexnamen als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pIndexID-Parameters eingeben. Das eKind -Element von pIndexID muss DBKIND_NAME sein.
Der Consumer gibt die Spalte oder die Spalten an, die namentlich in den Index einbezogen werden. Für jede DBINDEXCOLUMNDESC-Struktur, die in CreateIndex verwendet wird, muss das eKind-Element der pColumnID DBKIND_NAME sein. Der Name der Spalte wird als Unicode-Zeichenfolge in das pwszName -Element der uName-Vereinigung des pColumnID-Parameters eingegeben.
Der SQL Server Native Client OLE Datenbank-Anbieter und SQL Server unterstützen die aufsteigende Reihenfolge von Werten im Index. Der SQL Server Native Client OLE DB-Anbieter gibt E_INVALIDARG zurück, wenn der Consumer in einer DBINDEXCOLUMNDESC-Spalte DBINDEX_COL_ORDER_DESC angibt.
CreateIndex interpretiert Indexeigenschaften wie folgt.
Eigenschafts-ID |
Beschreibung |
---|---|
DBPROP_INDEX_AUTOUPDATE |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_CLUSTERED |
R/W: Lesen/Schreiben Standard: VARIANT_FALSE Beschreibung: Steuert die Indexgruppierung. VARIANT_TRUE: Der SQL Server Native Client OLE Datenbank-Anbieter versucht, einen gruppierten Index für die SQL Server-Tabelle zu erstellen. SQL Server unterstützt nur einen gruppierten Index pro Tabelle. VARIANT_FALSE: Der SQL Server Native Client OLE Datenbank-Anbieter versucht, einen nicht gruppierten Index für die SQL Server-Tabelle zu erstellen. |
DBPROP_INDEX_FILLFACTOR |
R/W: Lesen/Schreiben Standard: 0 Beschreibung: Gibt den Prozentsatz einer für Speicher verwendeten Indexseite an. Weitere Informationen finden Sie unter CREATE INDEX. Der Typ der Variante ist VT_I4. Der Wert muss größer als oder gleich 1 und kleiner als oder gleich 100 sein. |
DBPROP_INDEX_INITIALIZE |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_NULLCOLLATION |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_NULLS |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_PRIMARYKEY |
R/W: Lesen/Schreiben Standard: VARIANT_FALSE Beschreibung: Erstellt den Index als PRIMARY KEY-Einschränkung mit referenzieller Integrität. VARIANT_TRUE: Der Index wird erstellt, um die PRIMARY KEY-Einschränkung der Tabelle zu unterstützen. Die Spalten dürfen keine NULL-Werte zulassen. VARIANT_FALSE: Der Index wird nicht als PRIMARY KEY-Einschränkung für Zeilenwerte in der Tabelle verwendet. |
DBPROP_INDEX_SORTBOOKMARKS |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_TEMPINDEX |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_TYPE |
R/W: Lesen/Schreiben Standardwert: keiner Beschreibung: Der SQL Server Native Client OLE DB-Anbieter unterstützt diese Eigenschaft nicht. Versuche, diese Eigenschaft in CreateIndex festzulegen, verursachen einen DB_S_ERRORSOCCURRED-Rückgabewert. Das dwStatus-Element der Eigenschaftsstruktur gibt DBPROPSTATUS_BADVALUE an. |
DBPROP_INDEX_UNIQUE |
R/W: Lesen/Schreiben Standard: VARIANT_FALSE Beschreibung: Erstellt den Index als UNIQUE-Einschränkung für die einbezogene(n) Spalte oder Spalten. VARIANT_TRUE: Der Index wird verwendet, um Zeilenwerte in der Tabelle eindeutig einzuschränken. VARIANT_FALSE: Der Index schränkt Zeilenwerte nicht eindeutig ein. |
Im anbieterspezifischen Eigenschaftensatz DBPROPSET_SQLSERVERINDEX definiert der SQL Server Native Client OLE DB-Anbieter die folgende Eigenschaft für Datenquelleninformationen.
Eigenschafts-ID |
Beschreibung |
---|---|
SSPROP_INDEX_XML |
Typ: VT_BOOL (R/W) Standard: VARIANT_FALSE Beschreibung: Wenn diese Eigenschaft mit dem Wert VARIANT_TRUE mit IIndexDefinition::CreateIndex angegeben wird, wird ein primärer XML-Index erstellt, der der zu indizierenden Spalte entspricht. Wenn diese Eigenschaft VARIANT_TRUE ist, sollte cIndexColumnDescs 1 sein; andernfalls tritt ein Fehler auf. |
In diesem Beispiel wird ein Primärschlüsselindex erstellt:
// 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);
}