-- Connect to a privileged using in a PDB.The DBA_PRIV_CAPTURES view displays information on the existing privilege capture policies.
CONN / AS SYSDBA
ALTER SESSION SET CONTAINER = pdb1;
-- Whole database (type = G_DATABASE).
BEGIN
DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'db_pol',
type => DBMS_PRIVILEGE_CAPTURE.g_database );
END;
/-- One or more roles (type = G_ROLE).
BEGIN
DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'role_pol',
type => DBMS_PRIVILEGE_CAPTURE.g_role,
roles => role_name_list('DBA', 'RESOURCE')
);
END;
/-- A user defined condition, when user is TEST (type = G_CONTEXT).
BEGIN
DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'cond_pol',
type => DBMS_PRIVILEGE_CAPTURE.g_context,
condition => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''TEST'''
);
END;
/-- Combination of roles and conditions (type = G_ROLE_AND_CONTEXT).
BEGIN DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'role_cond_pol',
type => DBMS_PRIVILEGE_CAPTURE.g_role_and_context,
roles => role_name_list('DBA', 'RESOURCE'),
condition => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'')
IN (''TEST'',''EMP'')' );
END;
/
COLUMN name FORMAT A15COLUMN roles FORMAT A20ENABLE_CAPTURE The ENABLE_CAPTURE procedure is used to enable a capture policy. Typically, only one analysis policy can be enabled at a time. The exception to this is one G_DATABASE and one none G_DATABASEpolicy can be enabled at the same time.
COLUMN context FORMAT A30
SET LINESIZE 100
SELECT name, type, enabled, roles, context
FROM dba_priv_captures
ORDER BY name;
NAME TYPE E ROLES CONTEXT
--------------- ---------------- - -------------------- ------------------------------
cond_pol CONTEXT N SYS_CONTEXT('USERENV', 'SESSION_USER') = 'TEST'
db_pol DATABASE Nrole_cond_pol ROLE_AND_CONTEXT N ROLE_ID_LIST(4, 3) SYS_CONTEXT('USERENV', 'SESSION_USER') IN ('TEST','EMP')
role_pol ROLE N ROLE_ID_LIST(4, 3)
4 rows selected.
SQL>
BEGIN
DBMS_PRIVILEGE_CAPTURE.enable_capture('db_pol');
DBMS_PRIVILEGE_CAPTURE.enable_capture('cond_pol');
END;
/
BEGIN
DBMS_PRIVILEGE_CAPTURE.disable_capture('db_pol');
DBMS_PRIVILEGE_CAPTURE.disable_capture('cond_pol');
END;
/
BEGIN
DBMS_PRIVILEGE_CAPTURE.generate_result('db_pol');
END;
/
BEGINExample
DBMS_PRIVILEGE_CAPTURE.drop_capture('cond_pol');
DBMS_PRIVILEGE_CAPTURE.drop_capture('db_pol');
DBMS_PRIVILEGE_CAPTURE.drop_capture('role_cond_pol');
DBMS_PRIVILEGE_CAPTURE.drop_capture('role_pol');
END;
/
CONN / AS SYSDBA
ALTER SESSION SET CONTAINER = pdb1;
CREATE USER priv_test_user IDENTIFIED BY priv_test_user;
GRANT DBA, RESOURCE TO priv_test_user;
BEGIN
DBMS_PRIVILEGE_CAPTURE.create_capture(
name => 'dba_res_user_pol',
type => DBMS_PRIVILEGE_CAPTURE.g_role_and_context,
roles => role_name_list('DBA', 'RESOURCE'),
condition => 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''PRIV_TEST_USER''' );
DBMS_PRIVILEGE_CAPTURE.enable_capture(
name => 'dba_res_user_pol' );
END;
/
CONN priv_test_user/priv_test_user@pdb1
CREATE TABLE tab1 ( id NUMBER, description VARCHAR2(50),
CONSTRAINT tab1_px PRIMARY KEY (id));
CREATE SEQUENCE tab1_seq;
CREATE VIEW tab1_view
AS
SELECT * FROM tab1;
INSERT INTO tab1
SELECT level, 'Description of ' || TO_CHAR(level)
FROM dual
CONNECT BY level <= 5;
COMMIT;
SELECT name FROM v$database;
CONN / AS SYSDBA
ALTER SESSION SET CONTAINER = pdb1;
BEGIN
DBMS_PRIVILEGE_CAPTURE.disable_capture(
name => 'dba_res_user_pol' );
DBMS_PRIVILEGE_CAPTURE.generate_result(
name => 'dba_res_user_pol' );
END;
/
These look straight forward, with the exception of the CREATE ANY INDEX privilege.
COLUMN username FORMAT A20
COLUMN sys_priv FORMAT A20
SELECT username, sys_priv
FROM dba_used_sysprivs
WHERE capture = 'dba_res_user_pol'
ORDER BY username, sys_priv;
USERNAME SYS_PRIV
-------------------- --------------------
PRIV_TEST_USER CREATE ANY INDEX
PRIV_TEST_USER CREATE SEQUENCE
PRIV_TEST_USER CREATE SESSION
PRIV_TEST_USER CREATE TABLE
PRIV_TEST_USER CREATE VIEW
5 rows selected.
SQL>
COLUMN username FORMAT A20
COLUMN used_role FORMAT A30
COLUMN sys_priv FORMAT A20
COLUMN path FORMAT A50
SET LINESIZE 200
SELECT username, sys_priv, used_role, path
FROM dba_used_sysprivs_path
WHERE capture = 'dba_res_user_pol'
ORDER BY username, sys_priv;
USERNAME SYS_PRIV USED_ROLE PATH
-------------------- -------------------- ------------------------------ --------------------------------------------------
PRIV_TEST_USER CREATE ANY INDEX IMP_FULL_DATABASE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'IMP_FULL_DATABASE')
PRIV_TEST_USER CREATE ANY INDEX IMP_FULL_DATABASE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'DATAPUMP_IMP_ FULL_DATABASE', 'IMP_FULL_DATABASE')
PRIV_TEST_USER CREATE SEQUENCE OLAP_DBA GRANT_PATH('PRIV_TEST_USER', 'DBA', 'OLAP_DBA')
PRIV_TEST_USER CREATE SESSION EM_EXPRESS_BASIC GRANT_PATH('PRIV_TEST_USER', 'DBA', 'EM_EXPRESS_ALL', 'EM_EXPRESS_BASIC')
PRIV_TEST_USER CREATE TABLE DATAPUMP_EXP_FULL_DATABASE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'DATAPUMP_EXP_FULL_DATABASE', 'EXP_FULL_DATABASE')
PRIV_TEST_USER CREATE TABLE DATAPUMP_EXP_FULL_DATABASE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'DATAPUMP_EXP_FULL_DATABASE')
PRIV_TEST_USER CREATE VIEW DBA GRANT_PATH('PRIV_TEST_USER', 'DBA')
7 rows selected.
SQL>
How were these privileges granted to the user?
COLUMN username FORMAT A20
COLUMN obj_priv FORMAT A8
COLUMN object_owner FORMAT A15
COLUMN object_name FORMAT A20
COLUMN object_type FORMAT A11
SELECT username, obj_priv, object_owner, object_name, object_type
FROM dba_used_objprivs
WHERE capture = 'dba_res_user_pol';
USERNAME OBJ_PRIV OBJECT_OWNER OBJECT_NAME OBJECT_TYPE
-------------------- -------- --------------- -------------------- -----------
PRIV_TEST_USER SELECT SYS V_$DATABASE VIEW
1 row selected.
SQL>
Once again, the privileges came from a variety of roles, but looking at the output from the PATH column, all of them stem from the grant of the DBA role.
COLUMN username FORMAT A20
COLUMN obj_priv FORMAT A8
COLUMN object_owner FORMAT A15
COLUMN object_name FORMAT A20
COLUMN used_role FORMAT A20
COLUMN path FORMAT A30
SET LINESIZE 200
SELECT username, obj_priv, object_owner, object_name, used_role, path
FROM dba_used_objprivs_path
WHERE capture = 'dba_res_user_pol';
USERNAME OBJ_PRIV OBJECT_OWNER OBJECT_NAME USED_ROLE PATH
-------------------- -------- --------------- -------------------- -------------------- ------------------------------
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'SELECT_CATALOG_ROLE')
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', ' DBA', 'EXP_FULL_DATABASE', 'SELECT_CATALOG_ROLE')
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', ' DBA', 'IMP_FULL_DATABASE', 'SELECT_CATALOG_ROLE')
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', ' DBA', 'DATAPUMP_EXP_FULL_DATABASE', 'EXP_FULL_DATABASE', 'SELECT_CATALOG_ROLE')
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', ' DBA', 'DATAPUMP_IMP_FULL_DATAB ASE', 'EXP_FULL_DATABASE', 'SELECT_CATALOG_ROLE')
PRIV_TEST_USER SELECT SYS V_$DATABASE SELECT_CATALOG_ROLE GRANT_PATH('PRIV_TEST_USER', 'DBA', 'DATAPUMP_IMP_FULL_DATABASE', 'IMP_FULL_DATABASEDBA', 'EM_EXPRESS_ALL', 'EM_EXPRESS_BASIC', 'SELECT_CATALOG_ROLE')
7 rows selected.
SQL>
With the analysis complete, we can optionally remove the captured information from the data dictionary.
CONN / AS SYSDBA
ALTER SESSION SET CONTAINER = pdb1;
CREATE ROLE custom_role;
GRANT CREATE SEQUENCE TO custom_role;
GRANT CREATE SESSION TO custom_role;
GRANT CREATE TABLE TO custom_role;
GRANT CREATE VIEW TO custom_role;
GRANT SELECT ON SYS.V_$DATABASE TO custom_role;
GRANT custom_role TO priv_test_user;
REVOKE DBA, RESOURCE FROM priv_test_user;
BEGIN
DBMS_PRIVILEGE_CAPTURE.drop_capture( name => 'dba_res_user_pol' );
END;
/
欢迎光临 重庆思庄Oracle、Redhat认证学习论坛 (http://bbs.cqsztech.com/) | Powered by Discuz! X3.2 |