Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
ODBC-illesztőprogram letöltése
Áttekintés
A bizalmas adatok kezeléséhez az SQL Server és az Azure SQL Server lehetővé tette az adatbázisoszlopok bizalmassági metaadatokkal való biztosítását, amelyek lehetővé teszik, hogy az ügyfélalkalmazás az adatvédelmi szabályzatokkal összhangban kezelje a bizalmas adatok különböző típusait (például az állapotot, a pénzügyi adatokat stb.).
A besorolás oszlopokhoz való hozzárendelésével kapcsolatos további információkért tekintse meg az SQL Data Discovery és a Besorolás című témakört.
A Microsoft ODBC Driver 17.2 vagy újabb verziója lehetővé teszi a metaadatok lekérését az SQLGetDescFielden keresztül a SQL_CA_SS_DATA_CLASSIFICATION mezőazonosító használatával.
Formátum
Az SQLGetDescField szintaxisa a következő:
SQLRETURN SQLGetDescField(
SQLHDESC DescriptorHandle,
SQLSMALLINT RecNumber,
SQLSMALLINT FieldIdentifier,
SQLPOINTER ValuePtr,
SQLINTEGER BufferLength,
SQLINTEGER * StringLengthPtr);
DescriptorHandle
[Bemenet] IRD (Implementációs sorleíró) hivatkozás. Az SQLGetStmtAttr hívásával lekérhető SQL_ATTR_IMP_ROW_DESC utasításattribútummal
RecNumber
[Bemenet] 0
FieldIdentifier
[Bemenet] SQL_CA_SS_DATA_CLASSIFICATION
ValuePtr
[Kimenet] Kimeneti puffer
BufferLength
[Bemenet] A kimeneti puffer hossza bájtban
StringLengthPtr [Kimenet] Mutató arra a pufferre, amelyben a ValuePtrben visszaadható bájtok teljes számát adja vissza.
Megjegyzés:
Ha a puffer mérete ismeretlen, az SQLGetDescField és a ValuePtr null értékű meghívásával és a StringLengthPtr értékének vizsgálatával határozható meg.
Ha az adatbesorolási információk nem érhetők el, a rendszer érvénytelen leírómező-hibát ad vissza.
Az SQLGetDescField sikeres hívása esetén a ValuePtr által mutatott puffer a következő adatokat tartalmazza:
nn nn [n sensitivitylabels] tt tt [t informationtypes] cc cc [c columnsensitivitys]
Megjegyzés:
nn nn, tt ttés cc cc többbájtos egész számok, amelyek a legkisebb jelentős bájttal vannak tárolva a legalacsonyabb címen.
sensitivitylabel és informationtype mindkettő azonos formájú
nn [n bytes name] ii [i bytes id]
columnsensitivity olyan formájú, hogy
nn nn [n sensitivityprops]
Minden oszlopnál (c)n 4 bájt sensitivityprops jelen van:
ss ss tt tt
s – indexelés a sensitivitylabels tömbbe, FF FF ha nincs címkézve
t – indexelés a informationtypes tömbbe, FF FF ha nincs címkézve
Az adatok formátuma a következő pszeudostruktúrák formájában fejezhető ki:
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];
Kódrészlet
Az adatbesorolási metaadatok olvasását bemutató tesztalkalmazás. A Windows rendszeren a cl /MD dataclassification.c /I (directory of msodbcsql.h) /link odbc32.lib segítségével le lehet fordítani, majd egy kapcsolati sztringgel és egy SQL-lekérdezéssel (amely klasszifikált oszlopokat ad vissza) paraméterként futtatható.
#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;
}
Támogatott verzió
A Microsoft ODBC Driver 17.2 lehetővé teszi az adatbesorolási információk lekérését a SQLGetDescField használatával, amennyiben a FieldIdentifier értéke SQL_CA_SS_DATA_CLASSIFICATION (1237).
A Microsoft ODBC Driver 17.4.1.1-es verziójától kezdve a kiszolgáló SQLGetDescField által támogatott adatbesorolás verzióját a (1238) mezőazonosító használatával SQL_CA_SS_DATA_CLASSIFICATION_VERSION lehet lekérni. A 17.4.1.1-es verzióban a támogatott adatbesorolási verzió értéke "2".
A 17.4.2.1-től kezdődően az adatbesorolás alapértelmezett verziója "1", és ez az a verzió, amelyet az illesztőprogram támogatottnak jelent az SQL Server felé. Egy új kapcsolatattribútum SQL_COPT_SS_DATACLASSIFICATION_VERSION (1400) lehetővé teszi, hogy az alkalmazás az adatbesorolás támogatott verzióját az "1"-ről a maximális támogatottra módosítsa.
Példa:
A verzió beállításához ezt a hívást közvetlenül az SQLConnect vagy az SQLDriverConnect hívása előtt kell kezdeményezni:
ret = SQLSetConnectAttr(dbc, SQL_COPT_SS_DATACLASSIFICATION_VERSION, (SQLPOINTER)2, SQL_IS_INTEGER);
Az adatbesorolás jelenleg támogatott verziójának értéke SQLGetConnectAttr-hívással kérhető le:
ret = SQLGetConnectAttr(dbc, SQL_COPT_SS_DATACLASSIFICATION_VERSION, (SQLPOINTER)&dataClassVersion, SQL_IS_INTEGER, 0);