다음을 통해 공유


sqlsrv_field_metadata

PHP 드라이버 다운로드

준비된 문의 필드에 대한 메타데이터를 검색합니다. 문 준비에 대한 자세한 내용은 sqlsrv_query 또는 sqlsrv_prepare 참조하세요. 준비된 문, 실행 전 또는 사후 문에서 sqlsrv_field_metadata 호출할 수 있습니다.

구문

  
sqlsrv_field_metadata( resource $stmt)  

매개 변수

$stmt: 필드 메타데이터를 찾은 문 리소스입니다.

Return Value

배열 또는 false의 배열입니다. 배열은 결과 집합의 각 필드에 대해 하나의 배열로 구성됩니다. 각 하위 배열에는 아래 표에 설명된 대로 키가 있습니다. 필드 메타데이터 를 검색하는 동안 오류가 발생하면 false 가 반환됩니다.

설명
이름 필드가 해당하는 열의 이름입니다.
Type SQL 형식에 해당하는 숫자 값입니다.
크기 문자 형식 필드(char(n), varchar(n), nchar(n), nvarchar(n), XML)의 문자 수입니다. 이진 형식(binary(n), varbinary(n), UDT) 필드의 바이트 수입니다. 다른 SQL Server 데이터 형식에 대한 NULL 입니다.
전체 자릿수 가변 정밀도 형식의 전체 자릿수(실수, 숫자, 소수점, datetime2, datetimeoffset 및 시간)입니다. 다른 SQL Server 데이터 형식에 대한 NULL 입니다.
확장 변수 눈금 형식(숫자, 10진수, datetime2, datetimeoffset 및 시간)의 배율입니다. 다른 SQL Server 데이터 형식에 대한 NULL 입니다.
Nullable 열이 null 허용(SQLSRV_NULLABLE_YES),열이 null 허용(SQLSRV_NULLABLE_NO)이 아니거나 열이 null 허용(SQLSRV_NULLABLE_UNKNOWN)인지 여부를 나타내는 열거형 값입니다.

다음 표에서는 각 하위 배열의 키에 대한 자세한 정보를 제공합니다(이러한 형식에 대한 자세한 내용은 SQL Server 설명서 참조).

SQL Server 2008 데이터 형식 Type 최소/최대 정밀도 최소/최대 배율 크기
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
date SQL_TYPE_DATE(91) 10/10 0/0
날짜/시간 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) 1GB
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
시간 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은 최대 크기가 허용됨을 나타냅니다.

Nullable 키는 예 또는 아니요일 수 있습니다.

예시

다음 예제에서는 문 리소스를 만든 다음 필드 메타데이터를 검색하고 표시합니다. 이 예시에서는 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 된 배열이 있는 경우 민감도 데이터 분류 메타데이터로 채워집니다.

Patients 테이블을 예로 들어 보겠습니다.

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을 사용하여 데이터 열을 분류할 때 순위를 정의할 수 있습니다.

예를 들어 사용자가 BirthDate 및 LOW SSN을 각각 할당 NONE 하는 경우 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=CRITICAL 경우 RANK=NONE분류 메타데이터는 다음과 같습니다.

  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)

설명서의 코드 예시 정보