The following script is used to create a read only schema of any existing schema in the same database. The readonly schema is granted only read permisions on the tables and views of the existing schema. No previliges on any other objects. The script can be customized as per requirment.
Code:
CREATE OR REPLACE PROCEDURE CREATE_READONLY_SCHEMA ( i_owner IN VARCHAR2, i_readonly IN VARCHAR2 ) IS CURSOR cur_c1 IS SELECT OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS WHERE OWNER = i_owner AND OBJECT_TYPE IN ('TABLE', 'VIEW') AND OBJECT_NAME NOT LIKE 'BIN$%' AND STATUS = 'VALID'; BEGIN BEGIN IF i_owner=i_readonly then dbms_output.put_line('Please use a different name for the Readonly Schema'); exit; else --drop the readonly user if it already exists. This grants previliges on newly added tables and views in the original schema. EXECUTE IMMEDIATE 'DROP USER '||i_readonly ||' CASCADE'; end if; EXCEPTION WHEN OTHERS THEN NULL; END; BEGIN EXECUTE IMMEDIATE 'CREATE USER ' || i_readonly || ' IDENTIFIED BY ' || i_readonly || ' DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP2'; --The tablespace part can be customized. --The password can also be customized or altered later on. EXECUTE IMMEDIATE 'GRANT CONNECT TO ' || i_readonly; EXCEPTION WHEN OTHERS THEN --add any exception handler if you want. NULL; END; FOR rec IN cur_c1 LOOP BEGIN EXECUTE IMMEDIATE 'GRANT SELECT ON ' || i_owner || '.' || rec.OBJECT_NAME || ' TO ' || i_readonly; EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW ' || i_readonly || '.' || rec.OBJECT_NAME || ' AS SELECT * FROM ' || i_owner || '.' || rec.OBJECT_NAME; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Refresh Attempt Failed for : ' || rec.Object_Name || ' (' || rec.Object_Type || ')'); END; END LOOP; END CREATE_READONLY_SCHEMA;