Как предоставить право выбора для полной базы данных пользователю в DB2 z/OS

Я хочу предоставить права выбора для всех таблиц в базе данных конкретному пользователю в db2 z/OS или мейнфрейме. Я знаю, что со следующим запросом мы можем предоставить пользователю выбор в таблице, запустив ibmuser.

GRANT SELECT ON <TableName> TO <UserName>

Однако я попытался сделать то же самое, используя хранимую процедуру Db2 z/OS в 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%

При вызове хранимой процедуры она застревает в загрузке и не дает никаких результатов или ошибок. call IBMUSER.GRANT_SELECT_ON_DB('<DatabaseName>','<UserName>')%

Также GRANT SELECT ON <DatabaseName> TO <UserName> не работает, так как не поддерживается в DB2 z/OS. Пожалуйста, предложите. Может быть, я пропускаю некоторые основы.


person Shubham Grover    schedule 10.07.2020    source источник
comment
Да, вы упускаете некоторые основы. Поговорите со своим Z/OS-DBA. Для Db2-on-Z большинство сайтов предъявляют весьма специфические требования к управлению изменениями.   -  person mao    schedule 10.07.2020
comment
Прочтите об обработчиках условий в SQL PL. Вам нужно выйти из цикла при условии НЕ НАЙДЕНО.   -  person mustaccio    schedule 11.07.2020


Ответы (1)


Вы можете попробовать следующую процедуру, она сработала для меня:

    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>')%
person Neeraj Sharma    schedule 14.07.2020