sqlsrv_field_metadata
준비된 문의 필드에 대한 메타데이터를 검색합니다. 문 준비에 대한 자세한 내용은 sqlsrv_query 또는 sqlsrv_prepare를 참조하세요. 실행 전 또는 후에 준비된 문에서 sqlsrv_field_metadata를 호출할 수 있습니다.
구문
sqlsrv_field_metadata( resource $stmt)
매개 변수
$stmt: 필드 메타데이터를 찾은 문 리소스입니다.
반환 값
배열의 array 또는 false입니다. 배열은 결과 집합의 각 필드에 대한 하나의 배열로 구성됩니다. 각 하위 배열에는 아래 표에 설명된 키가 있습니다. 필드 메타데이터 검색 중 오류가 발생하면 false 가 반환됩니다.
키 | Description |
---|---|
이름 | 필드에 해당하는 열의 이름입니다. |
형식 | SQL 형식에 해당하는 숫자 값입니다. |
크기 | 문자 형식 필드(char(n), varchar(n), nchar(n), nvarchar(n), XML)의 문자 수입니다. 이진 형식 필드(binary(n), varbinary(n), UDT)의 바이트 수입니다. 기타 SQL Server 데이터 형식의 경우NULL 입니다. |
전체 자릿수 | 가변 전체 자릿수 형식(real, numeric, decimal, datetime2, datetimeoffset, time)의 전체 자릿수입니다. 기타 SQL Server 데이터 형식의 경우NULL 입니다. |
확장 | 가변 소수 자릿수 형식(numeric, decimal, datetime2, datetimeoffset, time)의 소수 자릿수입니다. 기타 SQL Server 데이터 형식의 경우NULL 입니다. |
Nullable | 열이 Null을 허용하는지(SQLSRV_NULLABLE_YES), 열이 Null을 허용하지 않는지(SQLSRV_NULLABLE_NO) 또는 열이 null 허용 여부를 알 수 없는지(SQLSRV_NULLABLE_UNKNOWN) 여부를 나타내는 열거형 값입니다. |
다음 표에서는 각 하위 배열 키에 대한 자세한 내용을 제공합니다. 이러한 형식에 대한 자세한 내용은 SQL Server 설명서를 참조하세요.
SQL Server 2008 데이터 형식 | 형식 | 최소/최대 전체 자릿수 | 최소/최대 소수 자릿수 | 크기 |
---|---|---|---|---|
bigint | SQL_BIGINT(-5) | 8 | ||
binary | SQL_BINARY (-2) | 0 <n< 8000 1 | ||
bit | SQL_BIT(-7) | |||
char | SQL_CHAR(1) | 0 <n< 8000 1 | ||
날짜 | SQL_TYPE_DATE(91) | 10/10 | 0/0 | |
Datetime | SQL_TYPE_TIMESTAMP(93) | 23/23 | 3/3 | |
datetime2 | SQL_TYPE_TIMESTAMP(93) | 19/27 | 0/7 | |
datetimeoffset | SQL_SS_TIMESTAMPOFFSET(-155) | 26/34 | 0/7 | |
decimal | SQL_DECIMAL(3) | 1/38 | 0/전체 자릿수 값 | |
float | SQL_FLOAT(6) | 4/8 | ||
이미지 | SQL_LONGVARBINARY(-4) | 2GB | ||
int | SQL_INTEGER(4) | |||
money | SQL_DECIMAL(3) | 19/19 | 4/4 | |
nchar | SQL_WCHAR(-8) | 0 <n< 4000 1 | ||
ntext | SQL_WLONGVARCHAR(-10) | 1 GB | ||
numeric | SQL_NUMERIC(2) | 1/38 | 0/전체 자릿수 값 | |
nvarchar | SQL_WVARCHAR(-9) | 0 <n< 4000 1 | ||
real | SQL_REAL(7) | 4/4 | ||
smalldatetime | SQL_TYPE_TIMESTAMP(93) | 16/16 | 0/0 | |
smallint | SQL_SMALLINT(5) | 2바이트 | ||
Smallmoney | SQL_DECIMAL(3) | 10/10 | 4/4 | |
sql_variant | SQL_SS_VARIANT(-150) | 변수 | ||
text | SQL_LONGVARCHAR(-1) | 2GB | ||
time | SQL_SS_TIME2(-154) | 8/16 | 0/7 | |
timestamp | SQL_BINARY (-2) | 8바이트 | ||
tinyint | SQL_TINYINT(-6) | 1바이트 | ||
udt | SQL_SS_UDT(-151) | 변수 | ||
uniqueidentifier | SQL_GUID(-11) | 16 | ||
varbinary | SQL_VARBINARY(-3) | 0 <n< 8000 1 | ||
varchar | SQL_VARCHAR(12) | 0 <n< 8000 1 | ||
Xml | SQL_SS_XML(-152) | 0 |
(1) 0은 최대 크기가 허용됨을 나타냅니다.
Null을 허용하는 키는 yes 또는 no입니다.
예제
다음 예제에서는 문 리소스를 만든 다음 필드 메타데이터를 검색 및 표시합니다. 이 예제에서는 SQL Server 및 AdventureWorks 데이터베이스가 로컬 컴퓨터에 설치된 것으로 가정합니다. 모든 출력은 명령줄에서 예제가 실행될 때 콘솔에 기록됩니다.
<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array("Database"=>"AdventureWorks");
$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false) {
echo "Could not connect.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Prepare the statement. */
$tsql = "SELECT ReviewerName, Comments FROM Production.ProductReview";
$stmt = sqlsrv_prepare( $conn, $tsql);
/* Get and display field metadata. */
foreach( sqlsrv_field_metadata( $stmt) as $fieldMetadata) {
foreach( $fieldMetadata as $name => $value) {
echo "$name: $value\n";
}
echo "\n";
}
/* Note: sqlsrv_field_metadata can be called on any statement
resource, pre- or post-execution. */
/* Free statement and connection resources. */
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
민감도 데이터 분류 메타데이터
사용자가 sqlsrv_field_metadata
를 사용하여(Microsoft ODBC Driver 17.4.2 이상이 필요함) Microsoft SQL Server 2019에서 민감도 데이터 분류 메타데이터에 액세스할 수 있도록 새 옵션인 DataClassification
이 버전 5.8.0에 도입되었습니다.
기본적으로 DataClassification
이라는 옵션은 false
이지만 true
로 설정하면 sqlsrv_field_metadata
에서 반환하는 배열이 민감도 데이터 분류 메타데이터(있는 경우)로 채워집니다.
환자 테이블을 예로 들어 보겠습니다.
CREATE TABLE Patients
[PatientId] int identity,
[SSN] char(11),
[FirstName] nvarchar(50),
[LastName] nvarchar(50),
[BirthDate] date)
다음과 같이 SSN 및 BirthDate 열로 분류할 수 있습니다.
ADD SENSITIVITY CLASSIFICATION TO [Patients].SSN WITH (LABEL = 'Highly Confidential - secure privacy', INFORMATION_TYPE = 'Credentials')
ADD SENSITIVITY CLASSIFICATION TO [Patients].BirthDate WITH (LABEL = 'Confidential Personal Data', INFORMATION_TYPE = 'Birthdays')
메타데이터에 액세스하려면 아래 코드 조각에 표시된 것처럼 sqlsrv_field_metadata
를 호출합니다.
$tableName = 'Patients';
$tsql = "SELECT * FROM $tableName";
$stmt = sqlsrv_prepare($conn, $tsql, array(), array('DataClassification' => true));
if (sqlsrv_execute($stmt)) {
$fieldmeta = sqlsrv_field_metadata($stmt);
foreach ($fieldmeta as $f) {
if (count($f['Data Classification']) > 0) {
echo $f['Name'] . ": \n";
print_r($f['Data Classification']);
}
}
}
다음과 같이 출력됩니다.
SSN:
Array
(
[0] => Array
(
[Label] => Array
(
[name] => Highly Confidential - secure privacy
[id] =>
)
[Information Type] => Array
(
[name] => Credentials
[id] =>
)
)
)
BirthDate:
Array
(
[0] => Array
(
[Label] => Array
(
[name] => Confidential Personal Data
[id] =>
)
[Information Type] => Array
(
[name] => Birthdays
[id] =>
)
)
)
sqlsrv_prepare
대신 sqlsrv_query
를 사용 중인 경우 위 코드 조각을 다음과 같이 수정할 수 있습니다.
$tableName = 'Patients';
$tsql = "SELECT * FROM $tableName";
$stmt = sqlsrv_query($conn, $tsql, array(), array('DataClassification' => true));
$fieldmeta = sqlsrv_field_metadata($stmt);
foreach ($fieldmeta as $f) {
$jstr = json_encode($f);
echo $jstr . PHP_EOL;
}
아래 JSON 표현에서 볼 수 있듯이 데이터 분류 메타데이터는 열과 연결된 경우 다음과 같이 표시 됩니다.
{"Name":"PatientId","Type":4,"Size":null,"Precision":10,"Scale":null,"Nullable":0,"Data Classification":[]}
{"Name":"SSN","Type":1,"Size":11,"Precision":null,"Scale":null,"Nullable":1,"Data Classification":[{"Label":{"name":"Highly Confidential - secure privacy","id":""},"Information Type":{"name":"Credentials","id":""}}]}
{"Name":"FirstName","Type":-9,"Size":50,"Precision":null,"Scale":null,"Nullable":1,"Data Classification":[]}
{"Name":"LastName","Type":-9,"Size":50,"Precision":null,"Scale":null,"Nullable":1,"Data Classification":[]}
{"Name":"BirthDate","Type":91,"Size":null,"Precision":10,"Scale":0,"Nullable":1,"Data Classification":[{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""}}]}
미리 정의된 값 집합을 사용하는 민감도 순위
5\.9.0부터 PHP 드라이버는 ODBC Driver 17.4.2 이상을 사용할 때 분류 순위 검색을 추가했습니다. 사용자는 ADD SENSITIVITY CLASSIFICATION을 사용하여 데이터 열을 분류할 때 순위를 정의할 수 있습니다.
예를 들어 사용자가 NONE
및 LOW
를 각각 BirthDate 및 SSN에 할당하면 JSON 표현은 다음과 같습니다.
{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":0},"rank":0}
{"0":{"Label":{"name":"Highly Confidential - secure privacy","id":""},"Information Type":{"name":"Credentials","id":""},"rank":10},"rank":10}
민감도 분류에 표시된 것과 같이 순위의 숫자 값은 다음과 같습니다.
0 for NONE
10 for LOW
20 for MEDIUM
30 for HIGH
40 for CRITICAL
따라서 사용자가 BirthDate 열을 분류할 때 RANK=NONE
대신 RANK=CRITICAL
을 정의하면 분류 메타데이터는 다음과 같습니다.
array(7) {
["Name"]=>
string(9) "BirthDate"
["Type"]=>
int(91)
["Size"]=>
NULL
["Precision"]=>
int(10)
["Scale"]=>
int(0)
["Nullable"]=>
int(1)
["Data Classification"]=>
array(2) {
[0]=>
array(3) {
["Label"]=>
array(2) {
["name"]=>
string(26) "Confidential Personal Data"
["id"]=>
string(0) ""
}
["Information Type"]=>
array(2) {
["name"]=>
string(9) "Birthdays"
["id"]=>
string(0) ""
}
["rank"]=>
int(40)
}
["rank"]=>
int(40)
}
}
업데이트된 JSON 표현은 다음과 같습니다.
{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":40},"rank":40}