SQL Server インデックスの作成
SQL Server Native Client OLE DB プロバイダーは、コンシューマーが SQL Server テーブルに新しいインデックスを定義できる、IIndexDefinition::CreateIndex 関数を公開します。
SQL Server Native Client OLE DB プロバイダーでは、テーブル インデックスがインデックスまたは制約として作成されます。 SQL Server では、制約を作成する権限がテーブルの所有者、データベースの所有者、および特定の管理ロールのメンバーに許可されます。 テーブルにインデックスを作成できるのは、既定では、テーブルの所有者だけです。 したがって、CreateIndex が成功するか失敗するかは、アプリケーション ユーザーのアクセス権だけでなく、作成するインデックスの種類によっても異なります。
テーブル名は、pTableID パラメーターの uName 共用体の pwszName メンバーに Unicode 文字列で指定します。 pTableID の eKind メンバーを DBKIND_NAME にする必要があります。
pIndexID パラメーターには NULL を指定できます。NULL を指定すると、SQL Server Native Client OLE DB プロバイダーにより、インデックスの一意な名前が作成されます。 pIndexID パラメーターに DBID への有効なポインターを指定することで、インデックスの名前をキャプチャできます。
インデックス名は、pIndexID パラメーターの uName 共用体の pwszName メンバーに Unicode 文字列で指定できます。 pIndexID の eKind メンバーを DBKIND_NAME にする必要があります。
コンシューマーは、インデックスに参加する列または複数の列を名前で指定します。 CreateIndex で使用する DBINDEXCOLUMNDESC 構造体ごとに、pColumnID の eKind メンバーを DBKIND_NAME にする必要があります。 列の名前は、pColumnID の uName 共用体の pwszName メンバーに Unicode 文字列で指定します。
SQL Server Native Client OLE DB プロバイダーと SQL Server では、インデックス内の値には昇順の並べ替えがサポートされます。 コンシューマーがいずれかの DBINDEXCOLUMNDESC 構造体に DBINDEX_COL_ORDER_DESC を指定すると、SQL Server Native Client OLE DB プロバイダーから E_INVALIDARG が返されます。
CreateIndex では、インデックスのプロパティが次のように解釈されます。
プロパティ ID |
説明 |
---|---|
DBPROP_INDEX_AUTOUPDATE |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_CLUSTERED |
R/W: 読み取り/書き込み 既定値 : VARIANT_FALSE 説明 : インデックスのクラスター化を制御します。 VARIANT_TRUE: SQL Server Native Client OLE DB プロバイダーにより、SQL Server テーブルにクラスター化インデックスが作成されます。 SQL Server では、どのテーブルでもクラスター化インデックスは 1 つしかサポートされません。 VARIANT_FALSE: SQL Server Native Client OLE DB プロバイダーにより、SQL Server テーブルに非クラスター化インデックスが作成されます。 |
DBPROP_INDEX_FILLFACTOR |
R/W: 読み取り/書き込み 既定値 : 0 説明 : インデックス ページの格納に使用する割合を指定します。 詳細については、「CREATE INDEX」を参照してください。 バリアントの型は VT_I4 です。 値は 1 ~ 100 にする必要があります。 |
DBPROP_INDEX_INITIALIZE |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_NULLCOLLATION |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_NULLS |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_PRIMARYKEY |
R/W: 読み取り/書き込み 既定値 : VARIANT_FALSE VARIANT_TRUE: インデックスは、テーブルの PRIMARY KEY 制約をサポートするために作成されます。 列には NULL 値を許容しないでください。 VARIANT_FALSE: インデックスは、テーブル内の行値の PRIMARY KEY 制約としては使用されません。 |
DBPROP_INDEX_SORTBOOKMARKS |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_TEMPINDEX |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_TYPE |
R/W: 読み取り/書き込み 既定値 : なし 説明 : SQL Server Native Client OLE DB プロバイダーでは、このプロパティはサポートされません。 CreateIndex でこのプロパティの設定を試みると、戻り値として DB_S_ERRORSOCCURRED が返されます。 プロパティ構造体の dwStatus メンバーには、DBPROPSTATUS_BADVALUE が示されます。 |
DBPROP_INDEX_UNIQUE |
R/W: 読み取り/書き込み 既定値 : VARIANT_FALSE 説明 : インデックスに参加する列または複数の列に、UNIQUE 制約としてインデックスを作成します。 VARIANT_TRUE: インデックスを使用して、テーブル内の行値を一意に制約します。 VARIANT_FALSE: インデックスでは、行値が一意に制約されません。 |
プロバイダー固有のプロパティ セット DBPROPSET_SQLSERVERINDEX には、SQL Server Native Client OLE DB プロバイダーにより、次のデータ ソース情報のプロパティが定義されます。
プロパティ ID |
説明 |
---|---|
SSPROP_INDEX_XML |
型 : VT_BOOL (R/W) 既定値 : VARIANT_FALSE 説明 : IIndexDefinition::CreateIndex のときに、このプロパティの値に VARIANT_TRUE を指定すると、インデックス対象の列に対応するプライマリ XML インデックスが作成されます。 このプロパティが VARIANT_TRUE の場合、cIndexColumnDescs を 1 にする必要があります。それ以外の値を指定するとエラーが発生します。 |
次の例では、主キー インデックスを作成します。
// 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);
}