MainframeSupports
tip uge 43/2013:

Forleden fik jeg en henvendelse fra en læser, der havde problemer med at oprette en DB2 tabel på grund af manglende autorisation. Mange steder er det DBA arbejde at oprette tabeller og index, men en gang i mellem kan det værer rart lige at oprette en tabel til eget brug. Og så er det, at problemer med manglende autorisationer begynder.

Hvis du skriver et simpelt CREATE TABLE statement, hvor du kun angiver tabelnavn og kolonnedefinitioner og intet andet, så vil DB2 pr. default oprette tabellen i databasen DSNDB04. Hvis det allerede her går galt med autorisationer, så har du brug for at udføre følgende SQL statement:

select char(name,8) dbname, char(stgroup,8) stogroup, bpool
from sysibm.sysdatabase
where name in
( select name from sysibm.sysdbauth
  where createtabauth <> ' ' and grantee = 'PUBLIC'
);

Som vil returnere navnene på de databaser, alle har adgang til at oprette tabeller i. Du vælger nu et af navnene på listen og tilføjer IN <dbname> til dit CREATE TABLE statement og prøver igen. Hvis det fortsat giver autorisationsproblemer, så skyldes det, at du ikke har adgang til at bruge den stogroup (storage group) eller den bpool (bufferpool), som ovenstående SQL statement har returneret sammen med databasenavnet. Det nemmeste er at prøve med et nyt database-navn i den IN, du tilføjede. Hvis de allesammen svigter, eller ovenstående SQL statement ikke returnerede nogen databaser, så er du nødt til enten at finde et eksisterende tablespace at oprette tabellen i, eller oprette et tablespace, som du kan oprette din tabel i. Nu har du brug for at udføre følgende SQL statement:

select char(qualifier,8) dbname, char(name,8) name, obtype
from sysibm.sysresauth
where grantee = 'PUBLIC' and obtype in ('B','S','R')
;
Eksempel på resultat:
QUALIFIER NAME     OBTYPE
---------+--------+------
          BP0      B
          BP1      B
          SYSDEFLT S
DSNDB04   SYSDEFLT R
DSQDBDEF  DSQTSDEF R

Sammen med SQL statementet har jeg vist et eksempel på, hvad det kan returnere. Kolonnen OBTYPE fortæller, hvad kolonnerne NAME og QUALIFIER indeholder. Hvis OBTYPE er B, så er NAME navnet på en bufferpool alle kan benytte. Hvis OBTYPE er S, så er NAME en storage group alle kan benytte. Hvis OBTYPE er R, så er QUALIFIER og NAME tilsammen et tablespace alle kan oprette tabeller i.

Det nemmeste er at oprette tabellen i et tablespace, som returneres af det sidst angivne SQL statement. Du retter din IN <dbname> til IN <dbname>.<name> og prøver igen. Det bør virke, men det kan være, at tablespacet kun kan indeholde netop een tabel, og så må du prøve en af de andre tablespaces på listen, hvis der ellers er nogen.

Du kan også vælge at oprette dit eget tablespace til tabellen. Det gør du med CREATE TABLESPACE <tsname> IN <dbname> USING STOGROUP <stogroup> SEGSIZE 64 BUFFERPOOL <bpool>; hvor du selv vælger <tsname>. Dit <dbname> skal være et af databasenavnene fra det første SQL statement i tippet. <stogroup> skal være en storage group, du har adgang til i følge det andet SQL statement i tippet og det samme gælder for <bpool>. Hvis der ikke er både en storage group og en bufferpool, alle har adgang til, så kan du umiddelbart ikke oprette dit eget tablespace. Så må du kontakte den mest venlige DBA, du kender og bede om hjælp. Parameteren SEGSIZE 64 gør, at dit tablespace kan indholde mange tabeller. Hvis du udelader denne parameter, så kan dit tablespace kun indeholde een tabel. Hvis det lykkes for dig, at oprette dit eget tablespace, så skal du rette IN <dbname> på din CREATE TABLE til IN <dbname>.<tsname> fra dit CREATE TABLESPACE statement.

Forrige danske tip        Last tip in english        Tip oversigten