Crear índices de SQL Server
El proveedor OLE DB de SQL Server Native Client expone la función IIndexDefinition::CreateIndex , que permite a los consumidores definir índices nuevos en las tablas de SQL Server.
El proveedor OLE DB de SQL Server Native Client crea los índices de la tabla como índices o restricciones. SQL Server da privilegio de creación de restricciones al propietario de la tabla, el propietario de la base de datos y los miembros de ciertas funciones administrativas. De forma predeterminada, sólo el propietario de la tabla puede crear un índice en una tabla. Por consiguiente, que la ejecución de CreateIndex sea correcta o no depende no sólo de los derechos de acceso del usuario de la aplicación sino también del tipo de índice creado.
Los consumidores especifican el nombre de tabla como una cadena de caracteres Unicode en el miembro pwszName de la unión uName en el parámetro pTableID. El miembro eKind de pTableID debe ser DBKIND_NAME.
El parámetro pIndexID puede ser NULL y si es así, el proveedor OLE DB de SQL Server Native Client crea un nombre único para el índice. El consumidor puede capturar el nombre del índice especificando un puntero válido a un DBID en el parámetro ppIndexID.
El consumidor puede especificar el nombre del índice como una cadena de caracteres Unicode en el miembro pwszName de la unión del uName del parámetro pIndexID. El miembro eKind de pIndexID debe ser DBKIND_NAME.
El consumidor especifica la columna o columnas que participan en el índice por nombre. Para cada estructura de DBINDEXCOLUMNDESC utilizada en CreateIndex, el miembro eKind de pColumnID debe ser DBKIND_NAME. El nombre de la columna se especifica como una cadena de caracteres Unicode en el miembro pwszName de la unión uName en pColumnID.
El proveedor OLE DB de SQL Server Native Client y SQL Server admiten el orden ascendente en los valores del índice. El proveedor OLE DB de SQL Server Native Client devuelve E_INVALIDARG si el consumidor especifica DBINDEX_COL_ORDER_DESC en cualquier estructura DBINDEXCOLUMNDESC.
CreateIndex interpreta las propiedades del índice como sigue.
Id. de propiedad |
Descripción |
---|---|
DBPROP_INDEX_AUTOUPDATE |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_CLUSTERED |
L/E: lectura/escritura Valor predeterminado: VARIANT_FALSE Descripción: controla la agrupación en clústeres de índices. VARIANT_TRUE: el proveedor OLE DB de SQL Server Native Client intenta crear un índice en clúster en la tabla SQL Server. SQL Server admite a lo sumo un índice en clúster en cualquier tabla. VARIANT_FALSE: el proveedor OLE DB de SQL Server Native Client intenta crear un índice no clúster en la tabla SQL Server. |
DBPROP_INDEX_FILLFACTOR |
L/E: lectura/escritura Valor predeterminado: 0 Descripción: especifica el porcentaje de una página de índice utilizado para el almacenamiento. Para obtener más información, vea CREATE INDEX. El tipo del variant es VT_I4. El valor debe ser mayor o igual que 1 y menor o igual que 100. |
DBPROP_INDEX_INITIALIZE |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLCOLLATION |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_NULLS |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado la devolución del valor DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_PRIMARYKEY |
L/E: lectura/escritura Valor predeterminado: VARIANT_FALSE. Descripción: crea el índice como una integridad referencial, restricción PRIMARY KEY. VARIANT_TRUE: el índice se crea para admitir la restricción PRIMARY KEY de la tabla. Las columnas no deben aceptar valores NULL. VARIANT_FALSE: el índice no se utiliza como una restricción PRIMARY KEY para los valores de fila de la tabla. |
DBPROP_INDEX_SORTBOOKMARKS |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex dan como resultado la devolución del valor DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TEMPINDEX |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex producen un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_TYPE |
L/E: lectura/escritura Valor predeterminado: ninguno Descripción: el proveedor OLE DB de SQL Server Native Client no admite esta propiedad. Los intentos de establecer la propiedad en CreateIndex producen un valor devuelto de DB_S_ERRORSOCCURRED. El miembro dwStatus de la estructura de propiedad indica DBPROPSTATUS_BADVALUE. |
DBPROP_INDEX_UNIQUE |
L/E: lectura/escritura Valor predeterminado: VARIANT_FALSE Descripción: crea el índice como una restricción UNIQUE en la columna o columnas participantes. VARIANT_TRUE: el índice se utiliza para restringir de forma única los valores de fila de la tabla. VARIANT_FALSE: el índice no restringe de forma exclusiva los valores de fila. |
En la propiedad específica del proveedor establezca DBPROPSET_SQLSERVERINDEX, el proveedor OLE DB de SQL Server Native Client define la propiedad de información de origen de datos siguiente.
Id. de propiedad |
Descripción |
---|---|
SSPROP_INDEX_XML |
Tipo: VT_BOOL (L/E) Valor predeterminado: VARIANT_FALSE Descripción: cuando esta propiedad se especifica con un valor de VARIANT_TRUE con IIndexDefinition::CreateIndex, da como resultado la creación de un índice xml primario correspondiente a la columna que se está indizando. Si esta propiedad es VARIANT_TRUE, cIndexColumnDescs debe ser 1, de lo contrario es un error. |
En este ejemplo se crea un índice de la clave principal:
// 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);
}