Vous êtes sur la page 1sur 2

CREATE OR REPLACE TRIGGER scott.

grant_to_roles
AFTER CREATE ON scott.SCHEMA
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
j INTEGER;
p1 VARCHAR2(4000);
p2 VARCHAR2(30);
BEGIN
SELECT CASE WHEN ora_dict_obj_type IN ( 'TABLE', 'VIEW' )
THEN 'SELECT'
WHEN ora_dict_obj_type IN ( 'FUNCTION', 'PROCEDURE', 'PACKAGE' )
THEN NULL
ELSE NULL
END rr
, CASE WHEN ora_dict_obj_type IN ( 'TABLE', 'VIEW' )
THEN 'SELECT,INSERT,DELETE,UPDATE'
WHEN ora_dict_obj_type IN ( 'FUNCTION', 'PROCEDURE', 'PACKAGE' )
THEN 'EXECUTE'
ELSE NULL
END ur
INTO p1, p2
FROM dual;
IF p1 IS NOT NULL
THEN
p1 := 'DECLARE' || CHR(10) ||
' i PLS_INTEGER;' || CHR(10) ||
' BEGIN' || CHR(10) ||
' SELECT COUNT(*)' || CHR(10) ||
' INTO i' || CHR(10) ||
' FROM user_objects' || CHR(10) ||
' WHERE object_type = ''' || ora_dict_obj_type || '''' || CHR(10)
||
' AND object_name = ''' || UPPER( ora_dict_obj_name ) || '''' |
| CHR(10) ||
' ;' || CHR(10) ||
' IF i > 0' || CHR(10) ||
' THEN' || CHR(10) ||
' EXECUTE IMMEDIATE ''GRANT ' || p1 || ' ON scott.' ||
ora_dict_obj_name || ' TO scott_reader_role'';' || CHR(10) ||
' END IF;' || CHR(10) ||
' END;';
dbms_job.submit( j, p1 );
END IF;
IF p2 IS NOT NULL
THEN
p1 := 'DECLARE' || CHR(10) ||
' i PLS_INTEGER;' || CHR(10) ||
'BEGIN' || CHR(10) ||
' SELECT COUNT(*)' || CHR(10) ||
' INTO i' || CHR(10) ||
' FROM user_objects' || CHR(10) ||
' WHERE object_type = ''' || ora_dict_obj_type || '''' || CHR(10) |
|
' AND object_name = ''' || UPPER( ora_dict_obj_name ) || '''' ||
CHR(10) ||
' ;' || CHR(10) ||
' IF i > 0' || CHR(10) ||
' THEN' || CHR(10) ||
' EXECUTE IMMEDIATE ''GRANT ' || p2 || ' ON scott.' ||
ora_dict_obj_name || ' TO scott_user_role'';' || CHR(10) ||
' END IF;' || CHR(10) ||
'END;';
dbms_job.submit( j, p1 );
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line( sqlerrm );
END;

-- ---------------------------------------------
-- Salmple output
--How does it work?
--When a table ttt is created, two jobs are created, doing things like:
--DECLARE
-- i PLS_INTEGER;
--BEGIN
-- SELECT COUNT(*)
-- INTO i
-- FROM user_objects
-- WHERE object_type = 'TABLE'
-- AND object_name = 'TTT'
-- ;
-- IF i > 0
-- THEN
-- EXECUTE IMMEDIATE 'GRANT SELECT ON scott.TTT TO scott_reader_role';
-- END IF;
--END;
--They are submitted and the privileges are granted, nearly in real time.

Vous aimerez peut-être aussi