Aracılığıyla paylaş


Veri Sınıflandırma

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