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程序编译成功。

可以做些什么来修复我的程序并使其正常工作?

4

1 回答 1

0

All_USERSandALL_TABLES应该更改为DBA_USERSand DBA_TABLES,因此我的程序有效。

因为all_tables视图显示了存储过程的所有者对其具有特权的表,所以,除非存储过程是由特权用户创建的,或者已经拥有这些授权的用户(使用授权选项,所以他们实际上可以授予特权),可能没有什么all_tables符合条件的。

于 2015-11-20T09:16:45.127 回答