Criando índices de cliente nativo do SQL Server

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics

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 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. Portanto, 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 precisa 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 precisa 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 da pColumnID precisa 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 nos 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, conforme mostrado a seguir.

ID da propriedade Descrição
DBPROP_INDEX_AUTOUPDATE L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_CLUSTERED L/G: 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 L/G: Leitura/gravação

Padrão: 0

Descrição: especifica o percentual de uma página de índice usada para armazenamento. Para obter mais informações, confira 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 L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLCOLLATION L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_NULLS L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_PRIMARYKEY L/G: Leitura/gravação

Padrão: Descrição de VARIANT_FALSE: 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 L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TEMPINDEX L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_TYPE L/G: Leitura/gravação

Padrão: Nenhum

Descrição: o provedor OLE DB do SQL Server Native Client não dá suporte a essa propriedade. As tentativas de definir a propriedade em CreateIndex geram um valor retornado DB_S_ERRORSOCCURRED. O membro dwStatus da estrutura de propriedade indica DBPROPSTATUS_BADVALUE.
DBPROP_INDEX_UNIQUE L/G: 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 de maneira exclusiva na tabela.

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

No conjunto de propriedades específicas do provedor DBPROPSET_SQLSERVERINDEX, o provedor OLE DB do SQL Server Native Client define a seguinte propriedade 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 essa 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

Tabelas e índices