MINI MINI MANI MO
Rem
Rem $Header: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql /st_rdbms_18.0/2 2018/02/23 11:47:57 surman Exp $
Rem
Rem sqlpatch_bootstrap.sql
Rem
Rem Copyright (c) 2014, 2018, Oracle and/or its affiliates.
Rem All rights reserved.
Rem
Rem NAME
Rem sqlpatch_bootstrap.sql
Rem
Rem DESCRIPTION
Rem This file is used only by the datapatch utility. It will scan the
Rem SQL patching infrastructure (dbms_sqlpatch package,
Rem dba_registry_sqlpatch view, registry$sqlpatch table) and recreate
Rem it as needed.
Rem
Rem sqlpatch_bootstrap.sql is executed automatically by datapatch each
Rem time it starts up, for all active PDBs, unless -force is specified.
Rem
Rem NOTES
Rem Added for bug 19189525.
Rem
Rem BEGIN SQL_FILE_METADATA
Rem SQL_SOURCE_FILE: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql
Rem SQL_SHIPPED_FILE: rdbms/admin/sqlpatch/sqlpatch_bootstrap.sql
Rem SQL_PHASE: SQLPATCH_BOOTSTRAP
Rem SQL_STARTUP_MODE: NORMAL
Rem SQL_IGNORABLE_ERRORS: NONE
Rem SQL_CALLING_FILE: NONE
Rem END SQL_FILE_METADATA
Rem
Rem MODIFIED (MM/DD/YY)
Rem apfwkr 02/21/18 - Backport surman_bug-27283029 from main
Rem surman 11/21/17 - XbranchMerge surman_bug-26281129 from main
Rem surman 02/05/18 - 27283029: Add dba_registry_sqlpatch_ru_info
Rem surman 09/18/17 - 26281129: Support for new release model
Rem pjulsaks 06/29/17 - RTI 20414190: Uppercase input to create_cdbview
Rem raeburns 06/16/17 - Bug 26170491: timestamp in registry$history
Rem surman 05/22/17 - LRG 20310071: Grant execute on dbms_qopatch to
Rem datapatch_role
Rem surman 04/17/17 - Updated requirements for application patches
Rem surman 03/08/17 - 25425451: Intelligent bootstrap
Rem pyam 08/24/16 - RTI 19633358: set nls_length_semantics=byte
Rem surman 07/22/16 - 24341018: Use comments column for build label
Rem surman 07/20/16 - 23170620: Add patch_directory
Rem surman 06/29/16 - 23113885: Post patching support
Rem surman 06/15/16 - 22694961: Application patches
Rem surman 05/10/16 - 23025340: Do not recreate if only view invalid
Rem surman 04/04/16 - 23025340: Add install_id
Rem surman 01/26/16 - 22582783: Use CreateXML
Rem surman 01/07/16 - 22359063: Add patch_descriptor
Rem surman 10/01/15 - 20772435: Drop view
Rem surman 08/20/15 - 20772435: bundle_data back to XMLType
Rem raeburns 04/19/15 - Load dbms_registry packages
Rem surman 03/25/15 - 20762747: UseGetClobVal()
Rem surman 01/06/15 - Update phase
Rem surman 10/08/14 - 19315691: bundle_data to CLOB
Rem surman 09/15/14 - 19547370: No timestamp needed
Rem surman 08/18/14 - Always reload dbms_sqlpatch
Rem surman 07/17/14 - 19189525: Add bootstrap
Rem surman 07/17/14 - Created
Rem
SET SERVEROUTPUT ON
@@?/rdbms/admin/sqlsessstart.sql
-- RTI 19633358: set nls_length_semantics to BYTE before recompiling
ALTER SESSION SET NLS_LENGTH_SEMANTICS=BYTE;
VARIABLE sql_file VARCHAR2(50)
COLUMN sss NEW_VALUE sql_script
-- Validate the SQL registry table and view
DECLARE
reloading_registry BOOLEAN := FALSE;
current_type NUMBER;
table_name_122 VARCHAR2(30);
constraint_name_122 VARCHAR2(30);
FUNCTION column_exists(p_column_name IN VARCHAR2) RETURN BOOLEAN IS
cnt NUMBER;
BEGIN
-- We can't query a nice view like dba_tab_columns because it may
-- be invalid during an upgrade. Sigh.
SELECT COUNT(name)
INTO cnt
FROM col$
WHERE obj# = (SELECT obj#
FROM obj$
WHERE name = 'REGISTRY$SQLPATCH'
AND owner# = 0)
AND name = p_column_name;
IF cnt = 1 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END column_exists;
FUNCTION column_length(p_column_name IN VARCHAR2) RETURN NUMBER IS
l NUMBER;
BEGIN
-- We can't query a nice view like dba_tab_columns because it may
-- be invalid during an upgrade. Sigh.
SELECT length
INTO l
FROM col$
WHERE obj# = (SELECT obj#
FROM obj$
WHERE name = 'REGISTRY$SQLPATCH'
AND owner# = 0)
AND name = p_column_name;
RETURN l;
END column_length;
-- Returns TRUE if the specified object exists and is valid
FUNCTION exists_and_is_valid(p_object_name IN VARCHAR2)
RETURN BOOLEAN IS
object_status dba_objects.status%TYPE;
BEGIN
SELECT status
INTO object_status
FROM dba_objects
WHERE owner = 'SYS'
AND object_name = p_object_name;
dbms_output.put_line(p_object_name || ': ' || object_status);
IF object_status != 'VALID' THEN
RETURN FALSE;
ELSE
RETURN TRUE;
END IF;
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line(p_object_name || ': does not exist');
RETURN FALSE;
END exists_and_is_valid;
-- Executes the requested statement, ignoring errors
PROCEDURE exec_sql(p_sql IN VARCHAR2) IS
BEGIN
EXECUTE IMMEDIATE p_sql;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('exec_sql(' || p_sql || ')');
dbms_output.put_line('ignoring ' || sqlerrm);
END exec_sql;
-- Drops the specified registry object
PROCEDURE drop_registry_table_and_view(p_registry_object IN VARCHAR2,
p_drop_table IN BOOLEAN) IS
BEGIN
-- We will need to reload the registry
reloading_registry := TRUE;
-- Drop table if requested, ignoring errors
IF p_drop_table THEN
dbms_output.put_line('Dropping registry$' || p_registry_object);
exec_sql('DROP TABLE registry$' || p_registry_object);
END IF;
-- Drop views and synonyms, ignoring errors
dbms_output.put_line('Dropping dba/cdb_registry_' || p_registry_object);
exec_sql('DROP VIEW dba_registry_' || p_registry_object);
exec_sql('DROP PUBLIC SYNONYM dba_registry_' || p_registry_object);
exec_sql('DROP VIEW cdb_registry_' || p_registry_object);
exec_sql('DROP PUBLIC SYNONYM cdb_registry_' || p_registry_object);
END drop_registry_table_and_view;
BEGIN
:sql_file := dbms_registry.nothing_script;
-- First check if the registry table exists and is valid
IF NOT exists_and_is_valid('REGISTRY$SQLPATCH') THEN
IF NOT exists_and_is_valid('DBA_REGISTRY_SQLPATCH') THEN
-- Neither table nor view are OK, drop them both
drop_registry_table_and_view('sqlpatch', TRUE);
ELSE
-- 23025340: Table is valid, view is not, drop only the view
drop_registry_table_and_view('sqlpatch', FALSE);
END IF;
END IF;
-- 27283029: Likewise for the ru_info table
IF NOT exists_and_is_valid('REGISTRY$SQLPATCH_RU_INFO') THEN
IF NOT exists_and_is_valid('DBA_REGISTRY_SQLPATCH_RU_INFO') THEN
-- Neither table nor view are OK, drop them both
drop_registry_table_and_view('sqlpatch_ru_info', TRUE);
ELSE
-- 23025340: Table is valid, view is not, drop only the view
drop_registry_table_and_view('sqlpatch_ru_info', FALSE);
END IF;
END IF;
IF NOT reloading_registry THEN
-- Registry table (at least) exists. Check for existence of new columns
-- and create if needed
-- 26281129: Structure of the table as of 18.1 should already be present
-- through database creation or upgrade. Check for the new columns to
-- be sure.
IF NOT column_exists('PATCH_TYPE') OR
NOT column_exists('SOURCE_VERSION') OR
NOT column_exists('TARGET_VERSION') OR
column_exists('BUNDLE_SERIES') THEN
dbms_output.put_line(
'dba_registry_sqlpatch is in pre-18.1 format, renaming and recreating');
SELECT 'reg$sqlpatch$122$' || TO_CHAR(systimestamp, 'YYMMDDHH24MI'),
'reg$sqlpatch_pk$122$' || TO_CHAR(systimestamp, 'YYMMDDHH24MI')
INTO table_name_122, constraint_name_122
FROM sys.dual;
dbms_output.put_line('Renaming registry$sqlpatch to ' || table_name_122);
-- We need to rename the index and constraint first
BEGIN
EXECUTE IMMEDIATE
'ALTER INDEX registry$sqlpatch_pk RENAME TO ' || constraint_name_122;
EXCEPTION
WHEN OTHERS THEN
IF sqlcode = -1418 THEN
NULL; -- Suppress 'index does not exist' error
ELSE
RAISE;
END IF;
END;
EXECUTE IMMEDIATE
'ALTER TABLE registry$sqlpatch' ||
' RENAME CONSTRAINT registry$sqlpatch_pk TO ' || constraint_name_122;
EXECUTE IMMEDIATE
'ALTER TABLE registry$sqlpatch RENAME TO ' || table_name_122;
-- Drop the view only
drop_registry_table_and_view('sqlpatch', FALSE);
END IF;
END IF;
-- Set sql_file if needed
IF reloading_registry THEN
:sql_file := '?/rdbms/admin/catsqlreg.sql';
END IF;
END;
/
PROMPT IGNORABLE ERRORS: ORA-00955
SELECT :sql_file AS sss FROM dual;
@&sql_script
PROMPT IGNORABLE ERRORS: NONE
-- 22694961: Create if needed and grant privileges to the datapatch role
DECLARE
cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO cnt
FROM dba_roles
WHERE role = 'DATAPATCH_ROLE';
IF cnt = 0 THEN
EXECUTE IMMEDIATE 'CREATE ROLE datapatch_role';
END IF;
END;
/
GRANT READ ON v_$mystat TO datapatch_role;
GRANT READ ON v_$session TO datapatch_role;
GRANT READ ON v_$database TO datapatch_role;
GRANT READ ON v_$containers TO datapatch_role;
GRANT READ ON v_$instance TO datapatch_role;
GRANT READ ON gv_$pdbs TO datapatch_role;
GRANT READ ON gv_$instance TO datapatch_role;
GRANT READ ON registry$history TO datapatch_role;
GRANT READ ON dba_registry TO datapatch_role;
GRANT EXECUTE ON dbms_registry TO datapatch_role;
GRANT EXECUTE ON dbms_sqlpatch TO datapatch_role;
GRANT EXECUTE ON dbms_lock TO datapatch_role;
GRANT EXECUTE ON dbms_qopatch TO datapatch_role;
GRANT SELECT, INSERT, UPDATE, DELETE ON dba_registry_sqlpatch
TO datapatch_role, dba;
GRANT SELECT, INSERT, UPDATE, DELETE on dba_registry_sqlpatch_ru_info
TO datapatch_role, dba;
GRANT ALTER SESSION TO datapatch_role;
@?/rdbms/admin/sqlsessend.sql
OHA YOOOO