sqlsrv_field_metadata
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