Partilhar via


Criando índices do SQL Server

O provedor OLE DB do SQL Server Native Client expõe a função IIndexDefinition::CreateIndex, permitindo que os consumidores definam novos índices em tabelas do SQL Server.

O provedor OLE DB do SQL Server Native Client cria índices de tabela como índices ou como restrições. O SQL Server concede privilégios para criação de restrições ao proprietário da tabela, ao proprietário do banco de dados e aos membros de determinadas funções administrativas. Por padrão, apenas o proprietário da tabela pode criar um índice em uma tabela. Por isso, o êxito ou a falha de CreateIndex depende não apenas dos direitos de acesso do usuário do aplicativo, mas também do tipo de índice criado.

Os consumidores especificam o nome da tabela como uma cadeia de caracteres Unicode no membro pwszName da união uName no parâmetro pTableID. O membro eKind de pTableID deve ser DBKIND_NAME.

O parâmetro pIndexID pode ser NULL e, se for, o provedor OLE DB do SQL Server Native Client criará um nome exclusivo para o índice. O consumidor pode capturar o nome do índice especificando um ponteiro válido para um DBID no parâmetro ppIndexID.

O consumidor pode especificar o nome do índice como uma cadeia de caracteres Unicode no membro pwszName da união uName do parâmetro pIndexID. O membro eKind de pIndexID deve ser DBKIND_NAME.

O consumidor especifica a coluna ou as colunas que participam do índice por nome. Para cada estrutura DBINDEXCOLUMNDESC usada em CreateIndex, o membro eKind do pColumnID deve ser DBKIND_NAME. O nome da coluna é especificado como uma cadeia de caracteres Unicode no membro pwszName da união uName no pColumnID.

O provedor OLE DB do SQL Server Native Client e o SQL Server dão suporte à ordem crescente de valores no índice. O provedor OLE DB do SQL Server Native Client retornará E_INVALIDARG se o consumidor especificar DBINDEX_COL_ORDER_DESC em qualquer estrutura DBINDEXCOLUMNDESC.

CreateIndex interpreta as propriedades de índice da seguinte maneira.

ID da propriedade

Descrição

DBPROP_INDEX_AUTOUPDATE

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_CLUSTERED

Leitura/gravação: leitura/gravação

Padrão: VARIANT_FALSE

Descrição: controla o clustering de índice.

VARIANT_TRUE: o provedor OLE DB do SQL Server Native Client tenta criar um índice clusterizado na tabela do SQL Server. O SQL Server oferece suporte a no máximo um índice clusterizado em qualquer tabela.

VARIANT_FALSE: o provedor OLE DB do SQL Server Native Client tenta criar um índice não clusterizado na tabela do SQL Server.

DBPROP_INDEX_FILLFACTOR

Leitura/gravação: leitura/gravação

Padrão: 0

Descrição: especifica a porcentagem de uma página de índice usada para armazenamento. Para obter mais informações, consulte CREATE INDEX.

O tipo da variante é VT_I4. O valor deve ser maior ou igual a 1 e menor ou igual a 100.

DBPROP_INDEX_INITIALIZE

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLCOLLATION

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_NULLS

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_PRIMARYKEY

Leitura/gravação: leitura/gravação

Padrão: VARIANT_FALSE Descrição: cria o índice como uma integridade referencial, restrição PRIMARY KEY.

VARIANT_TRUE: o índice é criado para dar suporte à restrição PRIMARY KEY da tabela. As colunas devem ser não nulas.

VARIANT_FALSE: o índice não é usado como uma restrição PRIMARY KEY para valores de linha na tabela.

DBPROP_INDEX_SORTBOOKMARKS

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TEMPINDEX

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_TYPE

Leitura/gravação: leitura/gravação

Padrão: nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a esta propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor de retorno DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.

DBPROP_INDEX_UNIQUE

Leitura/gravação: leitura/gravação

Padrão: VARIANT_FALSE

Descrição: cria o índice como uma restrição UNIQUE na coluna ou nas colunas participantes.

VARIANT_TRUE: o índice é usado para restringir valores de linha na tabela de forma exclusiva.

VARIANT_FALSE: o índice não restringe valores de linha de forma exclusiva.

No conjunto de propriedades específico do provedor DBPROPSET_SQLSERVERINDEX, o provedor OLE DB do SQL Server Native Client define as seguintes propriedades de informações da fonte de dados.

ID da propriedade

Descrição

SSPROP_INDEX_XML

Tipo: VT_BOOL (leitura/gravação)

Padrão: VARIANT_FALSE

Descrição: quando esta propriedade é especificada com um valor VARIANT_TRUE com IIndexDefinition::CreateIndex, ela resulta na criação de um índice xml principal correspondente à coluna que está sendo indexada. Se essa propriedade for VARIANT_TRUE, cIndexColumnDescs deverá ser 1, caso contrário, será um erro.

Este exemplo cria um índice de chave primária:

// 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);
    }

Consulte também

Conceitos

Tabelas e índices