Der gemmer sig mange informationer i DB2-kataloget og de er ikke allesammen
placeret de mest logiske steder. F.eks. ville det da være logisk,
at tabellerne SYSPACKDEP og SYSPLANDEP indeholdt informationer om, hvordan
DB2-tabellerne i den pågældende package eller plan blev brugt.
Bliver der foretaget INSERT, SELECT, UPDATE eller DELETE på tabellerne?
Men nej, det er ikke i disse tabeller, vi skal søge den information.
Faktisk gemmes informationen i SYSTABAUTH for alle statisk bindede planer
og packages. Følgende SQL-kald vil danne en såkaldt CRUD-matrice
for packagen MINPACK i collection MINCOLL:
SELECT TCREATOR AS CREATOR
, TTNAME AS TABLE
, MAX(INSERTAUTH) AS CREATE
, MAX(SELECTAUTH) AS READ
, MAX(UPDATEAUTH) AS UPDATE
, MAX(DELETEAUTH) AS DELETE
FROM SYSIBM.SYSTABAUTH
WHERE COLLID = 'MINCOLL'
AND GRANTEE =
'MINPACK'
AND GRANTEETYPE
= 'P'
GROUP BY TCREATOR, TTNAME
Dette SQL-kald går ret kvikt, da der er index på GRANTEE (efterfulgt
af en masse andre kolonner). Hvis man benytter versionerede packages, så
skal man medtage kolonnen CONTOKEN i SQL-kaldet for at identificere en
bestemt version. Og så er en join med SYSPACKAGE lige for. Hvis man
hører til den gammeldags type og bruger planer med DBRM'er i stedet
for packages, så skal man sætte COLLID = '' og erstatte MINPACK
med plan-navnet.
Nu er det jo faktisk ret let at lave en CRUD-matrice for en tabel i
stedet for en package eller plan. Følgende SQL-kald finder samtlige
packages, der benytter tabellen MINTABEL med creator MIT:
SELECT COLLID AS COLLECTION
, GRANTEE AS PACKAGE
, MAX(INSERTAUTH) AS CREATE
, MAX(SELECTAUTH) AS READ
, MAX(UPDATEAUTH) AS UPDATE
, MAX(DELETEAUTH) AS DELETE
FROM SYSIBM.SYSTABAUTH
WHERE TCREATOR = 'MIT'
AND TTNAME =
'MINTABEL'
AND GRANTEETYPE
= 'P'
AND COLLID ^=
'' GROUP BY COLLID, GRANTEE
Dette SQL-kald går knapt så kvikt (med mindre der er lagt et
ekstra index på SYSTABAUTH med enten TCREATOR eller TTNAME som første
kolonne i indexet). Versionerede packages skal håndteres som før
og for planer med DBRM'er skal man igen sætte COLLID = '' og erstatte
GRANTEE AS PACKAGE med GRANTEE AS PLAN. Hvis man ønsker at forespørge
på en bestemt værdi af CREATE, READ, UPDATE eller DELETE tilføjes
HAVING MAX(xxxxxxAUTH) ^= '' efter GROUP BY delen, hvor xxxxxx erstattes
med INSERT, SELECT, UPDATE eller DELETE.
Til sidst skal det bemærkes, at hvis man benytter planer med DBRM'er
og der er mange af disse i hver plan, så bliver man ikke specielt
godt hjulpet af ovenstående SQL-kald. Her findes der ingen god hjælp
i DB2-katalogerne.