Search code examples
db2db2-zos

How to give grant select on full database to user in DB2 z/OS


I want to grant select rights on all the tables in database to particular user in db2 z/OS or mainframe. I know with following query, we can grant select on table to user by running with ibmuser.

GRANT SELECT ON <TableName> TO <UserName>

However I have tried the same by using Db2 z/OS stored procedure in ibmuser:

CREATE PROCEDURE GRANT_SELECT_ON_DB(
IN DatabaseName   varchar(255),
IN UserName    varchar(255))
   LANGUAGE SQL
   BEGIN
      DECLARE v_NAME VARCHAR(64);
      DECLARE v_CREATOR VARCHAR(64);
      DECLARE v_GrantQuery VARCHAR(320);
      DECLARE c1 CURSOR FOR
      (SELECT NAME,CREATOR FROM SYSIBM.SYSTABLES tabs WHERE  upper(dBname)=upper(DatabaseName));
      OPEN c1;
      fetch_loop:
      LOOP
        FETCH c1 INTO v_NAME,v_CREATOR ;
       SET v_GrantQuery = 'grant select on '|| v_CREATOR ||'.'|| v_NAME ||' to  '|| UserName;
       EXECUTE IMMEDIATE v_GrantQuery;
      END LOOP fetch_loop;
      CLOSE c1;
END%

On calling of stored procedure, it get stuck in loading and not producing any results or error. call IBMUSER.GRANT_SELECT_ON_DB('<DatabaseName>','<UserName>')%

Also GRANT SELECT ON <DatabaseName> TO <UserName> is not working as it is not supported in DB2 z/OS. Please suggest. May be I am missing some basics.


Solution

  • You can try below procedure, it worked for me:

        CREATE PROCEDURE GRANT_SELECT_ON_DB(IN DatabaseName   varchar(255),
        IN UserName    varchar(255))
        LANGUAGE SQL
        MODIFIES SQL DATA
        BEGIN
            DECLARE v_NAME VARCHAR(400);
            DECLARE v_CREATOR VARCHAR(400);
            DECLARE v_GrantQuery VARCHAR(1000);
            FOR v1 AS
            c1 CURSOR FOR
            SELECT NAME,CREATOR FROM SYSIBM.SYSTABLES tabs WHERE  upper(dBname)=upper(DatabaseName)
            DO
                SET v_NAME = NAME;
                SET v_CREATOR = CREATOR;
                SET v_GrantQuery = 'grant select on '|| v_CREATOR ||'.'|| v_NAME ||' to  '|| UserName;
                EXECUTE IMMEDIATE v_GrantQuery;
            END FOR;
        END%
        
        call IBMUSER.GRANT_SELECT_ON_DB('<DatabaseName>','<UserName>')%