Every GRANT and REVOKE that DB2 for z/OS records lands in catalog tables. Authorization catalog tables answer “who can SELECT this table?”, “who has SYSADM?”, and “who can EXECUTE that procedure?” This page covers SYSROUTINEAUTH, SYSCOLAUTH, SYSTABAUTH, SYSDBAUTH, SYSRESAUTH, and SYSUSERAUTH—the privilege tables IBM lists as holding ID privileges for routines, columns, tables, databases, resources, and system authorities.
Authorization tables are not a single “ACL” blob. Each family stores privileges for one kind of object. A row names a GRANTOR, a GRANTEE, and the object, then uses one CHAR(1) column per privilege.
| Value | Meaning |
|---|---|
| (blank) | Privilege not held on this row |
| Y | Privilege held |
| G | Privilege held WITH GRANT OPTION |
Administrative authorities such as SYSADM imply many object privileges without a matching SYSTABAUTH row for every table. A catalog query that only reads SYSTABAUTH under-reports what SYSADM can do. Conversely, an access control authorization exit can hide or add access that the catalog does not show. IBM’s Application Programming Guide states that when such an exit is installed, catalog queries are not a reliable list of tables you can access.
Table and view privileges. TCREATOR and TTNAME identify the object (note the double T: TTNAME, not TBNAME). This is the table IBM uses in the example “which tables can I access?”
| Column | Privilege |
|---|---|
| SELECTAUTH | SELECT on the table or view |
| INSERTAUTH | INSERT |
| UPDATEAUTH | UPDATE (all columns unless restricted via SYSCOLAUTH) |
| DELETEAUTH | DELETE |
| ALTERAUTH | ALTER |
| INDEXAUTH | INDEX (create index) |
| REFERENCESAUTH | REFERENCES (when present on your release’s SYSTABAUTH) |
| TRIGGERAUTH | TRIGGER (when present on your release’s SYSTABAUTH) |
1234567891011121314-- Tables this session user or PUBLIC can access (IBM-style example) SELECT DISTINCT TCREATOR, TTNAME FROM SYSIBM.SYSTABAUTH WHERE GRANTEE IN (USER, 'PUBLIC', 'PUBLIC*') AND GRANTEETYPE = ' ' WITH UR; -- Who can UPDATE HR.EMPLOYEE? SELECT GRANTOR, GRANTEE, GRANTEETYPE, UPDATEAUTH, SELECTAUTH FROM SYSIBM.SYSTABAUTH WHERE TCREATOR = 'HR' AND TTNAME = 'EMPLOYEE' AND UPDATEAUTH IN ('Y', 'G') WITH UR;
GRANT SELECT ON TABLE HR.EMPLOYEE TO REPORT1 inserts or updates a SYSTABAUTH row. REVOKE removes or clears the flag. Views have their own rows; SELECT on a view does not always mean SELECT on every base table (view definer privileges also matter).
IBM describes SYSCOLAUTH as recording privileges for updating columns. Table-level UPDATEAUTH = Y on SYSTABAUTH means all columns (unless column grants restrict the story). Column-level GRANT UPDATE (col1, col2) produces SYSCOLAUTH rows with CREATOR, TNAME, COLNAME, and UPDATEAUTH set to Y or G.
12345SELECT GRANTEE, CREATOR, TNAME, COLNAME, UPDATEAUTH FROM SYSIBM.SYSCOLAUTH WHERE CREATOR = 'HR' AND TNAME = 'EMPLOYEE' WITH UR;
Audit both tables together. A user with no SYSTABAUTH UPDATEAUTH might still update SALARY through SYSCOLAUTH. The reverse also happens: table-level UPDATE with no SYSCOLAUTH rows.
Database privileges. NAME (or the documented database-name column for your release) identifies the database. Privilege columns use the same Y/G/blank pattern.
| Column (typical) | Meaning |
|---|---|
| DBADMAUTH | DBADM on that database |
| CREATETABAUTH | CREATE TABLE |
| CREATETSAUTH | CREATE TABLESPACE |
| DROPAUTH | DROP |
| LOADAUTH | LOAD |
| RECOVERDBAUTH | RECOVER |
| REORGAUTH | REORG |
| STATSAUTH / IMAGCOPYAUTH / STARTDBAUTH / STOPAUTH / DISPLAYDBAUTH | Utility and command privileges on the database |
1234SELECT GRANTEE, NAME, DBADMAUTH, CREATETABAUTH, LOADAUTH, RECOVERDBAUTH FROM SYSIBM.SYSDBAUTH WHERE NAME = 'HRDB' WITH UR;
DBADM on HRDB is not SYSADM. It is still powerful: many shops treat DBADM grants as production-change control items. CREATETAB without CREATETS may still succeed when Db2 implicitly creates a table space—know your DDL standards before you read the flags as a complete story of who can create objects.
Resource privileges that are not tables and not system authorities. IBM’s list: buffer pools, storage groups, collections, table spaces, JARs, and distinct types. QUALIFIER and NAME identify the resource; an object-type column (often OBTYPE or equivalent on your release) distinguishes a buffer pool from a collection.
1234SELECT GRANTEE, QUALIFIER, NAME, OBTYPE FROM SYSIBM.SYSRESAUTH WHERE GRANTEE = 'HRBIND' WITH UR;
If a BIND fails with an authorization SQLCODE on a collection, SYSRESAUTH is the first catalog stop—before you assume SYSPACKAUTH is wrong.
System authorities and subsystem-level privileges. One row per grantee that holds any of these. This is where SYSADM lives in the catalog.
| Column | Authority / privilege |
|---|---|
| SYSADMAUTH | SYSADM system administrator authority |
| SYSCTRLAUTH | SYSCTRL system controller authority |
| SYSOPRAUTH | SYSOPR system operator authority |
| BINDADDAUTH | BINDADD — create new plans/packages |
| CREATEDBAAUTH | CREATEDBA |
| CREATEDBCAUTH | CREATEDBC |
| DISPLAYAUTH | DISPLAY |
| MONITOR1AUTH / MONITOR2AUTH | Monitor class privileges |
| SQLADMAUTH / DATAACCESSAUTH / ACCESSCTRLAUTH | Separable install-style authorities on modern releases |
123456SELECT GRANTEE, SYSADMAUTH, SYSCTRLAUTH, SYSOPRAUTH, BINDADDAUTH, SQLADMAUTH, DATAACCESSAUTH, ACCESSCTRLAUTH FROM SYSIBM.SYSUSERAUTH WHERE SYSADMAUTH IN ('Y', 'G') OR SYSCTRLAUTH IN ('Y', 'G') WITH UR;
Keep SYSADM grants tiny. SYSCTRL cannot do everything SYSADM can on user data; IBM documents those gaps (for example SYSCTRL versus user tables). DATAACCESS and ACCESSCTRL exist so shops can split “read all data” from “grant all privileges” without handing out SYSADM. Your exact column list depends on catalog level—DESCRIBE SYSIBM.SYSUSERAUTH or query SYSCOLUMNS when you write a reusable audit script.
Privileges on user-defined functions and stored procedures. EXECUTE is the privilege application IDs need for CALL and function invocation. SCHEMA, SPECIFICNAME (and NAME) identify the routine; match them to SYSROUTINES. GRANT EXECUTE ON PROCEDURE writes here, not to SYSTABAUTH.
1234SELECT GRANTEE, SCHEMA, SPECIFICNAME, EXECUTEAUTH FROM SYSIBM.SYSROUTINEAUTH WHERE SCHEMA = 'HR' WITH UR;
Functions used in views and constraints create extra authorization questions: the definer must be allowed to execute the function. Routine grants are easy to forget in schema-copy checklists.
When a user says “I cannot SELECT,” walk the catalog in this order:
Package EXECUTE is SYSPACKAUTH (previous page). Sequence USAGE is SYSSEQUENCEAUTH. Schema CREATEIN / ALTERIN / DROPIN is SYSSCHEMAAUTH. Trusted contexts use SYSCONTEXT tables. Know the family; do not force everything into SYSTABAUTH.
Authorization tables are permission stickers. SYSTABAUTH is a sticker on a toy box (table): “you may look inside” (SELECT) or “you may put toys in” (INSERT). SYSCOLAUTH is a sticker on one toy only. SYSDBAUTH is a sticker on the whole classroom. SYSRESAUTH is a sticker on special furniture (buffer pools, collections). SYSUSERAUTH is a principal badge that says “this person may do almost everything.” SYSROUTINEAUTH is a sticker on a kitchen machine (procedure). Y means you may; G means you may and you may give stickers to friends; blank means this sticker is not for that action.
1. What does SELECTAUTH = 'G' mean on SYSTABAUTH?
2. Which catalog table records system authorities such as SYSADM?
3. SYSCOLAUTH is primarily for:
4. GRANTEETYPE = blank versus 'L' typically means:
5. Why might a catalog GRANT query disagree with actual table access?