Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
ODBC sürücüsü indirme
Genel Bakış
SQL Server ve Azure SQL Server, hassas verileri yönetmek için veritabanı sütunlarına, istemci uygulamasının veri koruma ilkelerine uygun olarak farklı türlerdeki hassas verileri (sistem durumu, finansal vb.) işlemesini sağlayan duyarlılık meta verileri sağlama olanağı sağladı.
Sütunlara sınıflandırma atama hakkında daha fazla bilgi için bkz. SQL Veri Bulma ve Sınıflandırma.
Microsoft ODBC Sürücüsü 17.2 veya üzeri, SQL_CA_SS_DATA_CLASSIFICATION alan tanımlayıcısı kullanılarak SQLGetDescField aracılığıyla bu meta verilerin alınmasına izin verir.
Biçim
SQLGetDescField aşağıdaki söz dizimine sahiptir:
SQLRETURN SQLGetDescField(
SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber,
SQLSMALLINT FieldIdentifier,
SQLPOINTER ValuePtr,
SQLINTEGER BufferLength,
SQLINTEGER * StringLengthPtr);
DescriptorHandle
[Giriş] IRD (Uygulama Satırı Tanımlayıcısı) tanıtıcısı. SQL_ATTR_IMP_ROW_DESC deyimi özniteliğiyle SQLGetStmtAttr çağrısıyla alınabilir
RecNumber
[Giriş] 0
FieldIdentifier
[Giriş] SQL_CA_SS_DATA_CLASSIFICATION
Valueptr
[Çıkış] Çıkış arabelleği
BufferLength
[Giriş] Bayt cinsinden çıkış arabelleğinin uzunluğu
StringLengthPtr [Output] ValuePtr ile döndürülebilecek toplam bayt sayısını döndüren arabelleğe ilişkin işaretçi.
Uyarı
Arabellek boyutu bilinmiyorsa, VALUEPtr ile SQLGetDescField null olarak çağrılarak ve StringLengthPtr değeri incelenerek belirlenebilir.
Veri Sınıflandırma bilgileri kullanılamıyorsa Geçersiz Tanımlayıcı Alanı hatası döndürülür.
SQLGetDescField'a yapılan başarılı bir çağrı sonrasında ValuePtr tarafından işaret edilen arabellek aşağıdaki verileri içerir:
nn nn [n sensitivitylabels] tt tt [t informationtypes] cc cc [c columnsensitivitys]
Uyarı
nn nn, tt ttve cc cc , en düşük adreste en az önemli bayt ile depolanan çok baytlı tamsayılardır.
sensitivitylabel ve informationtype ikisi de şu formdadır.
nn [n bytes name] ii [i bytes id]
columnsensitivity şeklindedir
nn nn [n sensitivityprops]
Her sütun (c) için n 4 bayt sensitivityprops vardır:
ss ss tt tt
s - dizine sensitivitylabels içinde dizinleme, etiketlenmemişse FF FF
t - informationtypes dizisine indexleme, etiketlenmemişse FF FF
Verilerin biçimi aşağıdaki sahte yapılar olarak ifade edilebilir:
struct IDnamePair {
BYTE nameLen;
USHORT name[nameLen];
BYTE idLen;
USHORT id[idLen];
};
struct SensitivityProp {
USHORT labelIdx;
USHORT infoTypeIdx;
};
USHORT nLabels;
struct IDnamePair labels[nLabels];
USHORT nInfoTypes;
struct IDnamePair infotypes[nInfoTypes];
USHORT nColumns;
struct {
USHORT nProps;
struct SensitivityProp[nProps];
} columnClassification[nColumns];
Kod örneği
Veri Sınıflandırması meta verilerinin nasıl okunduğunu gösteren test uygulaması. Windows'ta bir bağlantı dizesi ve bir SQL sorgusu (sınıflandırılmış sütunları döndüren) kullanılarak cl /MD dataclassification.c /I (directory of msodbcsql.h) /link odbc32.lib derlenebilir ve parametre olarak çalıştırılabilir:
#ifdef _WIN32
#include <windows.h>
#endif
#include <sql.h>
#include <sqlext.h>
#include <msodbcsql.h>
#include <stdio.h>
SQLHANDLE env, dbc, stmt;
void checkRC_exit(SQLRETURN rc, SQLHANDLE hand, SQLSMALLINT htype, int retcode, char *action)
{
if ((rc == SQL_ERROR || rc == SQL_SUCCESS_WITH_INFO) && hand)
{
char msg[1024], state[6];
int i = 0;
SQLRETURN rc2;
SQLINTEGER err;
SQLSMALLINT lenout;
while ((rc2 = SQLGetDiagRec(htype, hand, ++i, state, &err, msg, sizeof(msg), &lenout)) == SQL_SUCCESS ||
rc2 == SQL_SUCCESS_WITH_INFO)
printf("%d (%d)[%s]%s\n", i, err, state, msg);
}
if (rc == SQL_ERROR && retcode)
{
printf("Error occurred%s%s\n", action ? " upon " : "", action ? action : "");
exit(retcode);
}
}
void printLabelInfo(char *type, char **pptr)
{
char *ptr = *pptr;
unsigned short nlabels;
printf("----- %s(%u) -----\n", type, nlabels = *(unsigned short*)ptr);
ptr += sizeof(unsigned short);
while (nlabels--)
{
int namelen, idlen;
char *nameptr, *idptr;
namelen = *ptr++;
nameptr = ptr;
ptr += namelen * 2;
idlen = *ptr++;
idptr = ptr;
ptr += idlen * 2;
wprintf(L"Name: \"%.*s\" Id: \"%.*s\"\n", namelen, nameptr, idlen, idptr);
}
*pptr = ptr;
}
int main(int argc, char **argv)
{
unsigned char *dcbuf;
unsigned int dclen = 0;
SQLRETURN rc;
SQLHANDLE ird;
if (argc < 3)
{
fprintf(stderr, "usage: dataclassification connstr query\n");
return 1;
}
checkRC_exit(SQLAllocHandle(SQL_HANDLE_ENV, 0, &env), 0, 0,
2, "allocate environment");
checkRC_exit(SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0), env, SQL_HANDLE_ENV,
3, "set ODBC version");
checkRC_exit(SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc), env, SQL_HANDLE_ENV,
4, "allocate connection");
checkRC_exit(SQLDriverConnect(dbc, 0, argv[1], SQL_NTS, 0, 0, 0, SQL_DRIVER_NOPROMPT), dbc, SQL_HANDLE_DBC,
5, "connect to server");
checkRC_exit(SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt), dbc, SQL_HANDLE_DBC,
6, "allocate statement");
checkRC_exit(SQLExecDirect(stmt, argv[2], SQL_NTS), stmt, SQL_HANDLE_STMT,
7, "execute query");
checkRC_exit(SQLGetStmtAttr(stmt, SQL_ATTR_IMP_ROW_DESC, (SQLPOINTER)&ird, SQL_IS_POINTER, 0), stmt, SQL_HANDLE_STMT,
8, "get IRD handle");
rc = SQLGetDescFieldW(ird, 0, SQL_CA_SS_DATA_CLASSIFICATION, dcbuf, 0, &dclen);
checkRC_exit(rc, ird, SQL_HANDLE_DESC, 0, 0);
SQLINTEGER dclenout;
unsigned char *dcptr;
unsigned short ncols;
printf("Data Classification information (%u bytes):\n", dclen);
if (!(dcbuf = malloc(dclen)))
{
printf("Memory Allocation Error");
return 9;
}
checkRC_exit(SQLGetDescFieldW(ird, 0, SQL_CA_SS_DATA_CLASSIFICATION, dcbuf, dclen, &dclenout),
ird, SQL_HANDLE_DESC, 10, "reading SQL_CA_SS_DATA_CLASSIFICATION");
dcptr = dcbuf;
printLabelInfo("Labels", &dcptr);
printLabelInfo("Information Types", &dcptr);
printf("----- Column Sensitivities(%u) -----\n", ncols = *(unsigned short*)dcptr);
dcptr += sizeof(unsigned short);
while (ncols--)
{
unsigned short nprops = *(unsigned short*)dcptr;
dcptr += sizeof(unsigned short);
while (nprops--)
{
unsigned short labelidx, typeidx;
labelidx = *(unsigned short*)dcptr; dcptr += sizeof(unsigned short);
typeidx = *(unsigned short*)dcptr; dcptr += sizeof(unsigned short);
printf(labelidx == 0xFFFF ? "(none) " : "%u ", labelidx);
printf(typeidx == 0xFFFF ? "(none)\n" : "%u\n", typeidx);
}
printf("-----\n");
}
if (dcptr != dcbuf + dclen)
{
printf("Error: unexpected parse of DATACLASSIFICATION data\n");
return 11;
}
free(dcbuf);
return 0;
}
Desteklenen Sürüm
Microsoft ODBC Sürücüsü 17.2, SQLGetDescField aracılığıyla Veri Sınıflandırma bilgilerinin alınmasına, FieldIdentifierSQL_CA_SS_DATA_CLASSIFICATION olarak ayarlandığında (1237) izin verir.
Microsoft ODBC Sürücüsü 17.4.1.1'den başlayarak, (1238) alan tanımlayıcısını SQLGetDescField kullanarak bir sunucu SQL_CA_SS_DATA_CLASSIFICATION_VERSION tarafından desteklenen Veri Sınıflandırması sürümünü almak mümkündür. 17.4.1.1 sürümünde desteklenen veri sınıflandırma sürümü "2" olarak ayarlanır.
17.4.2.1 sürümünden başlayarak, veri sınıflandırmasının varsayılan sürümü "1" olarak ayarlanır ve sürücünün sql Server'a desteklediği şekilde rapor verdiği sürümdür. Yeni bir bağlantı özniteliği SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400), uygulamanın desteklenen Veri Sınıflandırması sürümünü "1" olan desteklenen en yüksek sürüme değiştirmesine izin verebilir.
Örnek:
Sürümü ayarlamak için bu çağrı SQLConnect veya SQLDriverConnect çağrısından hemen önce yapılmalıdır:
ret = SQLSetConnectAttr(dbc, SQL_COPT_SS_DATACLASSIFICATION_VERSION, (SQLPOINTER)2, SQL_IS_INTEGER);
Veri Sınıflandırması'nın şu anda desteklenen sürümünün değeri SQLGetConnectAttr çağrısı aracılığıyla alınabilir:
ret = SQLGetConnectAttr(dbc, SQL_COPT_SS_DATACLASSIFICATION_VERSION, (SQLPOINTER)&dataClassVersion, SQL_IS_INTEGER, 0);