sqlsrv_field_metadata

Download del driver PHP

Recupera i metadati per i campi di un'istruzione preparata. Per informazioni sulla preparazione di un'istruzione, vedere sqlsrv_query o sqlsrv_prepare. Si noti che sqlsrv_field_metadata può essere chiamato in qualsiasi istruzione preparata, pre-esecuzione o post-esecuzione.

Sintassi

  
sqlsrv_field_metadata( resource $stmt)  

Parametri

$stmt: risorsa di istruzione per la quale sono richiesti i metadati del campo.

Valore restituito

Una matrice di matrici oppure false. La matrice è costituita da una singola matrice per ogni campo nel set di risultati. Ogni matrice secondaria include le chiavi elencate nella tabella seguente. Se si verifica un errore durante il recupero dei metadati del campo, viene restituito false .

Chiave Descrizione
Name Nome della colonna a cui corrisponde il campo.
Type Valore numerico che corrisponde a un tipo SQL.
Dimensione Numero di caratteri per i campi di tipo carattere (char(n), varchar(n), nchar(n), nvarchar(n), XML). Numero di byte per i campi di tipo binario (binary(n), varbinary(n), tipo definito dall'utente). NULL per altri tipi di dati di SQL Server.
Precisione Precisione per i tipi di precisione delle variabili (real, numeric, decimal, datetime2, datetimeoffset e time). NULL per altri tipi di dati di SQL Server.
Ridimensiona Scala per i tipi di scala delle variabili (numeric, decimal, datetime2, datetimeoffset e time). NULL per altri tipi di dati di SQL Server.
Nullable Valore enumerato che indica se la colonna è nullable (SQLSRV_NULLABLE_YES), non è nullable (SQLSRV_NULLABLE_NO) o non è noto se la colonna è nullable (SQLSRV_NULLABLE_UNKNOWN).

Nella tabella seguente vengono fornite altre informazioni sulle chiavi di ogni matrice secondaria (per informazioni sui tipi, vedere la documentazione di SQL Server):

Tipo di dati di SQL Server 2008 Type Precisione min/max Scala min/max Dimensione
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
data 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
decimale SQL_DECIMAL (3) 1/38 0/valore precisione
float SQL_FLOAT (6) 4/8
image 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/valore precisione
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 byte
Smallmoney SQL_DECIMAL (3) 10/10 4/4
sql_variant SQL_SS_VARIANT (-150) Variabile
Testo SQL_LONGVARCHAR (-1) 2 GB
Ora SQL_SS_TIME2 (-154) 8/16 0/7
timestamp SQL_BINARY (-2) 8 byte
tinyint SQL_TINYINT (-6) 1 byte
udt SQL_SS_UDT (-151) Variabile
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) Zero (0) indica che la dimensione massima è consentita.

La chiave nullable può essere yes o no.

Esempio

Nell'esempio seguente viene creata una risorsa di istruzione, quindi vengono recuperati e visualizzati i metadati dei campi. Nell'esempio si presuppone che SQL Server e il database AdventureWorks siano installati nel computer locale. Quando si esegue l'esempio dalla riga di comando, tutto l'output viene scritto nel browser.

<?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);
?>

Metadati di classificazione dei dati di riservatezza

Nella versione 5.8.0 è stata introdotta la nuova opzione DataClassification per consentire agli utenti di accedere ai metadati di classificazione dei dati di riservatezza in Microsoft SQL Server 2019 usando sqlsrv_field_metadata, che richiede Microsoft ODBC Driver 17.4.2 o versione successiva.

Per impostazione predefinita l'opzione DataClassification è false, ma se è impostata su true la matrice restituita da sqlsrv_field_metadata viene popolata con i metadati di classificazione dei dati di riservatezza, se esistenti.

Ad esempio prendere in considerazione una tabella Patients:

CREATE TABLE Patients 
      [PatientId] int identity,
      [SSN] char(11),
      [FirstName] nvarchar(50),
      [LastName] nvarchar(50),
      [BirthDate] date)

È possibile classificare le colonne SSN e BirthDate come illustrato di seguito:

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')

Per accedere ai metadati, chiamare sqlsrv_field_metadata come illustrato nel frammento di codice seguente:

$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']); 
        }
    }
}

L'output sarà:

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] => 
                )

        )

)

Se si usa sqlsrv_query anziché sqlsrv_prepare il frammento di codice precedente può essere modificato come nell'esempio seguente:

$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;
}

Come si può notare nella rappresentazione JSON seguente i metadati di classificazione dei dati vengono visualizzati se associati alle colonne:

{"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":""}}]}

Classificazione di riservatezza mediante un set predefinito di valori

A partire dalla versione 5.9.0, i driver PHP hanno aggiunto il recupero della classificazione quando si usa ODBC Driver 17.4.2 o versione successiva. L'utente può definire la classificazione quando si usa ADD SENSITIVITY CLASSIFICATION per classificare qualsiasi colonna di dati.

Se ad esempio l'utente assegna NONE e LOW rispettivamente a BirthDate e SSN, la rappresentazione JSON viene visualizzata come segue:

{"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}

Come illustrato nella classificazione di riservatezza, i valori numerici dei ranghi sono:

0 for NONE
10 for LOW
20 for MEDIUM
30 for HIGH
40 for CRITICAL

Di conseguenza, se invece di RANK=NONE, l'utente definisce RANK=CRITICAL quando si classifica la colonna BirthDate, i metadati di classificazione saranno:

  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)
    }
  }

La rappresentazione JSON aggiornata è illustrata di seguito:

{"0":{"Label":{"name":"Confidential Personal Data","id":""},"Information Type":{"name":"Birthdays","id":""},"rank":40},"rank":40}

Vedi anche

Riferimento all'API del driver SQLSRV

Costanti (driver Microsoft per PHP per SQL Server)

Informazioni sugli esempi di codice nella documentazione