Which has the higher priority in your organization: Deploying a new database or securing the ones you already have?
Looking for a website, and resources, dedicated solely to securing Oracle databases? Check out DBSecWorx.
Purpose
API for creating and maintaining registry entries. This is one of those undocumented packages where I feel it essential to warn readers that the demos here are for education purposes only.
If you run any of them you may totally destroy your database. Oracle Support is likely not going to bail you out and neither will I.
AUTHID
DEFINER
Constants
Name
Data Type
Value
General
RELEASE_STATUS
VARCHAR2(30)
'&C_ORACLE_HIGH_STATUS'
RELEASE_VERSION
registry$.version%type
'&C_ORACLE_HIGH_VERSION_4_DOTS'
RELEASE_VERSION_FULL
registry$.version%type
'&C_ORACLE_HIGH_VERSIONFULL'
Component Hierarchical Constants
IMD_COMPS
NUMBER
1
TRM_COMPS
NUMBER
2
ALL_COMPS
NUMBER
3
Data Types
-- Component Hierarchy Type
TYPE comp_list_t IS TABLE OF VARCHAR2(30)
INDEX BY BINARY_INTEGER;
-- Schema List Parameter
TYPE schema_list_t IS TABLE OF VARCHAR2(30);
-- Component dependency Type - table of component IDs
TYPE comp_depend_list_t IS TABLE OF VARCHAR2(30);
-- Component dependency Type - table of component IDs and associated namespaces
TYPE comp_depend_record_t IS RECORD(
cid VARCHAR2(30), -- component id
cnamespace VARCHAR2(30)); -- component namespace
TYPE comp_depend_rec IS TABLE OF comp_depend_record_t INDEX BY BINARY_INTEGER;
Dependencies
APS_VALIDATE
DBMS_SYSTEM
SEM_OLS
CONTAINER$
DBMS_SYS_ERROR
USER$
DBA_REGISTRY
DRVODM
USER_REGISTRY
DBA_REGISTRY_HIERARCHY
DUAL
UTL_RAW
DBA_SERVER_REGISTRY
INITJVMAUX
V$DATABASE
DBA_UPGRADE_ERRORS
LTUTIL
V$INSTANCE
DBMS_ASSERT
LT_EXPORT_PKG
V$TIMEZONE_FILE
DBMS_CLUSTDB
MGWI_ADMIN
VALIDATE_CONTEXT
DBMS_CRYPTO
MGWI_REG
VALIDATE_DV
DBMS_EDITIONS_UTILITIES_LIB
OBJ$
VALIDATE_LCTR
DBMS_FEATURE_EXADATA
OWM_VSCRIPT_PKG
VALIDATE_OLS
DBMS_I_INDEX_UTL
PLITBLM
VALIDATE_ORDIM
DBMS_JAVA_DEV
REGISTRY$
VALIDATE_OWM
DBMS_REGISTRY_SERVER
REGISTRY$DATABASE
VALIDATE_SDO
DBMS_REGISTRY_SIMPLE
REGISTRY$DEPENDENCIES
X$KSPPCV
DBMS_REGISTRY_SYS
REGISTRY$ERROR
X$KSPPI
DBMS_REGXDB
REGISTRY$PROGRESS
XMLVALIDATE
DBMS_STANDARD
REGISTRY$SCHEMAS
XOQ_VALIDATE
DBMS_STATS
SDO_RDF_INTERNAL
Documented
No
Exceptions
Error Code
Reason
ORA-39702
Database not open for UPGRADE or DOWNGRADE
ORA-39705
Component 'OWB' not found in registry
First Available
Not known
Registry Entries
col comp_name format a35
col version format a12
col schema format a10
col status format a10
SELECT comp_name, version, schema, status
FROM dba_registry
ORDER BY 1;
col cid format a12
col errmsg format a12
col namespace format a10
col optime format a30
SELECT * FROM registry$log ORDER BY 1,4;
CID NAMESPACE OPERATION OPTIME ERRMSG
------------ ---------- ---------- ------------------------------
------------
CATALOG SERVER -1 18-DEC-20 02.59.59.820471 AM 21.1.0.0.0
CATALOG SERVER -1 18-DEC-20 03.01.11.115034 AM 21.1.0.0.0
CATPROC SERVER 3 03-NOV-20 09.37.59.195078 AM 21.1.0.0.0
JAVAVM SERVER 1 18-DEC-20 12.00.41.337733 AM 21.1.0.0.0
ORDIM SERVER 1 18-DEC-20 12.00.13.028198 AM 21.1.0.0.0
STATS_BGN SERVER -1 18-DEC-20 02.58.14.257883 AM
UTLRP_BGN SERVER -1 03-NOV-20 09.42.07.698494 AM
UTLRP_BGN SERVER -1 03-NOV-20 10.24.15.551728 AM
UTLRP_BGN SERVER -1 11-DEC-20 06.14.47.609061 PM
UTLRP_BGN SERVER -1 11-DEC-20 06.22.23.219220 PM
UTLRP_END SERVER -1 03-NOV-20 09.42.07.705097 AM
UTLRP_END SERVER -1 03-NOV-20 10.24.17.027877 AM
UTLRP_END SERVER -1 11-DEC-20 06.15.25.732371 PM
UTLRP_END SERVER -1 11-DEC-20 06.22.25.630832 PM
Security Model
Owned by SYS with EXECUTE granted to CTXSYS, LBACSYS, MDSYS, WMSYS and XDB
and the DATAPATCH_ROLE and EXECUTE_CATALOG_ROLE roles.
Database must be open for upgrade or downgrade for this to be used
dbms_registry.check_server_instance;
-- see $ORACLE_HOME/rdbms/admin/cmpupstr.sql
exec dbms_registry.check_server_instance;
BEGIN dbms_registry.check_server_instance; END;
*
ERROR at line 1:
ORA-39702: database not open for UPGRADE or DOWNGRADE
ORA-06512: at "SYS.DBMS_REGISTRY", line 1101
ORA-06512: at line 1
Returns the component name corresponding to a component ID
dbms_registry.comp_name(comp_id IN VARCHAR2)
RETURN VARCHAR2;
desc registry$
SELECT pid FROM registry$;
-- loaded procedure from $ORACLE_HOME/rdbms/admin/catcr.sql altered to only show the use of this procedure
Warning: Running this code could be fatal to your system.
This demo is here for education purposes only and should not to be run.
PROCEDURE loaded(comp_id IN VARCHAR2) IS
p_id VARCHAR2(30) := NLS_UPPER(comp_id);
p_version VARCHAR2(17) := NLS_UPPER(comp_version);
p_banner VARCHAR2(80) := comp_banner;
BEGIN
IF exists_comp(p_id) THEN
IF p_version IS NULL THEN
SELECT version INTO p_version FROM v$instance;
END IF;
IF p_banner IS NULL THEN
SELECT banner INTO p_banner FROM v$version
WHERE rownum = 1;
p_banner:= substr(p_banner, instr(p_banner,'-',1) + 2);
p_banner:= dbms_registry.comp_name(p_id) || ' Release ' || p_version || ' - ' || p_banner;
END IF;
ELSE
raise NO_COMPONENT;
END IF;
END loaded;
/
The demo, at right, is copied from ?/rdbms/admin/dve122.sql. Not present in 18c or above
dbms_registry.downgrading(
comp_id IN VARCHAR2,
old_name IN VARCHAR2 DEFAULT NULL,
old_proc IN VARCHAR2 DEFAULT NULL,
old_schema IN VARCHAR2 DEFAULT NULL,
old_parent IN VARCHAR2 DEFAULT NULL);
DECLARE
start_time DATE;
end_time DATE;
option_val VARCHAR2(64);
g_null CHAR(1);
BEGIN
BEGIN
SELECT NULL INTO g_null FROM obj$
WHERE owner#=0 AND name='V$CACHE_TRANSFER';
-- valid if v$ges_statistics exists
SELECT value INTO option_val FROM v$option
WHERE parameter = 'Real Application Clusters';
-- check if RAC option has been linked in
IF option_val = 'TRUE' THEN
dbms_registry.valid('RAC');
ELSE
dbms_registry.invalid('RAC');
END IF;
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_registry.invalid('RAC');
END;
END validate;
/
Determines whether a component id corresponds with a component
dbms_registry.is_component(comp_id IN VARCHAR2)
RETURN BOOLEAN;
set serveroutput on
BEGIN
IF dbms_registry.is_component('XML') THEN
dbms_output.put_line('Is a component');
ELSE
dbms_output.put_line('Not a component');
END IF;
END;
/ Is a component
Returns TRUE if the database is a consolidated database but but this seems to mean a CDB not that it is multi-tenant
dbms_registry.is_db_consolidated RETURN BOOLEAN;
set serveroutput on
BEGIN
IF dbms_registry.is_db_consolidated THEN
dbms_output.put_line('Is multi-tenant');
ELSE
dbms_output.put_line('Not a multi-tenant');
END IF;
END;
/ Is multi-tenant
BEGIN
IF dbms_registry.is_db_pdb THEN
dbms_output.put_line('Current container is a PDB');
ELSE
dbms_output.put_line('Current container is not a PDB');
END IF;
END;
/ Current container is not a PDB
Returns TRUE if in PDB$SEED and FALSE if in any other container
dbms_registry.is_db_pdb_seed RETURN BOOLEAN;
set serveroutput on
BEGIN
IF dbms_registry.is_db_pdb_seed THEN
dbms_output.put_line('Current container is PDB$SEED');
ELSE
dbms_output.put_line('Current container is not PDB$SEED');
END IF;
END;
/ Current container is not PDB$SEED
PL/SQL procedure successfully completed.
ALTER SESSION SET CONTAINER = PDB$SEED;
Session altered.
set serveroutput on
BEGIN
IF dbms_registry.is_db_pdb_seed THEN
dbms_output.put_line('Current container is PDB$SEED');
ELSE
dbms_output.put_line('Current container is not PDB$SEED');
END IF;
END;
/ Current container is not PDB$SEED
Returns TRUE if in CDB$ROOT and FALSE if in any other container
dbms_registry.is_db_root RETURN BOOLEAN;
set serveroutput on
BEGIN
IF dbms_registry.is_db_root THEN
dbms_output.put_line('Current container is CDB$ROOT');
ELSE
dbms_output.put_line('Current container is not CDB$ROOT');
END IF;
END;
/ Current container is CDB$ROOT
Determines whether a component is loaded into the registry
dbms_registry.is_in_registry(comp_id IN VARCHAR2)
RETURN BOOLEAN;
set serveroutput on
BEGIN
IF dbms_registry.is_in_registry('XML') THEN
dbms_output.put_line('Is in the registry');
ELSE
dbms_output.put_line('Not in the registry');
END IF;
END;
/ Is in the registry
Definitely returns FALSE if not in upgrade mode. Have not tested to determine if it returns TRUE or nothing when actually in upgrade mode
dbms_registry.is_in_upgrade_mode RETURN BOOLEAN;
conn / as sysdba
set serveroutput on
BEGIN
IF dbms_registry.is_in_upgrade_mode THEN
dbms_output.put_line('In Upgrade Mode');
ELSE
dbms_output.put_line('Not In Upgrade Mode');
END IF;
END;
/
BEGIN
IF dbms_registry.is_trace_event_set('10046') THEN
dbms_output.put_line('10046 Trace Is Set');
ELSE
dbms_output.put_line('Trace Is Not Set');
END IF;
END;
/
BEGIN
*
ERROR at line 1:
ORA-01403: no data found
ORA-06512: at "SYS.DBMS_REGISTRY", line 1763
ORA-06512: at line 2
BEGIN
IF dbms_registry.is_supgrade_running THEN
dbms_output.put_line('Upgrade Running');
ELSE
dbms_output.put_line('Upgrade Not Running');
END IF;
END;
/
dbms_registry.is_valid(
comp_id IN VARCHAR2,
version IN VARCHAR2)
RETURN NUMBER;
BEGIN
IF dbms_registry.is_valid('JAVAVM', dbms_registry.release_version) =1
THEN
dbms_registry.loaded('CATJAVA');
dbms_registry_sys.validate_catjava;
END IF;
END;
/
Indicate that the component is in the process of being loaded
Overload 1
dbms_registry.loading(
comp_id IN VARCHAR2,
comp_name IN VARCHAR2,
comp_proc IN VARCHAR2,
comp_schema IN VARCHAR2,
comp_parent IN VARCHAR2);
set linesize 121
col comp_name format a35
col procedure format a35
col schema format a10
col parent_id format a10
SELECT comp_id, comp_name, procedure, schema, parent_id
FROM dba_registry;
BEGIN
dbms_registry.loading('CATALOG', 'Oracle Database Catalog Views', 'dbms_registry_sys.validate_catalog');
END;
/
Overload 2
dbms_registry.loading(
comp_id IN VARCHAR2,
comp_name IN VARCHAR2,
comp_proc IN VARCHAR2,
comp_schema IN VARCHAR2,
comp_schemas IN dbms_registry.schema_list_t,
comp_parent IN VARCHAR2);
Determine the status of a database component from the registry
dbms_registry.status(comp_id IN VARCHAR2)
RETURN VARCHAR2;
BEGIN
IF dbms_registry.status('CATJAVA') IS NULL THEN
RAISE_APPLICATION_ERROR(-20000, 'CATJAVA has not been loaded.');
END IF;
END;
/
BEGIN
IF dbms_registry.status('XDB') = 'VALID' THEN
execute immediate 'create table xdb.migr9202status (n integer)';
execute immediate 'insert into xdb.migr9202status values (1000)';
END IF;
END;
/
dbms_registry.upgrading(
comp_id IN VARCHAR2,
new_name IN VARCHAR2,
new_proc IN VARCHAR2,
new_schema IN VARCHAR2,
new_parent IN VARCHAR2);
See Upgraded Demo Above
Overload 2
dbms_registry.upgrading(
comp_id IN VARCHAR2,
new_name IN VARCHAR2,
new_proc IN VARCHAR2,
new_schema IN VARCHAR2,
new_schemas IN dbms_registry.schema_list_t,
new_parent IN VARCHAR2);