MainframeSupports
tip uge 17/1999:

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.

Sidste uges tip        Tip oversigten