scripts/collector/oracle/sql/setup/grants_wrapper.sql (252 lines of code) (raw):
--
-- Copyright 2024 Google LLC
--
-- Licensed under the Apache License, Version 2.0 (the "License").
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
-- https://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.
--
whenever sqlerror exit failure
whenever oserror exit failure
set verify off
set feedback off
set echo off
prompt "Please enter the database local username (or CDB username) to receive all required grants. "
accept dbusername char prompt "Enter exactly as defined in the database, upper/lower case must match: "
accept usediagnostics char default 'Y' prompt "Please enter Y or N to allow or disallow use of the Tuning and Diagnostic Pack (AWR/ASH) data (Y) "
DECLARE
cnt NUMBER;
BEGIN
SELECT count(1) INTO cnt FROM dba_users WHERE username = '&&dbusername';
IF cnt = 0 THEN
raise_application_error(-20001, 'User "&&dbusername" does not exist. please verify the username and ensure the account is created.');
END IF;
END;
/
set serveroutput on size 50000
set termout on
set lines 200
set feedback off
whenever sqlerror exit failure
DECLARE
TYPE rectype IS RECORD (
objpriv varchar2(30),
objowner varchar2(30),
objname varchar2(30)
);
TYPE t_source_table_list IS
TABLE OF rectype;
TABLE_DOES_NOT_EXIST EXCEPTION;
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -00942);
v_source_table_list t_source_table_list;
v_table_owner VARCHAR2(30);
v_table_name VARCHAR2(30);
v_table_priv VARCHAR2(30);
v_cnt NUMBER;
v_err_ind BOOLEAN := FALSE;
v_infosep VARCHAR2(100) := rpad('-', 100, '-');
v_errsep VARCHAR2(100) := rpad('!', 100, '!');
PROCEDURE list_pdbs
IS
TYPE c_pdb_list_type IS REF CURSOR;
v_pdb_list c_pdb_list_type;
v_pdb_name VARCHAR2(128);
v_pdb_count NUMBER := 0;
BEGIN
dbms_output.put_line(v_infosep);
dbms_output.put_line('-- Privileges verified for the below pluggable databases:');
OPEN v_pdb_list FOR 'SELECT pdb_name FROM cdb_pdbs WHERE pdb_name != :seedname ORDER BY 1' USING 'PDB$SEED';
LOOP
FETCH v_pdb_list INTO v_pdb_name;
EXIT WHEN v_pdb_list%NOTFOUND;
dbms_output.put_line(' ' || v_pdb_name);
v_pdb_count := v_pdb_count + 1;
END LOOP;
IF v_pdb_count = 0 THEN
dbms_output.put_line(v_errsep);
dbms_output.put_line(v_errsep);
dbms_output.put_line('-- This user has no access to pluggable databases.');
dbms_output.put_line('-- Please execute the below ALTER USER statement in the container database.');
dbms_output.put_line('ALTER USER "&dbusername" SET CONTAINER_DATA=ALL CONTAINER = CURRENT;');
dbms_output.put_line(v_errsep);
dbms_output.put_line(v_errsep);
raise_application_error(-20002, 'No access to pluggable database information');
ELSE
dbms_output.put_line(v_infosep);
END IF;
END;
PROCEDURE grant_privs(p_priv_list t_source_table_list)
IS
v_sql VARCHAR2(2000);
BEGIN
FOR x IN p_priv_list.first..p_priv_list.last LOOP
v_table_priv := p_priv_list(x).objpriv;
v_table_owner := p_priv_list(x).objowner;
v_table_name := p_priv_list(x).objname;
BEGIN
SELECT count(1)
INTO v_cnt
FROM dba_objects
WHERE owner = v_table_owner
AND object_name = v_table_name;
IF v_cnt != 0 THEN
v_sql := 'GRANT ' || v_table_priv || ' ON ' || v_table_owner || '.' || v_table_name || ' TO "&dbusername" ' ;
dbms_output.put_line(v_sql || ';' );
EXECUTE IMMEDIATE v_sql;
END IF;
END;
END LOOP;
SELECT count(1) INTO v_cnt FROM dba_tab_columns WHERE table_name ='V_$DATABASE' AND column_name ='CDB';
IF (v_cnt > 0) THEN
EXECUTE IMMEDIATE 'SELECT count(1) FROM v$containers' INTO v_cnt;
IF (v_cnt > 1) THEN
v_sql := 'ALTER USER "&dbusername" SET CONTAINER_DATA=ALL CONTAINER = CURRENT';
dbms_output.put_line(v_sql || ';' );
EXECUTE IMMEDIATE v_sql;
list_pdbs;
END IF;
END IF;
END;
FUNCTION rectype_( p_objpriv VARCHAR2, p_objowner VARCHAR2, p_objname VARCHAR2) RETURN RECTYPE IS
retval rectype;
BEGIN
retval.objpriv := p_objpriv;
retval.objowner := p_objowner;
retval.objname := p_objname;
RETURN retval;
END;
BEGIN
-- The rectype entries in the code blocks below are parsed to generate documentation.
-- Please follow the same format of one entry per line when adding new privileges.
IF upper('&usediagnostics') = 'Y' THEN
dbms_output.put_line('Granting privs for AWR/ASH data');
v_source_table_list := t_source_table_list(
rectype_('SELECT','SYS','CDB_HIST_ACTIVE_SESS_HISTORY'),
rectype_('SELECT','SYS','CDB_HIST_IOSTAT_FUNCTION'),
rectype_('SELECT','SYS','CDB_HIST_OSSTAT'),
rectype_('SELECT','SYS','CDB_HIST_SNAPSHOT'),
rectype_('SELECT','SYS','CDB_HIST_SQLSTAT'),
rectype_('SELECT','SYS','CDB_HIST_SQLTEXT'),
rectype_('SELECT','SYS','CDB_HIST_SYSMETRIC_HISTORY'),
rectype_('SELECT','SYS','CDB_HIST_SYSMETRIC_SUMMARY'),
rectype_('SELECT','SYS','CDB_HIST_SYSSTAT'),
rectype_('SELECT','SYS','CDB_HIST_SYSTEM_EVENT'),
rectype_('SELECT','SYS','CDB_HIST_SYS_TIME_MODEL'),
rectype_('SELECT','SYS','DBA_HIST_ACTIVE_SESS_HISTORY'),
rectype_('SELECT','SYS','DBA_HIST_IOSTAT_FUNCTION'),
rectype_('SELECT','SYS','DBA_HIST_OSSTAT'),
rectype_('SELECT','SYS','DBA_HIST_SNAPSHOT'),
rectype_('SELECT','SYS','DBA_HIST_SQLSTAT'),
rectype_('SELECT','SYS','DBA_HIST_SQLTEXT'),
rectype_('SELECT','SYS','DBA_HIST_SYSMETRIC_HISTORY'),
rectype_('SELECT','SYS','DBA_HIST_SYSMETRIC_SUMMARY'),
rectype_('SELECT','SYS','DBA_HIST_SYSSTAT'),
rectype_('SELECT','SYS','DBA_HIST_SYSTEM_EVENT'),
rectype_('SELECT','SYS','DBA_HIST_SYS_TIME_MODEL')
);
grant_privs(v_source_table_list);
END IF;
v_source_table_list := t_source_table_list(
rectype_('EXECUTE','SYS','DBMS_UMF'),
rectype_('EXECUTE','SYS','DBMS_QOPATCH'),
rectype_('SELECT','PERFSTAT','STATS$IOSTAT_FUNCTION_NAME'),
rectype_('SELECT','PERFSTAT','STATS$IOSTAT_FUNCTION'),
rectype_('SELECT','PERFSTAT','STATS$OSSTATNAME'),
rectype_('SELECT','PERFSTAT','STATS$OSSTAT'),
rectype_('SELECT','PERFSTAT','STATS$SNAPSHOT'),
rectype_('SELECT','PERFSTAT','STATS$SQL_SUMMARY'),
rectype_('SELECT','PERFSTAT','STATS$SYSSTAT'),
rectype_('SELECT','PERFSTAT','STATS$SYSTEM_EVENT'),
rectype_('SELECT','PERFSTAT','STATS$SYS_TIME_MODEL'),
rectype_('SELECT','PERFSTAT','STATS$TIME_MODEL_STATNAME'),
rectype_('SELECT','SYS','AUX_STATS$'),
rectype_('SELECT','SYS','CDB_CONSTRAINTS'),
rectype_('SELECT','SYS','CDB_CPU_USAGE_STATISTICS'),
rectype_('SELECT','SYS','CDB_DATA_FILES'),
rectype_('SELECT','SYS','CDB_DB_LINKS'),
rectype_('SELECT','SYS','CDB_EXTERNAL_TABLES'),
rectype_('SELECT','SYS','CDB_FEATURE_USAGE_STATISTICS'),
rectype_('SELECT','SYS','CDB_FREE_SPACE'),
rectype_('SELECT','SYS','CDB_HIGH_WATER_MARK_STATISTICS'),
rectype_('SELECT','SYS','CDB_INDEXES'),
rectype_('SELECT','SYS','CDB_LOB_PARTITIONS'),
rectype_('SELECT','SYS','CDB_LOBS'),
rectype_('SELECT','SYS','CDB_LOB_SUBPARTITIONS'),
rectype_('SELECT','SYS','CDB_MVIEWS'),
rectype_('SELECT','SYS','CDB_OBJECTS'),
rectype_('SELECT','SYS','CDB_OBJECT_TABLES'),
rectype_('SELECT','SYS','CDB_PART_TABLES'),
rectype_('SELECT','SYS','CDB_PDBS'),
rectype_('SELECT','SYS','CDB_SEGMENTS'),
rectype_('SELECT','SYS','CDB_SERVICES'),
rectype_('SELECT','SYS','CDB_SOURCE'),
rectype_('SELECT','SYS','CDB_SYNONYMS'),
rectype_('SELECT','SYS','CDB_TAB_COLS'),
rectype_('SELECT','SYS','CDB_TAB_COLUMNS'),
rectype_('SELECT','SYS','CDB_TABLESPACES'),
rectype_('SELECT','SYS','CDB_TABLES'),
rectype_('SELECT','SYS','CDB_TAB_PARTITIONS'),
rectype_('SELECT','SYS','CDB_TAB_SUBPARTITIONS'),
rectype_('SELECT','SYS','CDB_TEMP_FILES'),
rectype_('SELECT','SYS','CDB_TRIGGERS'),
rectype_('SELECT','SYS','CDB_USERS'),
rectype_('SELECT','SYS','CDB_VIEWS'),
rectype_('SELECT','SYS','CDB_XML_TABLES'),
rectype_('SELECT','SYS','CONTAINER$'),
rectype_('SELECT','SYS','DBA_CONSTRAINTS'),
rectype_('SELECT','SYS','DBA_CPU_USAGE_STATISTICS'),
rectype_('SELECT','SYS','DBA_DATA_FILES'),
rectype_('SELECT','SYS','DBA_DB_LINKS'),
rectype_('SELECT','SYS','DBA_EXTERNAL_TABLES'),
rectype_('SELECT','SYS','DBA_FEATURE_USAGE_STATISTICS'),
rectype_('SELECT','SYS','DBA_FREE_SPACE'),
rectype_('SELECT','SYS','DBA_HIGH_WATER_MARK_STATISTICS'),
rectype_('SELECT','SYS','DBA_INDEXES'),
rectype_('SELECT','SYS','DBA_LOB_PARTITIONS'),
rectype_('SELECT','SYS','DBA_LOBS'),
rectype_('SELECT','SYS','DBA_LOB_SUBPARTITIONS'),
rectype_('SELECT','SYS','DBA_MVIEWS'),
rectype_('SELECT','SYS','DBA_OBJECTS'),
rectype_('SELECT','SYS','DBA_OBJECT_TABLES'),
rectype_('SELECT','SYS','DBA_PART_TABLES'),
rectype_('SELECT','SYS','DBA_REGISTRY_SQLPATCH'),
rectype_('SELECT','SYS','DBA_SEGMENTS'),
rectype_('SELECT','SYS','DBA_SERVICES'),
rectype_('SELECT','SYS','DBA_SOURCE'),
rectype_('SELECT','SYS','DBA_SYNONYMS'),
rectype_('SELECT','SYS','DBA_TAB_COLS'),
rectype_('SELECT','SYS','DBA_TAB_COLUMNS'),
rectype_('SELECT','SYS','DBA_TABLESPACES'),
rectype_('SELECT','SYS','DBA_TABLES'),
rectype_('SELECT','SYS','DBA_TAB_PARTITIONS'),
rectype_('SELECT','SYS','DBA_TAB_SUBPARTITIONS'),
rectype_('SELECT','SYS','DBA_TEMP_FILES'),
rectype_('SELECT','SYS','DBA_TRIGGERS'),
rectype_('SELECT','SYS','DBA_USERS'),
rectype_('SELECT','SYS','DBA_VIEWS'),
rectype_('SELECT','SYS','DBA_XML_TABLES'),
rectype_('SELECT','SYS','GV_$ARCHIVE_DEST'),
rectype_('SELECT','SYS','GV_$ARCHIVED_LOG'),
rectype_('SELECT','SYS','GV_$DATABASE'),
rectype_('SELECT','SYS','GV_$INSTANCE'),
rectype_('SELECT','SYS','GV_$PARAMETER'),
rectype_('SELECT','SYS','GV_$PDBS'),
rectype_('SELECT','SYS','GV_$PGASTAT'),
rectype_('SELECT','SYS','GV_$PROCESS'),
rectype_('SELECT','SYS','GV_$SGASTAT'),
rectype_('SELECT','SYS','GV_$SYSTEM_PARAMETER'),
rectype_('SELECT','SYS','NLS_DATABASE_PARAMETERS'),
rectype_('SELECT','SYS','OBJ$'),
rectype_('SELECT','SYS','REGISTRY$HISTORY'),
rectype_('SELECT','SYS','V_$ARCHIVE_DEST'),
rectype_('SELECT','SYS','V_$DATABASE'),
rectype_('SELECT','SYS','V_$EVENT_NAME'),
rectype_('SELECT','SYS','V_$INSTANCE'),
rectype_('SELECT','SYS','V_$LOGFILE'),
rectype_('SELECT','SYS','V_$LOG_HISTORY'),
rectype_('SELECT','SYS','V_$LOG'),
rectype_('SELECT','SYS','V_$PARAMETER'),
rectype_('SELECT','SYS','V_$PDBS'),
rectype_('SELECT','SYS','V_$PGASTAT'),
rectype_('SELECT','SYS','V_$RMAN_BACKUP_JOB_DETAILS'),
rectype_('SELECT','SYS','V_$SGASTAT'),
rectype_('SELECT','SYS','V_$SQLCOMMAND'),
rectype_('SELECT','SYS','V_$SYSTEM_PARAMETER'),
rectype_('SELECT','SYS','V_$TEMP_SPACE_HEADER'),
rectype_('SELECT','SYS','V_$VERSION'),
rectype_('SELECT','SYSTEM','LOGSTDBY$SKIP_SUPPORT')
);
grant_privs(v_source_table_list);
END;
/
exit