Delphi - Adattáblák és tulajdonosaik az Oracle adatbázisában

forráskód letöltése
Az Oracle szerver egyetlen nagy adatbázist képvisel, melynek táblái felhasználókhoz kötötten vannak eltárolva. Ebben a példában megnézzük, hogy miként kérdezhetjük le a rendszerben található adattáblák, valamint tulajdonosaik neveit.
A felhasználói adatokhoz csak akkor férhetünk hozzá, ha megfelelő jogosultságokkal rendelkezünk.
Az Oracle szerveren a SYSTEM Tablespace alatt számos adattábla található, amely a rendszer paramétereiről tartalmaz információkat.
A felhasználók nevét és főbb jellemzőit a SYS.USER$ tábla tartalmazza. Az Oracle adatbázis minden egyes objektumáról – legyen az kulcs, index, tábla, stb. – információt találunk a SYS.OBJ$ táblában.
A SYS.USER$ táblából 2 mezőre van szükségünk, ezek a következők:
Mező Jelentése
NAME A felhasználó neve.
USER# A felhasználó egyedi azonosítója.
A SYS.OBJ$ táblából 3 mezőre van szükségünk.
Mező Jelentése
NAME Az objektum neve.
OWNER# Az objektum tulajdonosa. Ez alapján kapcsolatot létesíthetünk a SYS.USER$ tábla USER# mezőjével.
TYPE# Meghatározza az objektum típusát. Adattáblák esetében ennek a mezőnek az értéke 2.
Az Oracle szerverhez egy TADOConnection objektum segítségével kapcsolódunk. A kapcsolatot futási időben hozzuk létre, a megadott adatbázis, felhasználónév és jelszó függvényében.
ADOConnection1.ConnectionString:='Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID='+
  Edit2.Text+';'+'Data Source='+Edit1.Text;
A kapcsolódáshoz szükséges felhasználónevet és jelszót az ADOConnection1 objektum OnWillConnect eseményében adjuk meg. A LoginPrompt property értékét ne felejtsük el hamisra állítani.
A táblák adatainak lekérdezéséhez egy összetett SELECT parancsra van szükség, amelyet egy ADOQuery objektum segítségével futtatunk.
SELECT sys.user$.name, sys.obj$.name FROM sys.user$, sys.obj$
WHERE sys.user$.user#=sys.obj$.owner#
  AND sys.obj$.type#=2
ORDER BY sys.user$.name, sys.obj$.name
A lekérdezés eredményét egy DBGrid objektum jeleníti meg, melynek oszlopait futási időben kötjük hozzá az adatforráshoz.
DBGrid1.Columns[0].FieldName:=ADOQuery1.Fields[0].FieldName;
DBGrid1.Columns[1].FieldName:=ADOQuery1.Fields[1].FieldName;