In this example I have given select on all tables in schema test1 to user test2. As well grant all DML privilege on tables and views, and grant execute on procedures, functions and packages in a schema test1 to user test2.
SQL> create user test1 identified by test1; User created. SQL> grant connect,resource to test1; Grant succeeded. SQL> create user test2 identified by test2; User created. SQL> grant connect,resource to test2; Grant succeeded. SQL> conn test1/test1 Connected. SQL> create table test_table1(id number,name varchar2(30)); Table created. SQL> create table test_table2(id number,name varchar2(30)); Table created. SQL> show user; USER is "TEST1"
If you want to grant select privilege:
SQL> BEGIN FOR t IN (SELECT * FROM user_tables) LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO test2'; END LOOP; END; /
If you want to grant select,insert,update,delete privilege on tables and views and grant execute on procedure,function and package:
SQL> BEGIN FOR t IN (SELECT object_name, object_type FROM all_objects WHERE owner='TEST1' AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT, UPDATE, INSERT, DELETE ON SOURCEUSER.'||t.object_name||' TO TEST2'; ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN EXECUTE IMMEDIATE 'GRANT EXECUTE ON TEST1.'||t.object_name||' TO TEST2'; END IF; END LOOP; END; /
Best approach is:
1. Create a role with appropriate grant
2. grant the role to the user
SQL> create role support;
If want to grant select privilege:
SQL> BEGIN FOR t IN (SELECT * FROM user_tables) LOOP EXECUTE IMMEDIATE 'GRANT SELECT ON ' || t.table_name || ' TO support'; END LOOP; END; / SQL> grant support to test2;
If you want to grant select,insert,update,delete privilege on tables and views and grant execute on procedure,function and package:
SQL> BEGIN FOR t IN (SELECT object_name, object_type FROM all_objects WHERE owner='TEST1' AND object_type IN ('TABLE','VIEW','PROCEDURE','FUNCTION','PACKAGE')) LOOP IF t.object_type IN ('TABLE','VIEW') THEN EXECUTE IMMEDIATE 'GRANT SELECT, UPDATE, INSERT, DELETE ON SOURCEUSER.'||t.object_name||' TO SUPPORT'; ELSIF t.object_type IN ('PROCEDURE','FUNCTION','PACKAGE') THEN EXECUTE IMMEDIATE 'GRANT EXECUTE ON TEST1.'||t.object_name||' TO SUPPORT'; END IF; END LOOP; END; / SQL> grant support to test2;