SQL Server Native Client 인덱스 만들기
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)
SQL Server Native Client OLE DB 공급자는 IIndexDefinition::CreateIndex 함수를 노출하여 소비자가 SQL Server 테이블에 새 인덱스를 정의할 수 있도록 합니다.
SQL Server Native Client OLE DB 공급자는 테이블 인덱스를 인덱스 또는 제약 조건으로 만듭니다. SQL Server는 테이블 소유자, 데이터베이스 소유자 및 특정 관리 역할의 멤버에게 제약 조건 생성 권한을 부여합니다. 기본적으로 테이블 소유자만 테이블에 인덱스 만들기를 수행할 수 있습니다. 따라서 CreateIndex의 성공 또는 실패는 애플리케이션 사용자의 액세스 권한뿐만 아니라 생성된 인덱스 유형에 따라 달라집니다.
소비자는 pTableID 매개 변수에서 uName 공용 구조체의 pwszName 멤버에서 테이블 이름을 유니코드 문자열로 지정합니다. pTableID의 eKind 멤버는 DBKIND_NAME 합니다.
pIndexID 매개 변수는 NULL일 수 있으며, NULL인 경우 SQL Server Native Client OLE DB 공급자는 인덱스에 대한 고유한 이름을 만듭니다. 소비자는 ppIndexID 매개 변수에서 DBID에 대한 유효한 포인터를 지정하여 인덱스의 이름을 캡처할 수 있습니다.
소비자는 pIndexID 매개 변수의 uName 공용 구조체의 pwszName 멤버에서 인덱스 이름을 유니코드 문자열로 지정할 수 있습니다. pIndexID의 eKind 멤버는 DBKIND_NAME 합니다.
소비자는 인덱스에 참여하는 열을 이름으로 지정합니다. CreateIndex에 사용된 각 DBINDEXCOLUMNDESC 구조에 대해 pColumnID의 eKind 멤버는 DBKIND_NAME이어야 합니다. 열의 이름은 pColumnID에 있는 uName 공용 구조체의 pwszName 멤버에서 유니코드 문자열로 지정됩니다.
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: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_CLUSTERED | R/W: 읽기/쓰기 Default: VARIANT_FALSE 설명: 인덱스 클러스터링을 제어합니다. VARIANT_TRUE: SQL Server Native Client OLE DB 공급자가 SQL Server 테이블에 클러스터형 인덱스를 만들려고 시도합니다. SQL Server는 모든 테이블에서 클러스터형 인덱스를 하나 이상 지원합니다. VARIANT_FALSE: SQL Server Native Client OLE DB 공급자가 SQL Server 테이블에 비클러스터형 인덱스를 만들려고 시도합니다. |
DBPROP_INDEX_FILLFACTOR | R/W: 읽기/쓰기 Default: 0 설명: 스토리지에 사용되는 인덱스 페이지의 백분율을 지정합니다. 자세한 내용은 CREATE INDEX를 참조하세요. 변형의 형식이 VT_I4. 값은 1 이상 100 이하여야 합니다. |
DBPROP_INDEX_INITIALIZE | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_NULLCOLLATION | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_NULLS | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_PRIMARYKEY | R/W: 읽기/쓰기 기본값: VARIANT_FALSE 설명: 참조 무결성, PRIMARY KEY 제약 조건으로 인덱스 만들기 VARIANT_TRUE: 테이블의 PRIMARY KEY 제약 조건을 지원하기 위해 인덱스가 생성됩니다. 열은 Null이 아니어야 합니다. VARIANT_FALSE: 인덱스가 테이블의 행 값에 대한 PRIMARY KEY 제약 조건으로 사용되지 않습니다. |
DBPROP_INDEX_SORTBOOKMARKS | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_TEMPINDEX | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_TYPE | R/W: 읽기/쓰기 기본값: None 설명: SQL Server Native Client OLE DB 공급자는 이 속성을 지원하지 않습니다. CreateIndex에서 속성을 설정하려고 하면 DB_S_ERRORSOCCURRED 값이 반환됩니다. 속성 구조의 dwStatus 멤버는 DBPROPSTATUS_BADVALUE 나타냅니다. |
DBPROP_INDEX_UNIQUE | R/W: 읽기/쓰기 Default: VARIANT_FALSE 설명: 참여 열 또는 열에 대해 인덱스를 UNIQUE 제약 조건으로 만듭니다. VARIANT_TRUE: 인덱스를 사용하여 테이블의 행 값을 고유하게 제한합니다. VARIANT_FALSE: 인덱스는 행 값을 고유하게 제한하지 않습니다. |
공급자별 속성 집합 DBPROPSET_SQLSERVERINDEX SQL Server Native Client OLE DB 공급자는 다음 데이터 원본 정보 속성을 정의합니다.
속성 ID | 설명 |
---|---|
SSPROP_INDEX_XML | 형식: VT_BOOL(R/W) Default: 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);
}