sqlsrv_field_metadata

下載 PHP 驅動程式

擷取已備妥陳述式的欄位中繼資料。 如需有關準備陳述式的詳細資訊,請參閱 sqlsrv_query 或 sqlsrv_prepare。 請注意,在執行前或執行後,均可在任何已備妥的陳述式上呼叫 sqlsrv_field_metadata。

語法

  
sqlsrv_field_metadata( resource $stmt)  

參數

$stmt:為其尋找欄位中繼資料的陳述式資源。

傳回值

陣列的 array ,或為 false。 此陣列包含結果集內各欄位的一個陣列。 每個子陣列都有如下表中所述的索引鍵。 如果擷取欄位中繼資料發生錯誤,則會傳回 false 。

Key 描述
名稱 欄位所對應的資料行名稱。
類型 對應至 SQL 類型的數值。
大小 字元類型 (char(n)、varchar(n)、nchar(n)、nvarchar(n)、XML) 之欄位的字元數目。 二進位類型 (binary(n)、varbinary(n)、UDT) 之欄位的位元組數目。 NULL 適用於其他 SQL Server 資料類型。
精確度 變數有效位數 (real、numeric、decimal、datetime2、datetimeoffset 和 time) 之類型的有效位數。 NULL 適用於其他 SQL Server 資料類型。
調整 變數小數位數 (numeric、decimal、datetime2、datetimeoffset 和 time) 之類型的小數位數。 NULL 適用於其他 SQL Server 資料類型。
Nullable 列舉的值,指出資料行可為 Null (SQLSRV_NULLABLE_YES)、資料行不可為 Null (SQLSRV_NULLABLE_NO),或不知道資料行是否可為 Null (SQLSRV_NULLABLE_UNKNOWN)。

下表提供有關每個子陣列的索引鍵的詳細資訊 (如需這些類型的詳細資訊,請參閱 SQL Server 文件):

SQL Server 2008 資料類型 類型 最小/最大的有效位數 最小/最大的小數位數 大小
Bigint SQL_BIGINT(-5) 8
二進位 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
日期時間 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
十進位 SQL_DECIMAL(3) 1/38 0/有效位數值
float SQL_FLOAT(6) 4/8
圖片 SQL_LONGVARBINARY(-4) 2 GB
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) 變數
收發簡訊 SQL_LONGVARCHAR(-1) 2 GB
time SQL_SS_TIME2(-154) 8/16 0/7
時間戳記 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 的索引鍵可為是或否。

範例

下列範例會建立陳述式資源,然後擷取並顯示欄位中繼資料。 此範例假設本機電腦上已安裝 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);
?>

敏感性資料分類中繼資料

5.8.0 版中引進新選項 DataClassification,可讓使用者使用 存取 Microsoft SQL Server 2019 中的sqlsrv_field_metadata,需要 Microsoft ODBC Driver 17.4.2 或更新版本。

根據預設,選項 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_query 而不是 sqlsrv_prepare,可以修改上述程式碼片段,像這樣:

$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 驅動程式 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}