2015-11-17 11 views
0

Я написал процедуру предоставления разрешений для всех таблиц конкретной схемы для оставления других схем.Как написать процедуру для выполнения множества запросов автоматически

create or replace PROCEDURE GRANTS_PROC 

    IS 

    CURSOR GRANTS_CURSOR 
    IS 
     SELECT 'GRANT SELECT, INSERT, UPDATE, DELETE ON "' 
     ||T.OWNER 
     ||'"."' 
     ||TABLE_NAME 
     ||'" TO ' 
     ||(SELECT rtrim(listagg(U.username||',') 
     within group (order by U.username),',') USERNAME 
     FROM ALL_USERS U 
     WHERE U.USERNAME!=T.OWNER 
     AND U.USERNAME IN 
     ('AAA','BBB','CCC','DDD','EEE','FFF','GGG','HHH','III'))||';' FINAL_TXT 
     FROM ALL_TABLES T 
     WHERE T.OWNER IN 
     ('AAA','BBB','CCC','DDD','EEE','FFF','GGG','HHH','III') 
     ORDER BY T.OWNER,UPPER(T.TABLE_NAME); 
    BEGIN 
     --DBMS_OUTPUT.PUT_LINE('CURSOR_GRANTS.FINAL_TXT'); 
     --QRY_TEXT:='ABC'; 
     FOR CURSOR_GRANTS IN GRANTS_CURSOR 
     LOOP 
     DBMS_OUTPUT.PUT_LINE(CURSOR_GRANTS.FINAL_TXT); 

      EXECUTE IMMEDIATE CURSOR_GRANTS.FINAL_TXT; 

     END LOOP; 
    END; 
/

выше процедура компилируется успешно, но в то время как исполнение он не получает в FOR цикл, чтобы запустить EXECUTE IMMEDIATE блок, но процедура PL/SQL компилируется успешно.

Что можно сделать, чтобы исправить мою процедуру и заставить ее работать?

+0

Если цикл 'FOR' не запущен, это связано с тем, что строки в' T.OWNER IN (... 'не являются пользователями с таблицами. Это выглядит как фиктивные данные, но убедитесь, что реальные данные находятся в –

+0

Я просто изменил его на «aaa», «bbb» и т. д. Я дал существующие имена пользователей, даже тогда его не работает, а также в UPPERCASE –

+0

Ли только запрос возвращает результаты? Также есть несколько опечаток в коде, например 'TXT' должно быть' FINAL_TXT'. –

ответ

0

All_USERS и ALL_TABLES следует изменить на DBA_USERS и DBA_TABLES, поэтому моя процедура работает.

Поскольку в представлении all_tables показаны таблицы, владельцы хранимой процедуры имеют привилегии, поэтому, если хранимая процедура не создается привилегированным пользователем или пользователем, у которого уже есть эти гранты (с возможностью предоставления грантов, чтобы они может фактически дать привилегии), может быть ничего в all_tables, который квалифицируется.