다음을 통해 공유


sqlsrv_field_metadata

PHP 드라이버 다운로드

준비된 문의 필드에 대한 메타데이터를 검색합니다. 문 준비에 대한 자세한 내용은 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을 사용하여 데이터 열을 분류할 때 순위를 정의할 수 있습니다.

예를 들어 사용자가 NONELOW를 각각 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}

참고 항목

SQLSRV 드라이버 API 참조

상수(Microsoft Drivers for PHP for SQL Server)

설명서의 코드 예제 정보