我编写了一个过程来为特定模式的所有表授予权限以休息其他模式。
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 :(得分:0)
All_USERS
和ALL_TABLES
应更改为DBA_USERS
和DBA_TABLES
,因此我的程序有效。
因为all_tables
视图显示存储过程的所有者具有特权的表,所以,除非存储过程是由特权用户创建的,或者是已经拥有这些授权的用户(具有授权)选项,所以他们实际上可以给予特权),all_tables
中可能没有任何资格。