Signatur
Beschreibung
odbc_tableprivileges() ruft über die ODBC-Schnittstelle die Berechtigungen (Privileges) ab, die für eine oder mehrere Tabellen in einer Datenbank vergeben wurden. Typische Berechtigungen sind SELECT, INSERT, UPDATE, DELETE, REFERENCES usw. Die Funktion liefert ein Ergebnis-Handle, das anschließend mit odbc_fetch_row() oder odbc_result() ausgelesen werden kann.
Die Suchparameter catalog, schema und table akzeptieren SQL-Suchmuster mit den Wildcards % (beliebig viele Zeichen) und _ (genau ein Zeichen). Ein leerer String '' schränkt die Suche auf Objekte ohne Katalog bzw. Schema ein, während % alle verfügbaren Einträge zurückliefert.
Das Ergebnis-Resultset enthält je Zeile die Spalten TABLE_CAT, TABLE_SCHEM, TABLE_NAME, GRANTOR, GRANTEE, PRIVILEGE und IS_GRANTABLE, die Auskunft darüber geben, wer welche Rechte an welcher Tabelle vergeben hat und ob der Grantee diese weiterreichen darf.
Diese Funktion ist besonders nützlich für Datenbankadministrationswerkzeuge, Sicherheits-Audits oder dynamische Anwendungen, die zur Laufzeit prüfen müssen, welche Rechte ein bestimmter Datenbankbenutzer besitzt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $odbc Pflicht | resource | Eine aktive ODBC-Verbindungsressource, wie sie von odbc_connect() oder odbc_pconnect() zurückgegeben wird. |
|
| $catalog Pflicht | string | Der Katalogname (Datenbankname). Verwende % um alle Kataloge zu durchsuchen, oder '' für Tabellen ohne Katalogzuordnung. |
|
| $schema Pflicht | string | Das Datenbankschema. Akzeptiert SQL-Suchmuster (%, _). Ein leerer String sucht nach Tabellen ohne Schemazuordnung. |
|
| $table Pflicht | string | Der Tabellenname. Akzeptiert SQL-Suchmuster (%, _). Verwende % um alle Tabellen aufzulisten. |
Rückgabewert
false zurückgegeben.Beispiele
Alle Berechtigungen für eine bestimmte Tabelle auflisten
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'geheim');
if (!$conn) {
die('Verbindung fehlgeschlagen: ' . odbc_errormsg());
}
$result = odbc_tableprivileges($conn, '%', '%', 'kunden');
if ($result === false) {
die('Fehler beim Abrufen der Berechtigungen: ' . odbc_errormsg($conn));
}
echo str_pad('Tabelle', 20) . str_pad('Grantee', 20) . str_pad('Privilege', 15) . 'Is Grantable' . PHP_EOL;
echo str_repeat('-', 70) . PHP_EOL;
while (odbc_fetch_row($result)) {
$tabelle = odbc_result($result, 'TABLE_NAME');
$grantee = odbc_result($result, 'GRANTEE');
$privilege = odbc_result($result, 'PRIVILEGE');
$grantable = odbc_result($result, 'IS_GRANTABLE');
echo str_pad($tabelle, 20)
. str_pad($grantee, 20)
. str_pad($privilege, 15)
. $grantable . PHP_EOL;
}
odbc_free_result($result);
odbc_close($conn);
Sicherheits-Audit: Alle Tabellen und Rechte eines bestimmten Benutzers prüfen
<?php
$conn = odbc_connect('MeineDSN', 'benutzer', 'geheim');
// Alle Tabellen in allen Schemata abfragen
$result = odbc_tableprivileges($conn, '%', '%', '%');
if ($result === false) {
die('Fehler: ' . odbc_errormsg($conn));
}
$zielBenutzer = 'app_user';
$rechte = [];
while (odbc_fetch_row($result)) {
$grantee = odbc_result($result, 'GRANTEE');
$tabelle = odbc_result($result, 'TABLE_NAME');
$privilege = odbc_result($result, 'PRIVILEGE');
if (strtolower($grantee) === strtolower($zielBenutzer)) {
$rechte[$tabelle][] = $privilege;
}
}
odbc_free_result($result);
echo "Berechtigungen für Benutzer '$zielBenutzer':" . PHP_EOL;
foreach ($rechte as $tabelle => $privilegien) {
echo " Tabelle: $tabelle => " . implode(', ', $privilegien) . PHP_EOL;
}
odbc_close($conn);
// Wichtig · Fallstricke
Treiber-Abhängigkeit: Das genaue Verhalten und die Verfügbarkeit der Ergebnisspalten hängen stark vom verwendeten ODBC-Treiber ab. Nicht alle Treiber unterstützen alle Spalten vollständig; insbesondere IS_GRANTABLE kann bei manchen Treibern NULL zurückliefern.
Ressourcen freigeben: Das zurückgegebene Ergebnis-Handle sollte nach der Verwendung immer mit odbc_free_result() freigegeben werden, um Speicher zu sparen – besonders bei großen Ergebnismengen oder in lang laufenden Skripten.
Wildcards: Die Parameter schema und table unterstützen SQL-Suchmuster. Wird ein leerer String '' übergeben, sucht der Treiber explizit nach Objekten ohne Katalog- bzw. Schemazuordnung – dies ist nicht dasselbe wie %.