MINI MINI MANI MO

Path : /opt/oracle/product/18c/dbhomeXE/rdbms/admin/
File Upload :
Current File : //opt/oracle/product/18c/dbhomeXE/rdbms/admin/catgwmcat.sql

Rem
Rem $Header: rdbms/admin/catgwmcat.sql /main/110 2017/09/20 12:33:26 nbenadja Exp $
Rem
Rem catgwmcat.sql
Rem
Rem Copyright (c) 2011, 2017, Oracle and/or its affiliates. 
Rem All rights reserved.
Rem
Rem    NAME
Rem      catgwmcat.sql - Catalog script for GSM on the catalog database
Rem
Rem    DESCRIPTION
Rem      Installation/upgrade script for GSM components on the cloud
Rem      catalog database.
Rem
Rem      Run the script like this:
Rem
Rem         catgwmcat.sql
Rem
Rem    NOTES
Rem      
Rem
Rem
Rem BEGIN SQL_FILE_METADATA
Rem SQL_SOURCE_FILE: rdbms/admin/catgwmcat.sql
Rem SQL_SHIPPED_FILE: rdbms/admin/catgwmcat.sql
Rem SQL_PHASE: CATGWMCAT
Rem SQL_STARTUP_MODE: NORMAL
Rem SQL_IGNORABLE_ERRORS: NONE
Rem SQL_CALLING_FILE: rdbms/admin/catpend.sql
Rem END SQL_FILE_METADATA
Rem
Rem    MODIFIED   (MM/DD/YY)
Rem    itaranov    08/28/17 - v$listener_networks grant
Rem    dcolello    08/23/17 - bug 26513341: add dbid to container_database
Rem    dmaniyan    08/04/17 - Bug 26546365: Add max_chunk_num to table_family
Rem    dmaniyan    06/27/17 - 25443435: Add new column - consistent
Rem    alestrel    06/12/17 - Bug 25992935. Replacing dbms_isched for
Rem                           dbms_isched_agent
Rem    nbenadja    05/05/17 - Fix bug#22145819: Add ddl_intcode for OGG.
Rem    lenovak     05/04/17 - Bug 25989904: grant drop index
Rem    saratho     04/12/17 - adding column database_flags in cloud table
Rem    sdball      03/31/17 - Add failover_restore to service
Rem    dmaniyan    03/22/17 - Bug 25476616:Add child_obj# column to TS_SET_TABLE
Rem    sdball      02/22/17 - Updated for PDB support
Rem    zzeng       01/12/17 - Fix SHARD_NAME for LOCAL_CHUNKS
Rem    sdball      11/02/16 - Update schema to support PDBs
Rem    arjusing    10/03/16 - Bug 23260076: grant select on sha_databases to
Rem                           gds_catalog_select
Rem    arjusing    09/15/16 - Bug 20878412: grant inherit any privileges to
Rem                           gsmadmin_internal
Rem    sdball      08/19/16 - Bug 24319952: grant exempt access to
Rem                           gsmadmin_internal
Rem    vidgovin    08/12/16 - XbranchMerge vidgovin_incrdep2 from
Rem                           st_rdbms_12.2.0.1.0
Rem    vidgovin    08/08/16 - Bug 24428345 - Add orig_ddl_text, ddl_flag to
Rem                           ddl_requests table
Rem    dmaniyan    08/08/16 - Bug 21535006: Grant gds_catalog_select to gsmuser
Rem    sdball      08/05/16 - LRG 19633236: remove constraint in cloud
Rem    itaranov    08/05/16 - XbranchMerge itaranov_bug-24328811 from
Rem                           st_rdbms_12.2.0.1.0
Rem    dmaniyan    07/20/16 - XbranchMerge dmaniyan_secbugs from main
Rem    dcolello    07/19/16 - XbranchMerge dcolello_shfix21 from main
Rem    itaranov    07/19/16 - bug 23740777: cr_gsm_requests dependency
Rem    dcolello    07/14/16 - allow gsmcatuser to use -agent_port 
Rem                             on create shardcatalog
Rem    dcolello    06/24/16 - bug 22151011: move triggers after body creation
Rem    dmaniyan    06/15/16 - Bug 23505098 : Limit index priv on ddl requests
Rem    dcolello    06/01/16 - fix comments
Rem    lenovak     05/26/16 - remove user$ privilege
Rem    sdball      05/11/16 - new ps_order in partition_set
Rem    sdball      04/28/16 - Bug 23199869 : Fix idempotency issue 
Rem    dmaniyan    04/10/16 - Bug 22485421 : Create all chunks table
Rem    vidgovin    04/06/16 - Bug 21533800
Rem    lenovak     04/05/16 - bugfix 23032790
Rem    sdball      03/09/16 - move ddl_requests to sys for security
Rem    itaranov    03/09/16 - shardspaceid to partitionset
Rem    lenovak     03/03/16 - RAC affinity schema changes
Rem    sdball      02/24/16 - Bug 22368133: remove delete action from
Rem                           cr_gsm_requests
Rem    lenovak     02/22/16 - gdsctloutput for catalog_requests
Rem    dcolello    02/17/16 - bug 22743674: add svcusercredential
Rem    dcolello    02/12/16 - add comment for new gdsctl warning message type
Rem    lenovak     02/08/16 - Bug 22669300 fix
Rem    sdball      02/05/16 - Add profile to gsmcatuser
Rem    lenovak     02/04/16 - add gdsctl messages
Rem    yunkzhan    01/28/16 - Change SHART_TS to create segment immediately
Rem                           to avoid ORA-08176 in flashback queries.
Rem    vidgovin    12/07/15 - Bug 22204627 - Add ddl_requests_pwd
Rem    sdball      12/03/15 - Bug 22288229: create views for opatchauto (and
Rem                           others)
Rem    nbenadja    11/25/15 - grant select on dictionary tables to
Rem                           gsmadmin_internal
Rem    dcolello    11/21/15 - VNCR table change for patching support
Rem    dcolello    11/20/15 - more grants for automatic scheduler setup
Rem    ditalian    11/18/15 - make shardspace_id in shard_ts nullable
Rem    dcolello    11/16/15 - remove old schema object names
Rem    ditalian    11/05/15 - make chunk_number in shard_ts nullable
Rem    dcolello    11/03/15 - bug 22145787: make response_info larger
Rem    dcolello    10/19/15 - object rename for production
Rem    lenovak     10/10/15 - new grants to gsmadmin_internal
Rem    sdball      09/25/15 - Bug 21304186: Revioke inherit privs
Rem    lenovak     09/16/15 - more extra privs to gsmadmin_internal
Rem    lenovak     08/31/15 - extra privs to gsmadmin_internal
Rem    sdball      08/10/15 - Bug 20884124: New grants for gsmadmin_role
Rem    dcolello    07/28/15 - add columns to CLOUD table for new syntax
Rem    itaranov    07/23/15 - 21482492 Localchunks def revisited
Rem    dmaniyan    07/14/15 - Bug 21095569: Drop tablespace set issue
Rem    ditalian    07/13/15 - bug #21338419: grant access to dba_tablespaces
Rem    nbenadja    06/26/15 - Add new a privilege to gsmadmin_internal.
Rem    itaranov    06/16/15 - Fix LOCAL_CHUNKS for OGG support
Rem    lenovak     06/15/15 - grant execute on dbms_utility
Rem    sdball      06/05/15 - Support for long identifiers
Rem    sdball      05/15/15 - New field orig_chunks
Rem    sdball      04/02/15 - ddl_num should default to 0 in database table for
Rem                           upgrade
Rem    sdball      03/31/15 - More updates for 12.2 sharding
Rem    lenovak     03/30/15 - grant dba_constraints to gsmadmin_internal
Rem    jorgrive    03/23/15 - add columns in table database
Rem    sdball      03/10/15 - Add targets to gsm_request
Rem    ditalian    03/09/15 - grant privileges for split
Rem    sdball      03/04/15 - More additions for 12.2 sharding
Rem    dcolello    12/10/14 - create database support
Rem    lenovak     12/10/14 - catalog region
Rem    itaranov    12/09/14 - After-merge chunks fix
Rem    skayoor     11/30/14 - Proj 58196: Change Select priv to Read Priv
Rem    sdball      10/17/14 - Sharding changes for 12.2
Rem    nbenadja    09/12/14 - Add the ts_set_tables.
Rem    ralekra     09/08/14 - Catalog changes required by OGG
Rem    nbenadja    08/04/14 - Add key_level to the sharkey_columns primary key.
Rem    pyam        05/27/14 - fix table column ordering
Rem    itaranov    06/20/14 - LOCAL_CHUNK related views
Rem    devghosh    04/08/14 - bug17709018: add grant
Rem    surman      01/23/14 - 13922626: Update SQL metadata
Rem    sdball      12/18/13 - Add tables for shard support
Rem    sdball      12/05/13 - Add ddl_requests for sharding
Rem    cechen      08/22/13 - add domains for PKI keys in database and cloud
Rem    sdball      08/15/13 - Add db_type field to database table
Rem    lenovak     07/29/13 - shard support
Rem    lenovak     07/11/13 - grant select from cloud to pooladmins
Rem    sdball      06/12/13 - Remove primary key requirement from gsm_requests
Rem    sdball      05/15/13 - Add data_vers to cloud
Rem    sdball      05/06/13 - Add weights to region
Rem    thbaby      05/06/13 - 16768773: remove creation of CDB_SERVICES
Rem    itaranov    04/24/13 - Grant killing sessions to gsmadmin_internal
Rem    nbenadja    04/22/13 - Add logoff trigger.
Rem    itaranov    03/25/13 - Grant privs to import
Rem    sdball      03/13/13 - Add instance fields and types for admin DBs
Rem    sdball      02/26/13 - Grant select on v_$version
Rem    nbenadja    02/21/13 - grant the use of dbms_server_alert package.
Rem    akruglik    02/05/13 - (bug 16194686) disambiguate reference to
Rem                           gv$active_services in ALTER USER SET
Rem                           CONTAINER_DATA statement
Rem    sdball      01/18/13 - Add versions and database parameters
Rem    sdball      01/11/13 - Grant select on sessions.
Rem    nbenadja    01/10/13 - Extend database table to store threshold values.
Rem    aikumar     11/27/12 - bug-15925294:Change dbms_lock_allocated_v2 back
Rem                           to dbms_lock_allocated
Rem    lenovak     11/07/12 - runtime status flags to the catalog
Rem    rpang       10/11/12 - Use new dbms_network_acl_admin API
Rem    nbenadja    10/11/12 - Add container_data for grants in CDB.
Rem    sdball      08/28/12 - Add ACLs for GSMADMIN_INTERNAL
Rem    sdball      08/03/12 - Add gds_catalog_select role
Rem    nbenadja    07/30/12 - Grant select on gv_$active_services.
Rem    nbenadja    06/23/12 - Fix multiple CDB returned from gv$_database.
Rem    sdball      06/13/12 - Support for number of instances
Rem    nbenadja    06/21/12 - Re-create cdb_services, in case it hasnt been
Rem                           created during an upgrade.
Rem    nbenadja    06/21/12 - Handle CDB databases.
Rem    nbenadja    06/15/12 - Grant select_catalog_role to gsmadmin_internal.
Rem    sdball      06/07/12 - grant gv$instance to gsmadmin_internal
Rem    sdball      06/04/12 - Support for non-unique service name
Rem    sdball      06/04/12 - Defer DBMS_RLS calls to catalog creation because
Rem                           they require EE (Bug 14143065)
Rem    nbenadja    05/09/12 - Hande services in PDBs.
Rem    sdball      05/08/12 - Create verify objects
Rem    sdball      04/16/12 - dbms_lock_allocated is now dbms_lock_allocated_v2
Rem    sdball      03/26/12 - move PLB and SQL to correct installers
Rem    sdball      03/12/12 - Remove packages to corret install location
Rem                           Remove gsm_admin user
Rem                           Grant privs on DBMS_LOCK
Rem    sdball      02/22/12 - grant gsm_change_message only to
Rem                           gsmadmin_internal
Rem    sdball      01/04/12 - Refferential integrity checks
Rem    sdball      12/13/11 - Checking parameters
Rem    sdball      12/05/11 - change pooladmin_role to gsm_pooladmin_role
Rem    sdball      11/29/11 - Autovncr functionality
Rem    sdball      11/09/11 - Add gv_$lock for RAC
Rem    sdball      10/28/11 - gsmadmin_internal needs select on dba_locks
Rem    sdball      10/28/11 - gsmadmin_internal needs CREATE JOB privilege
Rem    sdball      10/25/11 - Add date field to gsm_requests
Rem    sdball      10/19/11 - use v_$ rather than gv_$ tables.
Rem                           add mastergsm field to cloud table
Rem    lenovak     08/22/11 - grant ALTER SYSTEM to gsm_admin_role
Rem    lenovak     07/22/11 - vncr support
Rem    mjstewar    07/21/11 - Change region_sequence
Rem    mjstewar    04/25/11 - Created
Rem

@@?/rdbms/admin/sqlsessstart.sql

-- SET ECHO ON
-- SPOOL catgwmcat.log

prompt
prompt
prompt Starting Oracle GSM Catalog DB Installation ...
prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
prompt

--*****************
-- Create GSM Roles
--*****************

----------------
-- gsmadmin_role
----------------

-- Create role for GSM cloud administrator
CREATE ROLE gsmadmin_role;
GRANT connect to gsmadmin_role;

GRANT execute on gsmadmin_internal.dbms_gsm_common to gsmadmin_role;

-----------------
-- gsm_pooladmin_role
-----------------

-- Create role GSM pool administrator
CREATE ROLE gsm_pooladmin_role;
GRANT connect to gsm_pooladmin_role;

GRANT execute on gsmadmin_internal.dbms_gsm_common to gsm_pooladmin_role;
/

-- Create gds_catalog_select role
CREATE ROLE gds_catalog_select;
GRANT gds_catalog_select to gsmuser_role;  

--*****************
-- Create GSM Users
--*****************

--------------------
-- gsmadmin_internal
--------------------

-- gsmadmin_internal user exists on all databases,
-- but we need to give it some more privileges on the cloud
-- catalog database.

-- So that dbms_gsm_cloudadmin can execute dbms_aqadm.add_subscriber()
grant execute on dbms_aqadm to gsmadmin_internal;

-- So that dbms_gsm_cloudamdin can execute dbms_aq.enqueue()
grant execute on dbms_aq to gsmadmin_internal;

-- So that we can grab locks
grant execute on dbms_lock to gsmadmin_internal;

-- for environment variables
grant execute on dbms_system to gsmadmin_internal;
 
-- So that we can use alerts 
grant execute on sys.dbms_server_alert to gsmadmin_internal;

-- So that we can create VPD policies in dbms_gsm_cloudadmin
grant execute on sys.dbms_rls to gsmadmin_internal;

-- So that dbms_gsm_cloudadmin can execute dbms_aqadm.purge_table()
grant aq_administrator_role to gsmadmin_role;

-- So the VPD routine can select from dba_role_privs
grant select on dba_role_privs to gsmadmin_internal;

-- So that dbms_gsm_utility can get current RDBMS version
grant select on v_$version to gsmadmin_internal;

-- So that LOCAL_CHUNKS had column info
grant select on sys.col$ to gsmadmin_internal with grant option;

-- So that dbms_gsm_cloudadmin can check if spfile is set.
grant select on v_$parameter to gsmadmin_internal;

-- so that we can check for GSM master lock
grant select on sys.dbms_lock_allocated to gsmadmin_internal;

-- so that we can check for GSM master lock
grant select on sys.gv_$lock to gsmadmin_internal;

-- for parameter checking
grant select on sys.dba_tab_columns to gsmadmin_internal;

-- so that we can check for CDB database 
grant select on sys.gv_$database to gsmadmin_internal;

-- so we can check running instances
grant select on sys.gv_$instance to gsmadmin_internal;
grant select on sys.v_$instance to gsmadmin_internal;

-- so we can find and kill service sessions
grant select on sys.gv_$session to gsmadmin_internal;
grant select on sys.v_$session to gsmadmin_internal;

-- so we can access privilege table
grant select any dictionary to gsmadmin_internal;

-- Because we create sequences within the schema
grant create sequence to gsmadmin_internal;

-- Bug 20878412: To enable shard ddl propagation 
grant inherit privileges on user sys to gsmadmin_internal;
grant inherit any privileges to gsmadmin_internal;

-- So that we can assign users to the gsm_pooladmin_role
grant grant any role to gsmadmin_internal;

-- So that we can lock/unlock the gsmcatuser account
grant alter user to gsmadmin_internal;

-- So that gsm will be able to exec alter system register on catalog
grant alter system to gsmadmin_role;

-- for alter session enable shard ddl
grant alter session to gsmadmin_role;

-- So we can set up the scheduler
grant execute on sys.dbms_isched_agent to gsmadmin_internal;

-- So that we can create and update ACLs in dbms_gsm_cloudadmin.setupACLs
grant execute on dbms_network_acl_admin to gsmadmin_internal;
grant select on dba_network_acls to gsmadmin_internal;

-- Grant killing sessions to gsmadmin_internal (for import)
grant alter system to gsmadmin_internal;

-- so that we can crerate jobs
grant create job to gsmadmin_internal;
grant create any credential to gsmadmin_internal;
grant select on dba_credentials to gsmadmin_internal;
grant create external job to gsmadmin_internal;

-- and monitor them
grant select on dba_scheduler_job_run_details to gsmadmin_internal;
grant select on dba_scheduler_external_dests to gsmadmin_internal;

-- For shard user creation.
grant grant any privilege to gsmadmin_internal;

-- For CDB databases
grant select on sys.dba_services to gsmadmin_internal;
grant select on sys.cdb_services to gsmadmin_internal;

grant select on sys.gv_$active_services to gsmadmin_internal;

-- so we can create dblinks for chunk moves

grant create database link to gsmadmin_internal;
grant create any job to gsmadmin_internal;
grant create any table to gsmadmin_internal;
grant select any table to gsmadmin_internal;
grant alter any table to gsmadmin_internal;
grant alter any index to gsmadmin_internal;
grant lock any table to gsmadmin_internal;
grant unlimited tablespace to gsmadmin_internal;
grant create tablespace to gsmadmin_internal;
grant drop tablespace to gsmadmin_internal;
grant DATAPUMP_EXP_FULL_DATABASE to gsmadmin_internal;
grant DATAPUMP_IMP_FULL_DATABASE to gsmadmin_internal;
grant select on dba_constraints to gsmadmin_internal;
grant select on dba_tab_partitions to gsmadmin_internal;
grant select on dba_tab_subpartitions to gsmadmin_internal;
grant select on dba_part_tables to gsmadmin_internal;
grant select on dba_part_indexes to gsmadmin_internal;
grant select on dba_indexes to gsmadmin_internal;
grant select on DBA_IND_PARTITIONS to gsmadmin_internal;
grant select on DBA_IND_SUBPARTITIONS to gsmadmin_internal;
grant alter tablespace to gsmadmin_internal;
grant select on dba_constraints to gsmadmin_internal;
grant select on sys.V_$RESTORE_POINT to GSMADMIN_INTERNAL;
grant drop any index to gsmadmin_internal;
grant read on sys.V_$LISTENER_NETWORK to GSMADMIN_INTERNAL;

-- so we can move data under VPD restrictions
grant exempt access policy to gsmuser;

grant execute on dbms_utility to gsmadmin_internal;
-- SHARDMERGE_TODO: This grant does not work during upgrade
-- ORA-22930: directory does not exist
-- grant read,write on directory DATA_PUMP_DIR to gsmadmin_internal;

-- for remote query execution
grant execute on sys.dbms_gsm_fixed to sysdg;
grant execute on UTL_RAW to gsmadmin_internal;
grant execute on sys.dbms_sys_sql to gsmadmin_internal;
grant alter session to gsmadmin_internal;
grant execute on sys.dbms_pipe to gsmadmin_internal;

-- data objectnumber generation
grant select on sys.obj$ to gsmadmin_internal;
grant execute on sys.dbms_shared_pool to gsmadmin_internal;

-- So that we can create SYS_SHARD_TS for move in user-defined sharding.
grant select on dba_tablespaces to gsmadmin_internal;

--for affinity-based routing
grant select on sys.partcol$ to gsmadmin_internal;
grant select on sys.col$ to gsmadmin_internal;
grant select on sys.tabpart$ to gsmadmin_internal;
grant read on GV_$GCSPFMASTER_INFO to gsmadmin_internal;
grant read on GV_$GWM_RAC_AFFINITY to gsmadmin_internal;

-- for shard view
grant select on v_$dg_broker_config to gsmadmin_internal with grant option;
/

alter session set "_oracle_script"=true;

DECLARE
 isCDB varchar2(3);
 stmt  varchar (1024);
BEGIN
  select distinct CDB into isCDB from gv_$database;
  IF (isCDB = 'YES')
  THEN
     stmt := 'grant set container to gsmadmin_internal container = all';
     execute immediate stmt;
     stmt :=  'grant alter session to gsmadmin_internal container = all';
     execute immediate stmt;
     stmt := 'alter user gsmadmin_internal set container_data = all' ||
              '  for cdb_services container = current';
     execute immediate stmt;
     stmt := 'alter user gsmadmin_internal set container_data = all' ||
              '  for "PUBLIC".gv$active_services container = current';
     execute immediate stmt;
 END IF;

END;
/

-------------
-- gsmcatuser
-------------

-- GSM process connects to GSM cloud catalog database as
-- gsmcatuser.  Password will be changed by GSM when first
-- GSM is added to the cloud.

CREATE USER gsmcatuser identified by gsm
  account lock password expire;
  
DECLARE
  conId   NUMBER := 0;
BEGIN
  begin
    execute immediate
      'select SYS_CONTEXT(''USERENV'', ''CON_ID'') from sys.dual'
      into conId;
  exception
    WHEN OTHERS THEN IF SQLCODE = -2003 THEN conId := 0; ELSE RAISE; END IF;
  end;

  IF conId = 0 THEN
    declare
      already_exists exception;
      pragma exception_init(already_exists,-02379);
    begin
      execute immediate
        'CREATE PROFILE gsm_prof LIMIT FAILED_LOGIN_ATTEMPTS 10000000';
    exception when already_exists then null;
    end;
    execute immediate 'ALTER USER gsmuser PROFILE gsm_prof';
  END IF;
END;
/

GRANT connect to gsmcatuser;

-- So that gsmcatuser can call dbms_aq.dequeue(), dbms_aq.listen()
grant execute on dbms_aq to gsmcatuser;

-- So that gsmcatuser can call dbms_aqadm.add_subscriber()
grant aq_administrator_role to gsmcatuser;

-- revike inherit privs
declare
  already_revoked exception;
  pragma exception_init(already_revoked,-01927);
begin
  execute immediate 
    'REVOKE INHERIT PRIVILEGES ON USER gsmcatuser FROM public';
exception
  when already_revoked then
    null;
end;
/

-- needed to allow 'create shardcatalog -agent_port ...' to
--  succeed if gsmcatuser is creating the catalog since
--  DBMS_GSM_XDB is invoker's rights
grant inherit privileges on user gsmcatuser to gsmadmin_internal;

ALTER SESSION SET CURRENT_SCHEMA = gsmadmin_internal;

--****************************
-- Create Cloud Catalog Tables
--****************************

CREATE TABLE region (
   name         VARCHAR2(128) NOT NULL,
   num          NUMBER        NOT NULL,
   buddy_region NUMBER        DEFAULT NULL REFERENCES region(num),
   change_state CHAR(1)       DEFAULT NULL,
   weights      VARCHAR(500)  DEFAULT NULL,
   CS_WEIGHT    NUMBER ,      -- region weight for cross-shard ops
   PRIMARY KEY (name),
   CONSTRAINT num_unique UNIQUE (num)
 )
/
show errors

-- region_sequence is used for generating region.num.
-- GSM listener requires that region.num be in the range 0-9
CREATE SEQUENCE region_sequence minvalue 0 maxvalue 9 cache 9 cycle
/
show errors

CREATE TABLE gsm (
   name            VARCHAR2(128)   NOT NULL,
   num             NUMBER          NOT NULL,
   endpoint1       VARCHAR2(512)   NOT NULL,
   endpoint2       VARCHAR2(512)   NOT NULL,
   ons_port_local  NUMBER          NOT NULL,
   ons_port_remote NUMBER          NOT NULL,
   region_num      NUMBER          NOT NULL REFERENCES region(num),
   oracle_home     VARCHAR2(4000),
   hostname        VARCHAR2(256),
   version         VARCHAR2(30)    DEFAULT NULL, --GSM version
   change_state    CHAR(1)         DEFAULT NULL, 
   PRIMARY KEY (name)
 )
/
show errors

CREATE TABLE cloud (
   name               VARCHAR2(128) NOT NULL,
   encryption_key     VARCHAR2(30),
   change_seq#        NUMBER,
   next_db_num        NUMBER,
   mastergsm          VARCHAR2(128) DEFAULT NULL,
   autovncr           NUMBER(1)     DEFAULT 1,       -- boolean (1 TRUE, 0 FALSE)
   max_instances      NUMBER        DEFAULT NULL ,
   private_key        RAW(2000)     DEFAULT NULL,    -- PKI private key
   public_key         RAW(2000)     DEFAULT NULL,    -- PKI public key
   prvk_enc_str       RAW(1000)     DEFAULT NULL,    -- private key sig string 
   data_vers          VARCHAR2(30)  DEFAULT NULL,    -- Last update version
                                                     -- of catalog data
   last_ddl_num       NUMBER        DEFAULT 0,       --last ddl_num
   last_syncddl_num   NUMBER        DEFAULT 0,       --last sync ddl_num
   region_num         NUMBER,                        -- catalog region
   deploy_state       NUMBER        DEFAULT 0,
   objnum_gen         NUMBER        DEFAULT 1000000, -- object number generator
   sharding_type      NUMBER(1)     DEFAULT NULL,    -- 0 - not sharded
                                                     -- 1 - system managed
                                                     -- 2 - user-defined
                                                     -- 3 - composite
   replication_type   NUMBER(1)     DEFAULT NULL,    -- 0 - DataGuard
                                                     -- 1 - GoldenGate
   protection_mode    NUMBER(1)     DEFAULT NULL,    -- 0 - max protection
                                                     -- 1 - max availability 
                                                     -- 2 - max performance
   replication_factor NUMBER        DEFAULT NULL,
   chunk_count        NUMBER        DEFAULT NULL,
   database_flags     CHAR(1)       DEFAULT NULL,    -- 'C' - catalog
                                                     -- 'S' or null - shard
   PRIMARY KEY (name)
 )
/
show errors

CREATE SEQUENCE msg_sequence NOCACHE
/
show errors

CREATE TABLE GDSCTL_MESSAGES(
   session_id      NUMBER   NOT NULL,
   message         VARCHAR2(1024),
   msg_type        NUMBER   default 0,
   -- 0 -regular
   -- 1 -start message
   -- 2 - end message
   -- 3 - warning message
   message_id      NUMBER,
   message_date    DATE default SYSDATE
 )
/
show errors

CREATE SEQUENCE vncr_sequence
/
show errors

CREATE TABLE vncr(
   name            VARCHAR2(512)   NOT NULL,
   group_id        VARCHAR2(128),
   hostid          NUMBER          NOT NULL,
   hostname        VARCHAR2(256)
 )
/
show errors

-- need to ignore pre-existing key for downgrade->upgrade
BEGIN
   EXECUTE IMMEDIATE 
     'ALTER TABLE vncr ADD CONSTRAINT pk_vncr primary key(hostid)';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE IN (-02260) THEN NULL;
      ELSE RAISE;
      END IF;
END;
/
show errors

ALTER TABLE vncr ADD CONSTRAINT vncr_name UNIQUE(name)
/
show errors

-- For compatibility with older code
CREATE OR REPLACE TRIGGER VNCR_INSERT 
BEFORE INSERT OR UPDATE
ON VNCR
FOR EACH ROW
BEGIN
  IF :new.hostid IS NULL THEN
    :new.hostid := VNCR_SEQUENCE.NEXTVAL;
  END IF;
END;
/
show errors

CREATE SEQUENCE gsm_sequence
/
show errors

CREATE TABLE database_pool (
   name             VARCHAR2(128) NOT NULL,
   broker_config    NUMBER(1),    -- boolean (1: TRUE, 0: FALSE),
   replication_type NUMBER(1)     DEFAULT NULL, -- 0 - DataGuard
                                                -- 1 - GoldenGate
   pool_type        NUMBER(1)     DEFAULT 0,    -- 0 - GDS
                                                -- 1 - Sharded
   PRIMARY KEY (name)
 )
/
show errors

CREATE TABLE database_pool_admin (
   pool_name VARCHAR2(128) REFERENCES database_pool(name),
   user_name VARCHAR2(128) NOT NULL,  -- references "user" table
   PRIMARY KEY (pool_name, user_name)
 )
/
show errors

-- for sharding
CREATE SEQUENCE shardspace_sequence
/
show errors

CREATE TABLE SHARD_SPACE (
   SHARDSPACE_ID    NUMBER        NOT NULL,
   NAME             VARCHAR2(128) NOT NULL,
   CHUNKS           NUMBER,
   ORIG_CHUNKS      NUMBER,  
   CHUNKS_CREATED   NUMBER(1),
   DATABASE_POOL    VARCHAR(128),
   PROTECTION_MODE  NUMBER(1),
   STATUS           NUMBER(1)     DEFAULT NULL,
   PRIMARY KEY (shardspace_id),
   CONSTRAINT ss_name_unique UNIQUE (name)
 ) 
/
show errors

ALTER TABLE shard_space ADD CONSTRAINT ss_in_pool
   FOREIGN KEY (database_pool)
   REFERENCES database_pool(name)
/
show errors

CREATE TABLE BROKER_CONFIGS (
   DRSET_NUMBER    NUMBER         NOT NULL,
   SHARDSPACE_ID   NUMBER         DEFAULT NULL,
   PROTECTION_MODE NUMBER(1),     -- redundant copy of shardspace value
   STATUS          NUMBER,
   PARAMETERS      dbparams_list  DEFAULT NULL,
   DBID            NUMBER         DEFAULT NULL,
   DB_NAME         VARCHAR2(30)   DEFAULT NULL,
   IS_MONITORED    NUMBER(1)      DEFAULT 0,    -- Boolean (1 TRUE, 0 FALSE)
   MINOBJ_NUM      NUMBER         DEFAULT NULL, --obj number range min
   MAXOBJ_NUM      NUMBER         DEFAULT NULL, --obj number range max 
   OBSERVER_STATE  VARCHAR2(512), -- observer state message   
   PRIMARY KEY (drset_number)
 )
/
show errors

ALTER TABLE broker_configs ADD CONSTRAINT bk_in_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

-- For shardgroup surrogate key
CREATE SEQUENCE shardgroup_sequence
/
show errors

CREATE TABLE SHARD_GROUP (
     SHARDGROUP_ID     NUMBER        NOT NULL, 
     NAME              VARCHAR2(128) NOT NULL, 
     REGION_NUM        NUMBER        DEFAULT NULL, 
     REPFACTOR         NUMBER,
     CHUNKS            NUMBER, 
     CHUNK_LOC_CREATED NUMBER(1)     DEFAULT 0,  -- boolean (1 TRUE, 0 FALSE)
     DEPLOY_AS         NUMBER(1)     DEFAULT 0,  -- 0 = primary
                                                 -- 1 = non-active standby
                                                 -- 2 = active standby
     SHARDSPACE_ID     NUMBER        NOT NULL,
     STATUS            NUMBER        DEFAULT NULL,
     DEST              NUMBER,
     PRIMARY KEY (shardgroup_id),
     CONSTRAINT sg_name_unique UNIQUE (name)
    ) 
/
show errors

ALTER TABLE shard_group ADD CONSTRAINT sg_in_region
   FOREIGN KEY (region_num)
   REFERENCES region(num)
/
show errors

ALTER TABLE shard_group ADD CONSTRAINT sg_in_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

-- ddl_requests needs to be in sys schema for security
CREATE TABLE sys.ddl_requests (
   ddl_num        NUMBER,
   ddl_text       CLOB          NOT NULL,
   pwd_count      NUMBER,
   schema_name    VARCHAR2(128) NOT NULL, -- really current user
                                          -- SHARD_TODO: need to fix this but
                                          --   requires a GSM change
   object_name    VARCHAR(128)  DEFAULT NULL,
   operation_type CHAR(1)       NOT NULL,     --'S' - sync signal (noop on db side)
                                              --'C' - DDL create object
                                              --'M' - DDL modify object
                                              --'D' - DDL drop object
                                              --'N' - New shardspace (GDSCTL)
                                              --'T' - New Table family
   object_type    NUMBER        DEFAULT NULL,
   params         VARCHAR(4000) DEFAULT NULL, -- same as gsm_change_message.params
   ignore_flag    NUMBER,
   sess_info      CLOB  DEFAULT NULL,
   shardspace     VARCHAR2(128) DEFAULT NULL,
   object_owner   VARCHAR2(128),
   op_code        CHAR(1) DEFAULT NULL,       -- Not used 
   orig_ddl_text  CLOB          DEFAULT  NULL,
   ddl_flag       NUMBER,
                                              -- 0 - Run ddl_text
                                              -- 1 - Replace with orig_ddl_text
   ddl_intcode    NUMBER        DEFAULT NULL, -- OGG DDL internal code
   PRIMARY KEY (ddl_num)
 )
/
show errors

GRANT SELECT,UPDATE,DELETE,INSERT ON sys.ddl_requests to gsmadmin_internal
/
show errors

CREATE OR REPLACE synonym ddl_requests FOR sys.ddl_requests
/
show errors

CREATE table sys.ddl_requests_pwd (
   ddl_num            NUMBER,
   pwd_begin          NUMBER,
   enc_pwd            RAW(128) NOT NULL
 )
/
show errors

GRANT SELECT,UPDATE,DELETE,INSERT ON sys.ddl_requests_pwd to gsmadmin_internal
/
show errors

CREATE OR REPLACE synonym ddl_requests_pwd FOR sys.ddl_requests_pwd
/
show errors

CREATE SEQUENCE drset_sequence START WITH 1 NOCACHE
/
show errors

CREATE TABLE container_database (
   name                   VARCHAR2(30)    NOT NULL,
   connect_string         VARCHAR2(512)   NOT NULL,
   status                 CHAR(1)         NOT NULL,  -- TBD
   scan_address           VARCHAR2(512)   DEFAULT NULL,
   ons_port               NUMBER          DEFAULT NULL,
   num_assigned_instances NUMBER          NOT NULL,
   srlat_thresh           NUMBER          DEFAULT 20,  -- disk threhold
   cpu_thresh             NUMBER          DEFAULT 75,  -- cpu threshold
   version                VARCHAR2(30)    DEFAULT NULL, -- database version
   db_type                CHAR(1)         DEFAULT NULL, -- 'N': Non RAC
                                                        -- 'A': Admin RAC
                                                        -- 'P': Policy RAC
                                                        -- 'U': Unknown
   encrypted_gsm_password RAW(2000)       DEFAULT NULL, -- enc gsm password
   hostid                 NUMBER          DEFAULT NULL, 
   oracle_home            VARCHAR2(4000)  DEFAULT NULL,
   create_state           CHAR(1)        DEFAULT NULL, -- 'N' – not created
                                                         -- 'C' - created
   DRSET_NUMBER           NUMBER         DEFAULT NULL,    
   DEPLOY_AS              NUMBER(1)      DEFAULT 0,  -- 0 = primary
                                                     -- 1 = non-active standby
                                                     -- 2 = active standby
   is_monitored           NUMBER(1)      DEFAULT 0,
   dg_params              dbparams_list,
   FLAGS                  NUMBER         DEFAULT NULL,  
   -- parameters from 'create cdb'
   DESTINATION            VARCHAR2(128)  DEFAULT NULL,
   CREDENTIAL             VARCHAR2(128)  DEFAULT NULL,
   DBPARAMFILE            VARCHAR2(128)  DEFAULT NULL,
   DBTEMPLATEFILE         VARCHAR2(128)  DEFAULT NULL,
   NETPARAMFILE           VARCHAR2(128)  DEFAULT NULL,
   -- database info passed from 'create cdb' to 'deploy'
   SYS_PASSWORD           VARCHAR2(128)  DEFAULT NULL,
   SYSTEM_PASSWORD        VARCHAR2(128)  DEFAULT NULL,
   SVCUSERCREDENTIAL      VARCHAR2(128)  DEFAULT NULL,
   DBNAME                 VARCHAR2(9)    DEFAULT NULL,
   DBDOMAIN               VARCHAR2(256)  DEFAULT NULL,
   DBUNIQUENAME           VARCHAR2(30)   DEFAULT NULL,
   INSTANCENAME           VARCHAR2(255)  DEFAULT NULL,
   RACK                   VARCHAR2(128)  DEFAULT NULL,
   DBID                   NUMBER         NOT NULL,
   PRIMARY KEY (name)
 )
 /
 show errors

-- generated internal DB number, this is a numeric unique value
-- assigned to each database which is as dense as possible
-- (avoids holes in the numbers), unlike databae_num, which is
-- generally very sparse because of holes left for multiple
-- instances on RAC (default 10 gaps per number)
CREATE SEQUENCE int_dbnum_sequence START WITH 1 NOCACHE
/
show errors

CREATE TABLE database (
   name                   VARCHAR2(30)    NOT NULL,
   pool_name              VARCHAR2(128)   REFERENCES database_pool(name),
   region_num             NUMBER          DEFAULT NULL REFERENCES region(num),
   gsm_password           VARCHAR2(128)   NOT NULL,
   connect_string         VARCHAR2(512)   NOT NULL,
   database_num           NUMBER          NOT NULL,
   status                 CHAR(1)         NOT NULL,  -- 'D': default
                                                     -- 'I': incomplete add
                                                     -- 'S': needs reSync
                                                     -- 'R': logically removed
                                                     -- 'U': Undeployed (ignored by GSM)
   scan_address           VARCHAR2(512)   DEFAULT NULL,
   ons_port               NUMBER          DEFAULT NULL,
   num_assigned_instances NUMBER          NOT NULL,
   srlat_thresh           NUMBER          DEFAULT 20,  -- disk threshold
                                          -- Should be the same value as
                                          -- dbms_gsm_common.default_srlat_thresh
   cpu_thresh             NUMBER          DEFAULT 75,  -- cpu threshold
                                          -- Should be the same value as
                                          -- dbms_gsm_common.default_cpu_thresh 
   version                VARCHAR2(30)    DEFAULT NULL, -- database version
   db_type                CHAR(1)         DEFAULT NULL, -- 'N': Non RAC
                                                        -- 'A': Admin RAC
                                                        -- 'P': Policy RAC
                                                        -- 'U': Unknown
   encrypted_gsm_password RAW(2000)       DEFAULT NULL, -- enc gsm password
   hostid                 NUMBER          DEFAULT NULL, 
   oracle_home            VARCHAR2(4000)  DEFAULT NULL,
   shardgroup_id          NUMBER         DEFAULT NULL,
   ddl_num                NUMBER         DEFAULT 0,
   ddl_error              VARCHAR2(4000) DEFAULT NULL, --DDL error message. 
                                         -- If null, DB was unavailable
                                         -- this DB is subject for autorcv
   dpl_status             NUMBER         DEFAULT 0,    -- 0 - Not deployed
                                                       -- 1 - Deploy requested
                                                       -- 2 - Chunk deployment complete
                                                       -- 3 - Deployed
                                                       -- 4 - deployment error
   conv_state             CHAR(1)        DEFAULT NULL, -- 'S' - seed
                                                       -- 'C' - converted
   DRSET_NUMBER           NUMBER         DEFAULT NULL,    
   DEPLOY_AS              NUMBER(1)      DEFAULT 0,    -- 0 = primary
                                                       -- 1 = non-active standby
                                                       -- 2 = active standby
   is_monitored           NUMBER(1)      DEFAULT 0,    -- Boolean (1 TRUE, 0 FALSE)
   SHARDSPACE_ID          NUMBER         DEFAULT NULL,
   dg_params              dbparams_list,
   FLAGS                  NUMBER         DEFAULT NULL,  
   -- parameters from 'create database'
   DESTINATION            VARCHAR2(128)  DEFAULT NULL,
   CREDENTIAL             VARCHAR2(128)  DEFAULT NULL,
   DBPARAMFILE	          VARCHAR2(128)  DEFAULT NULL,
   DBTEMPLATEFILE         VARCHAR2(128)  DEFAULT NULL,
   NETPARAMFILE           VARCHAR2(128)  DEFAULT NULL,
   -- database info passed from 'create database' to 'deploy'
   SYS_PASSWORD           VARCHAR2(128)  DEFAULT NULL,
   SYSTEM_PASSWORD        VARCHAR2(128)  DEFAULT NULL,
   SVCUSERCREDENTIAL      VARCHAR2(128)  DEFAULT NULL,
   DBNAME                 VARCHAR2(9)    DEFAULT NULL,
   DBDOMAIN               VARCHAR2(256)  DEFAULT NULL,
   DBUNIQUENAME           VARCHAR2(30)   DEFAULT NULL,
   INSTANCENAME           VARCHAR2(255)  DEFAULT NULL,
   MINOBJ_NUM             NUMBER         DEFAULT NULL, --obj number range min
   MAXOBJ_NUM             NUMBER         DEFAULT NULL, --obj number range max
   -- Pending requests on this database. If gsm_request# is non-zero
   -- other fields may contains info about request for this DB
   GSM_REQUEST#           NUMBER         DEFAULT 0,
   response_code          NUMBER         DEFAULT NULL,
   response_info          VARCHAR2(4000) DEFAULT NULL,
   error_info             VARCHAR2(4000) DEFAULT NULL,
   -- internal dense DB number, not used externally
   -- must be populated by int_dbnum_sequence
   int_dbnum              NUMBER         DEFAULT 0,
   RACK                   VARCHAR2(128)  DEFAULT NULL,
    -- following columns are required by OGG only   
   cdb_name               VARCHAR2(128)  DEFAULT NULL, -- if db is a pdb, NULL if non-CDB
   gg_service             VARCHAR2(4000) DEFAULT NULL, -- OGG service descriptor
   gg_password            RAW(2000)      DEFAULT NULL, -- OGG admin password (encrypted)
   spare1                 VARCHAR2(4000) DEFAULT NULL,   
   spare2                 VARCHAR2(4000) DEFAULT NULL,
   -- used for PDB as shard support...do NOT use cdb_name above
   --   unless in OGG code
   container              VARCHAR2(128)  DEFAULT NULL,
   PRIMARY KEY (database_num)
 )
/
show errors

ALTER TABLE DATABASE ADD CONSTRAINT in_vncr
   FOREIGN KEY (hostid)
   REFERENCES vncr(hostid)
/
show errors

ALTER TABLE DATABASE ADD CONSTRAINT in_shardgroup
   FOREIGN KEY (shardgroup_id)
   REFERENCES shard_group(shardgroup_id)
/
show errors

ALTER TABLE DATABASE ADD CONSTRAINT in_drset
   FOREIGN KEY (drset_number)
   REFERENCES broker_configs(drset_number)
/
show errors

ALTER TABLE DATABASE ADD CONSTRAINT in_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

ALTER TABLE database ADD CONSTRAINT name_unique UNIQUE(name)
/
show errors

ALTER TABLE database ADD CONSTRAINT in_container
   FOREIGN KEY (container)
   REFERENCES container_database(name)
/
show errors

-- for 'create database'
CREATE SEQUENCE SID_SEQUENCE
/
show errors

CREATE SEQUENCE FILES_SEQUENCE
/
show errors

CREATE TABLE FILES (
   FILE_NAME VARCHAR2(128) NOT NULL,
   CONTENT   CLOB          NOT NULL,
   POOL_NAME VARCHAR2(128) REFERENCES database_pool(name),
   PRIMARY KEY (FILE_NAME)
 )
/
show errors

CREATE SEQUENCE CREDENTIAL_SEQUENCE
/
show errors

CREATE TABLE CREDENTIAL (
   CREDENTIAL_NAME VARCHAR2(128) NOT NULL,
   POOL_NAME       VARCHAR2(128) REFERENCES database_pool(name),
   PRIMARY KEY (CREDENTIAL_NAME)
 )
/
show errors

CREATE SEQUENCE family_sequence
/
show errors

CREATE TABLE TABLE_FAMILY ( 
    FAMILY_NAME         VARCHAR2(128 BYTE) NOT NULL,
    FAMILY_ID           NUMBER             NOT NULL,
    PARTITION_SET_TYPE  NUMBER             DEFAULT NULL, -- SHARDSPACE type
    SHARD_TYPE          NUMBER             DEFAULT NULL,
    MAX_CHUNK_NUM       NUMBER             DEFAULT 0,
    -- Possible types are: 1, 'RANGE', 2, 'HASH', 4, 'LIST', 0 NONE
    PRIMARY KEY (family_id)
 )
/
show errors

CREATE TABLE SHARDKEY_COLUMNS (
    FAMILY_ID  NUMBER        NOT NULL,
    KEY_LEVEL  NUMBER(1)     NOT NULL, -- 0 for shardspace key, 1 for shard key.   
    COL_NAME   VARCHAR2(128) NOT NULL,
    COL_SEQ    NUMBER        NOT NULL, -- Column number inside the key 
    -- (separate enumeration for group an shard keys)
    PRIMARY KEY (family_id, key_level, col_name)
 )
/
show errors

ALTER TABLE shardkey_columns ADD CONSTRAINT sc_in_family
   FOREIGN KEY (family_id)
   REFERENCES table_family(family_id)
/
show errors

CREATE TABLE service (
   name                      VARCHAR2(64)   NOT NULL,
   network_name              VARCHAR2(512)  NOT NULL,
   pool_name                 VARCHAR2(128)  REFERENCES database_pool(name),
   status                    CHAR(1),
                             -- 'S' (Started)
                             -- 'P' (Stopped)
   preferred_all             NUMBER(1),      
                             -- boolean (1 TRUE, 0 FALSE)
   locality                  NUMBER(1),      
                             -- anywhere (0), local_only (1)
   region_failover           NUMBER(1),      
                             -- boolean (1 TRUE, 0 FALSE)
   role                      NUMBER(1),      
                             -- primary (1), physical_standby (2), logical_standby (3)
   failover_primary          NUMBER(1),      
                             -- boolean (1 TRUE, 0 FALSE)
   any_lag                   NUMBER(1),      
                             -- boolean (1 TRUE, 0 FALSE)
   lag                       NUMBER,         
                             -- lag value if 'any_lag' is FALSE
   runtime_balance           NUMBER(1),      
                             -- none (0), service_time (1), throughput (2)
   load_balance              NUMBER(1),      
                             -- none (0), short (1), long (2)
   notification              NUMBER(1), 
                             -- boolean (1 TRUE, 0 FALSE)
   tafpolicy                 NUMBER(1),      
                             -- none (0), basic (1), preconnect (2)
   policy                    NUMBER(1),      
                             -- manual (1), automatic (2)
   dtp                       NUMBER(1),      
                             -- boolean (1 TRUE, O FALSE)
   failover_method           VARCHAR2(64),    
                             -- 'NONE' or 'BASIC'
   failover_type             VARCHAR2(64),    
                             -- 'NONE', 'SESSION', 'SELECT', 'TRANSACTION'
                             -- or 'AUTO'
   failover_retries          NUMBER,
   failover_delay            NUMBER,
   edition                   VARCHAR2(128),
   pdb                       VARCHAR2(128),
   commit_outcome            NUMBER,
                             -- boolean (1 TRUE, 0 FALSE)
   retention_timeout         NUMBER,
   replay_initiation_timeout NUMBER,
   session_state_consistency VARCHAR2(128),
                             -- 'STATIC' or 'DYNAMIC'
   sql_translation_profile   VARCHAR2(261),
   change_state              CHAR(1)        DEFAULT NULL,
   table_family              NUMBER         DEFAULT NULL,
   stop_option               VARCHAR2(13),
                             -- 'NORMAL' or 'IMMEDIATE' or 'TRANSACTIONAL'
   drain_timeout             NUMBER         DEFAULT NULL,
   failover_restore          VARCHAR2(64)   DEFAULT NULL,
                             -- NONE or LEVEL1
   PRIMARY KEY (name, pool_name)
 )
/
show errors

ALTER TABLE service ADD CONSTRAINT in_family
   FOREIGN KEY (table_family)
   REFERENCES table_family(family_id)
/
show errors

CREATE TABLE service_preferred_available (
   service_name    VARCHAR2(64),
   pool_name       VARCHAR2(128),
   database        VARCHAR2(30),
   preferred       NUMBER(1),     -- (1 preferred, 0 available)
   status          CHAR(1)        DEFAULT NULL,
                                  -- 'E' (Enabled)
                                  -- 'D' (Disabled)
   state           CHAR(1)        DEFAULT 'S',
                                  -- 'S' (Stopped)
                                  -- 'D' (Down - stopped by user)
                                  -- 'U' (Up and rUnning)
   dbparams        dbparams_list  DEFAULT NULL, -- database specific parameters
   instances       instance_list  DEFAULT NULL, -- list of preferred or
                                                -- available instances for
                                                -- admin managed clusters
                                                -- (not currently used)
   change_state    CHAR(1)        DEFAULT NULL
 )
  NESTED TABLE instances STORE AS instances_nt
/
show errors

ALTER TABLE service_preferred_available ADD constraint fk_db_spa 
   foreign key(database) references database(name)
/
show errors

-- need to ignore pre-existing key for downgrade->upgrade
BEGIN
   EXECUTE IMMEDIATE 'ALTER TABLE service_preferred_available ADD constraint
      pk_spa primary key(service_name, pool_name, database)';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE IN (-02260 ) THEN NULL;
      ELSE RAISE;
      END IF;
END;
/
show errors

-- need to ignore pre-existing key for downgrade->upgrade
BEGIN
   EXECUTE IMMEDIATE 'ALTER TABLE service_preferred_available ADD constraint
      fk_sp_spa foreign key(service_name, pool_name) references service(name, pool_name)';
EXCEPTION
   WHEN OTHERS THEN
      IF SQLCODE IN (-02260 ) THEN NULL;
      ELSE RAISE;
      END IF;
END;
/
show errors

ALTER TABLE service_preferred_available ADD constraint spa_in_pool 
   foreign key(pool_name) references database_pool(name)
/
show errors


CREATE TABLE gsm_requests (
   change_seq#    NUMBER             NOT NULL,     -- copied from request
   request        gsm_change_message NOT NULL,
   failure_count  NUMBER             DEFAULT 0,
   error_message  VARCHAR2(4000)     DEFAULT NULL,
   status         CHAR(1)            DEFAULT 'N',  -- values 'N', 'D', 'F','A'
   change_date    DATE               DEFAULT SYSDATE,
   old_instances  instance_list      DEFAULT NULL, -- old instances for recovery
   error_num      NUMBER             DEFAULT NULL,
   ddl_num        NUMBER             DEFAULT NULL,
   parent_request NUMBER             DEFAULT NULL,
   PRIMARY KEY (change_seq#)
 )
 NESTED TABLE old_instances STORE AS old_instances_nt
/
show errors

ALTER TABLE gsm_requests ADD CONSTRAINT prnt_req
   FOREIGN KEY (parent_request)
   REFERENCES gsm_requests(change_seq#)
/
show errors

CREATE SEQUENCE cat_sequence
/
show errors

CREATE TABLE catalog_requests (
   cat_seq#       NUMBER,
   source_db      NUMBER      DEFAULT NULL, -- source database
   target_db      NUMBER      DEFAULT NULL, -- target database
   shspace_list   number_list DEFAULT NULL, -- shardspaces list
   exec_db        NUMBER      DEFAULT NULL,
   replica_num    NUMBER      DEFAULT NULL, -- needed by OGG only
   request_type   NUMBER,     -- 1 - move chunk, 2 - copy chunk
   obj_id         NUMBER,     -- ID of object that is the target of the request
                              -- for chunk move it is chunk ID
   status         NUMBER      DEFAULT 0,    -- status of request
   timeout        NUMBER      DEFAULT 0,    -- request timeout
   gsm_request#   NUMBER      DEFAULT NULL,  -- gsm_request number
   gdsctl_id      NUMBER      DEFAULT NULL  -- gsdsctl session id
 )
 nested table shspace_list store as shspace_nt
/
show errors

ALTER TABLE catalog_requests ADD CONSTRAINT cr_dbsrc
   FOREIGN KEY (source_db)
   REFERENCES database(database_num)
/
show errors

ALTER TABLE catalog_requests ADD CONSTRAINT cr_dbtrgt
   FOREIGN KEY (target_db)
   REFERENCES database(database_num)
/
show errors

ALTER TABLE catalog_requests ADD CONSTRAINT cr_database
   FOREIGN KEY (exec_db)
   REFERENCES database(database_num)
/
show errors


------------------------------------------------------------------------------
-- TABLES RELATED TO SHARDING
------------------------------------------------------------------------------

CREATE SEQUENCE cs_chunk_id
/
show errors

CREATE TABLE CHUNKS (
   CHUNK_NUMBER   NUMBER        NOT NULL ,
   SHARDSPACE_ID  NUMBER        DEFAULT NULL,  
   LOW_KEY        NUMBER        DEFAULT NULL,
   HIGH_KEY       NUMBER        DEFAULT NULL,
   BHIBOUNDVAL    BLOB          DEFAULT NULL,
   BLOBOUNDVAL    BLOB          DEFAULT NULL,
   STATE          NUMBER        DEFAULT 0, 
   -- Should be the same value as
   -- dbms_gsm_common.chunk_up
   RO_DBNUM       NUMBER        DEFAULT NULL, -- read only database id
   RW_DBNUM       NUMBER        DEFAULT NULL, -- read write database id
   CHUNK_ID       NUMBER        DEFAULT 0,    -- chunk id for cross sharding (catalog only)
   IS_RACAFF NUMBER DEFAULT 0, -- 1 if chunk is created for rac affinity
   PART_OBJ# NUMBER DEFAULT 0, -- RAC affinity: parittion object number
   PRIMARY KEY (chunk_number, shardspace_id)
 )
/
show errors

ALTER TABLE chunks ADD CONSTRAINT chunk_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

CREATE TABLE ALL_CHUNKS (
   CHUNK_NUMBER   NUMBER        NOT NULL ,
   SHARDSPACE_ID  NUMBER        DEFAULT NULL,  
   LOW_KEY        NUMBER        DEFAULT NULL,
   HIGH_KEY       NUMBER        DEFAULT NULL,
   PRIMARY KEY (chunk_number, shardspace_id)
 )
/
show errors

ALTER TABLE all_chunks ADD CONSTRAINT allchunk_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

CREATE TABLE CHUNK_LOC ( 
   CHUNK_NUMBER  NUMBER        NOT NULL,
   DATABASE_NUM  NUMBER        NOT NULL,
   SHARDSPACE_ID NUMBER,
   IN_MOVE       NUMBER(1)     DEFAULT 0,
   -- following columns are required by OGG only
   -- denormalize shardgroup_id
   SHARDGROUP_ID NUMBER,
   REPLICA_NUM   NUMBER        DEFAULT NULL,
   -- values in interval [1..repfactor]
   -- a "one" means "primary copy" in a shardgroup
   PRIMARY KEY (chunk_number, database_num)
 ) 
/
show errors

ALTER TABLE chunk_loc ADD CONSTRAINT cl_database
   FOREIGN KEY (database_num)
   REFERENCES database(database_num)
/
show errors

ALTER TABLE chunk_loc ADD CONSTRAINT cl_shardgroup
   FOREIGN KEY (shardgroup_id)
   REFERENCES shard_group(shardgroup_id)
/
show errors

ALTER TABLE chunk_loc ADD CONSTRAINT cl_shardspace
   FOREIGN KEY (shardspace_id)
   REFERENCES shard_space(shardspace_id)
/
show errors

ALTER TABLE chunk_loc ADD CONSTRAINT cl_chunk
   FOREIGN KEY (chunk_number, shardspace_id) 
   REFERENCES chunks(chunk_number, shardspace_id)
/
show errors

CREATE TABLE PARTITION_SET (
   SET_NAME       VARCHAR2(128) NOT NULL,
   HIBOUNDLEN     NUMBER,
   HIBOUNDVAL     CLOB,
   BHIBOUNDVAL    BLOB,
   LOBOUNDLEN     NUMBER,
   LOBOUNDVAL     CLOB,
   BLOBOUNDVAL    BLOB,
   SHARDSPACE_ID  NUMBER,
   FAMILY_ID      NUMBER NOT NULL,
   PS_ORDER       NUMBER DEFAULT NULL,
   PRIMARY KEY (set_name)
 )
/
show errors

ALTER TABLE partition_set ADD CONSTRAINT ps_family
   FOREIGN KEY (family_id)
   REFERENCES table_family(family_id)
/
show errors

CREATE TABLE TABLESPACE_SET (
   SET_NAME      VARCHAR2 (30 BYTE) NOT NULL ,
   SHARDSPACE_ID NUMBER NOT NULL,
   FAMILY_ID     NUMBER DEFAULT NULL,
   PARTITION_SET VARCHAR2 (128) DEFAULT NULL,
   PRIMARY KEY (set_name)
 )
/
show errors

--ALTER TABLE tablespace_set ADD CONSTRAINT ts_shardspace
--   FOREIGN KEY (shardspace_id)
--   REFERENCES shard_space(shardspace_id)
--/
--show errors

ALTER TABLE tablespace_set ADD CONSTRAINT ts_family
   FOREIGN KEY (family_id)
   REFERENCES table_family(family_id)
/
show errors

ALTER TABLE tablespace_set ADD CONSTRAINT ts_partset
   FOREIGN KEY (partition_set)
   REFERENCES partition_set(set_name)
/
show errors

CREATE TABLE SHARD_TS ( 
   TABLESPACE_NAME VARCHAR2(30)   NOT NULL,
   TABLESPACE_SET  VARCHAR2(30),
   CHUNK_NUMBER    NUMBER DEFAULT NULL, -- NULL for user-defined sharding
   SHARDSPACE_ID   NUMBER DEFAULT NULL, -- can be NULL for user-defined sharding
   MOVE_FLAG       NUMBER DEFAULT 0, -- if 1 then txn was set R/O during move
   PRIMARY KEY (tablespace_name),
   supplemental log group shard_ts$log_grp
    (tablespace_name, chunk_number) always
 ) SEGMENT CREATION IMMEDIATE TABLESPACE SYSTEM
/
show errors

ALTER TABLE shard_ts ADD CONSTRAINT sts_ts
   FOREIGN KEY (tablespace_set)
   REFERENCES tablespace_set(set_name)
/
show errors

ALTER TABLE shard_ts ADD CONSTRAINT sts_chunks
   FOREIGN KEY (chunk_number, shardspace_id)
   REFERENCES chunks(chunk_number, shardspace_id)
/
show errors

-- temporary: re-enable this once split chunk
--  inserts into new chunks info into 
--  chunks before inserting into shard_ts
ALTER TABLE shard_ts DISABLE CONSTRAINT sts_chunks
/
show errors

CREATE TABLE GLOBAL_TABLE (
   TABLE_NAME     VARCHAR2(128)  NOT NULL, 
   SCHEMA_NAME    VARCHAR2(128), 
   FAMILY_ID      NUMBER, 
   TABLE_OBJ#     NUMBER         NOT NULL, -- obj# in sys.obj$ table
   REF_TABLE_FLAG CHAR(1)        NOT NULL,
   SERVICE_ID     NUMBER         DEFAULT NULL,
   NUM_CHUNKS     NUMBER         DEFAULT NULL,
   CONSISTENT     NUMBER(1)      DEFAULT NULL,
   PRIMARY KEY (table_obj#)
 ) 
/
show errors

ALTER TABLE global_table ADD CONSTRAINT gt_family
   FOREIGN KEY (family_id)
   REFERENCES table_family(family_id)
/
show errors

CREATE TABLE TS_SET_TABLE (
   TABLESPACE_NAME VARCHAR2(30),
   TABLE_OBJ#      NUMBER,
   TS_USAGE_FLAG   CHAR(1)       NOT NULL,
   CHILD_OBJ#      NUMBER        DEFAULT NULL
 ) 
/
show errors

ALTER TABLE ts_set_table ADD CONSTRAINT ts_set_ts
   FOREIGN KEY (tablespace_name)
   REFERENCES tablespace_set(set_name)
/
show errors

ALTER TABLE ts_set_table ADD CONSTRAINT ts_set_gt
   FOREIGN KEY (table_obj#)
   REFERENCES global_table(table_obj#)
/
show errors

-- Table to hold DDL counter (1 column 1 row)
CREATE TABLE DDLID$ (
   ddlid      NUMBER NOT NULL,
   MINOBJ_NUM NUMBER DEFAULT NULL, --obj number range min
   MAXOBJ_NUM NUMBER DEFAULT NULL  --obj number range max
 )
/
show errors

-- Idempotency, if row exists already, nothing, else insert
DECLARE
   ddl_count    number;
BEGIN
   SELECT count(*) INTO ddl_count FROM ddlid$;
   IF ddl_count = 0 THEN
      INSERT INTO DDLID$ (ddlid) values (0);
   END IF;
END;
/
show errors

CREATE TABLE verify_history (
   run_number     NUMBER         NOT NULL,
   message_number NUMBER         NOT NULL,
   message_string VARCHAR(1000),
   message_date   DATE           NOT NULL
 )
/
show errors

GRANT SELECT on verify_history TO gsmadmin_role;
/
show errors

CREATE SEQUENCE verify_run_number
/
show errors

CREATE GLOBAL TEMPORARY TABLE CHUNKDATA_TMP (
DATAFILE_NAME VARCHAR2(512))
ON COMMIT PRESERVE ROWS
/
show errors
-------------------------
-- Create AQ Change Queue
-------------------------
DECLARE
  stmt  VARCHAR2(500);
BEGIN
    stmt := 'GRANT SELECT ON aq$_unflushed_dequeues to ' || 'gsmadmin_internal';
    EXECUTE IMMEDIATE stmt;

    dbms_aqadm.create_queue_table(
        queue_table => 'gsmadmin_internal.change_log_queue_table',
        multiple_consumers => TRUE,
        queue_payload_type => 'gsmadmin_internal.gsm_change_message',
        storage_clause => 'TABLESPACE "SYSAUX"',
        comment => 'Creating GSM change log queue table');

    dbms_aqadm.create_queue(
        queue_name => 'gsmadmin_internal.change_log_queue',
        queue_table => 'gsmadmin_internal.change_log_queue_table',
        comment => 'GSM Change Log Queue');
EXCEPTION
WHEN others THEN
  IF sqlcode = -24001 THEN NULL;
       -- suppress error for pre-existent queue table
  ELSE raise;
  END IF;
END;
/
show errors

-- This can only be done by the queue owner (gsmadmin_internal) or
-- SYS.  
BEGIN
  dbms_aqadm.grant_queue_privilege(
     privilege => 'dequeue',
     queue_name => 'gsmadmin_internal.change_log_queue',
     grantee => 'GSMCATUSER');
END;
/
show errors

BEGIN
  dbms_aqadm.grant_queue_privilege(
     privilege => 'enqueue',
     queue_name => 'gsmadmin_internal.change_log_queue',
     grantee => 'GSMADMIN_INTERNAL');
END;
/
show errors

BEGIN
   dbms_aqadm.start_queue('gsmadmin_internal.change_log_queue', 
                          TRUE, 
                          TRUE);
END;
/
show errors

----------------------------------
-- Grant resolve network privilege
----------------------------------

BEGIN
  dbms_network_acl_admin.append_host_ace(
    host => '*',
    ace => xs$ace_type(privilege_list => xs$name_list('RESOLVE'),  
                       principal_name => 'GSMADMIN_INTERNAL',  
                       principal_type => xs_acl.ptype_db));
END;
/
show errors

-----------------------
-- Set Table Privileges
-----------------------

GRANT select on cloud to gsmadmin_role, gds_catalog_select;
GRANT select on region to gsmadmin_role, gds_catalog_select;
GRANT select on gsm to gsmadmin_role, gds_catalog_select;
GRANT select on vncr to gsmadmin_role, gds_catalog_select;
GRANT select on database_pool to gsmadmin_role, gds_catalog_select;
GRANT select on database_pool_admin to gsmadmin_role, gds_catalog_select;
GRANT select on gsm_requests to gsmadmin_role, gds_catalog_select;
GRANT select on container_database to gsmadmin_role, gds_catalog_select;
GRANT select on database to gsmadmin_role, gds_catalog_select;
GRANT select on files to gsmadmin_role, gds_catalog_select;
GRANT select on credential to gsmadmin_role, gds_catalog_select;
GRANT select on service to gsmadmin_role, gds_catalog_select;
GRANT select on service_preferred_available to gsmadmin_role, gds_catalog_select;
GRANT select on shard_group to gsmadmin_role, gds_catalog_select;
GRANT select on tablespace_set to gsmadmin_role, gds_catalog_select;
GRANT select on shard_space to gsmadmin_role, gds_catalog_select;
GRANT select on broker_configs to gsmadmin_role, gds_catalog_select;
GRANT select on shardkey_columns to gsmadmin_role, gds_catalog_select;
GRANT select on partition_set to gsmadmin_role, gds_catalog_select;
GRANT select on catalog_requests to gsmadmin_role, gds_catalog_select;
GRANT select on chunk_loc to gsmadmin_role, gds_catalog_select;
GRANT select on chunks to gsmadmin_role, gds_catalog_select;
GRANT select on shard_ts to gsmadmin_role, gds_catalog_select;
GRANT select on global_table to gsmadmin_role, gds_catalog_select;
GRANT select on table_family to gsmadmin_role, gds_catalog_select;
GRANT select on sys.ddl_requests to gsmadmin_role, gds_catalog_select;
GRANT select on sys.ddl_requests_pwd to gsmadmin_role, gds_catalog_select;

-- Import catalog permissions.
GRANT insert on vncr to gsmadmin_role;
GRANT update on cloud to gsmadmin_role;
GRANT insert,update on region to gsmadmin_role;
GRANT insert on gsm to gsmadmin_role;

GRANT insert on container_database to gsmadmin_role;
GRANT insert on database to gsmadmin_role;
GRANT insert on files to gsmadmin_role;
GRANT insert on credential to gsmadmin_role;
GRANT insert on database_pool to gsmadmin_role;
GRANT insert on database_pool_admin to gsmadmin_role;
GRANT insert on service to gsmadmin_role;
GRANT insert on service_preferred_available to gsmadmin_role;
-- End import catalog permissions

GRANT select on database_pool to gsm_pooladmin_role;
GRANT select on container_database to gsm_pooladmin_role;
GRANT select on database to gsm_pooladmin_role;
GRANT select on files to gsm_pooladmin_role;
GRANT select on credential to gsm_pooladmin_role;
GRANT select on sys.ddl_requests to gsm_pooladmin_role;
GRANT select on sys.ddl_requests_pwd to gsm_pooladmin_role;
GRANT select on cloud to gsm_pooladmin_role;
GRANT select on service to gsm_pooladmin_role;
GRANT select on service_preferred_available to gsm_pooladmin_role;
GRANT select on gsm_requests to gsm_pooladmin_role;

-- Pool admin has to see regions in order to know which regions
-- to which to add databases.
GRANT select on region to gsm_pooladmin_role;

-- set type privs (so that GDSCTL can select types from tables)
GRANT execute on gsmadmin_internal.gsm_change_message to gsmadmin_role;
GRANT execute on gsmadmin_internal.dbparams_t to gsmadmin_role,
                                                 gsm_pooladmin_role;
GRANT execute on gsmadmin_internal.dbparams_list to gsmadmin_role,
                                                    gsm_pooladmin_role;
GRANT execute on gsmadmin_internal.rac_instance_t to gsmadmin_role,
                                                     gsm_pooladmin_role;
GRANT execute on gsmadmin_internal.instance_list to gsmadmin_role,
                                                    gsm_pooladmin_role;
GRANT execute on gsmadmin_internal.name_list to gsmadmin_role,
                                                    gsm_pooladmin_role;
GRANT execute on gsmadmin_internal.number_list to gsmadmin_role,
                                                    gsm_pooladmin_role;

GRANT select,insert,update,delete on gdsctl_messages to gsm_pooladmin_role, 
                                                        gsmadmin_role;
GRANT update,delete on gsm_requests to gsm_pooladmin_role, gsmadmin_role;
GRANT update on service_preferred_available to gsmcatuser;
GRANT update on container_database to gsmcatuser;
GRANT update on database to gsmcatuser;
GRANT update on broker_configs to gsmcatuser;
GRANT update on files to gsmcatuser;
GRANT update on credential to gsmcatuser;

GRANT gsmadmin_role, gsm_pooladmin_role to gsmcatuser;

-- session context for cross-shard
CREATE OR REPLACE CONTEXT shard_ctx USING gsmadmin_internal.dbms_gsm_pooladmin;

-- session context for ddl updates
CREATE OR REPLACE CONTEXT shard_ctx2 USING gsmadmin_internal.dbms_gsm_utility;

--------------------- LOCAL_CHUNKS view and it's friends (for clients)

create or replace view LOCAL_CHUNK_TYPES
  (TABFAM_ID, TABLE_NAME, SCHEMA_NAME,
    GROUP_TYPE, GROUP_COL_NUM,   --   number of columns in super key
    SHARD_TYPE, SHARD_COL_NUM,   --  number of columns in shard key
    DEF_VERSION,                 --  version of the shard definition
    SHARDGROUP_NAME
  )
as select
  TF.FAMILY_ID, GT.TABLE_NAME, GT.SCHEMA_NAME,
  decode(TF.PARTITION_SET_TYPE, 1, 'RANGE', 2, 'HASH', 4, 'LIST', 'NONE'),
  (select count(1) from SHARDKEY_COLUMNS PK where PK.FAMILY_ID = TF.FAMILY_ID and PK.KEY_LEVEL = 0),
  decode(TF.SHARD_TYPE, 1, 'RANGE', 2, 'HASH', 4, 'LIST', 'NONE'),
  (select count(1) from SHARDKEY_COLUMNS PK where PK.FAMILY_ID = TF.FAMILY_ID and PK.KEY_LEVEL = 1),
  D.ddlid, dbms_gsm_common.getParam_shardgroup_name
from
  GLOBAL_TABLE GT, TABLE_FAMILY TF, DDLID$ D
where GT.REF_TABLE_FLAG = 'R' AND 
  TF.FAMILY_ID = GT.FAMILY_ID
with read only
/

create or replace public synonym LOCAL_CHUNK_TYPES for LOCAL_CHUNK_TYPES
/

grant read on LOCAL_CHUNK_TYPES to PUBLIC with grant option
/
show errors

create or replace view LOCAL_CHUNK_COLUMNS
(
  TABFAM_ID,
  SHARD_LEVEL,    -- SUPERSHARDING 0 / SHARDING 1
  COL_NAME, COL_IDX_IN_KEY,
  EFF_TYPE,       -- type of the column, which is used for routing and it's format 
                  -- (currently, supposed to be the same as COL_TYPE)
  CHARACTER_SET,  -- Character set used on the database side in case of VARCHAR or NVARCHAR type
  COL_TYPE,       -- real type of the column (not important for client)
  COL_SIZE        -- size of a column if used (important for NCHAR/CHAR, 0 for anything else)
)
as
select
  GT.FAMILY_ID, PK.KEY_LEVEL, PK.COL_NAME, COL_SEQ,
  c.type#, c.charsetid, c.type#, c.length
from
  SYS.COL$ c, SHARDKEY_COLUMNS PK, GLOBAL_TABLE GT
where
  c.NAME = PK.COL_NAME AND c.obj# = GT.TABLE_OBJ# AND GT.REF_TABLE_FLAG = 'R'
with read only 
/
create or replace public synonym LOCAL_CHUNK_COLUMNS for LOCAL_CHUNK_COLUMNS
/
grant read on LOCAL_CHUNK_COLUMNS to PUBLIC with grant option
/
show errors

create or replace view LOCAL_CHUNKS
(
  CHUNK_NAME, SHARD_KEY_LOW, SHARD_KEY_HIGH, GROUP_KEY_LOW, GROUP_KEY_HIGH,
  PRIORITY, TABFAM_ID, GRP_ID, CHUNK_ID, STATE, SHARD_NAME, SHARDSPACE_NAME,
  INST_ID, CHUNK_UNIQUE_ID
)
as
with 
 LOCAL_CHUNK_LOC as
  (SELECT CLX.REPLICA_NUM PRIORITY, NVL(CLX.SHARDSPACE_ID, 0) SSID,
    CLX.CHUNK_NUMBER CHUNK_NUMBER, D.NAME DB_NAME FROM CHUNK_LOC CLX
      LEFT JOIN DATABASE D ON (D.DATABASE_NUM = CLX.DATABASE_NUM)
      WHERE CLX.DATABASE_NUM =
      dbms_gsm_common.getParam_db_num_gsm
      or 
      INSTR(dbms_gsm_common.getParam_gwm_database_flags,'C')
      !=0),
 LOCAL_CHUNK AS
  (SELECT NVL(C.SHARDSPACE_ID, 0) SHARDSPACE_ID, C.CHUNK_NUMBER CHUNK_NUMBER,
          C.BLOBOUNDVAL BLOBOUNDVAL, C.BHIBOUNDVAL BHIBOUNDVAL, C.STATE STATE,
          SS.NAME SHARDSPACE, C.PART_OBJ# PART_OBJECT_ID, C.CHUNK_ID CHUNK_UNIQUE_ID
     FROM CHUNKS C, SHARD_SPACE SS
    WHERE C.SHARDSPACE_ID = SS.SHARDSPACE_ID)
select
 'CHUNK_' || TO_CHAR(LC.SHARDSPACE_ID) || '_' || TO_CHAR(LC.CHUNK_NUMBER),
 LC.BLOBOUNDVAL, LC.BHIBOUNDVAL, PS.BLOBOUNDVAL, PS.BHIBOUNDVAL,
  (SELECT CL.PRIORITY FROM LOCAL_CHUNK_LOC CL
    WHERE LC.CHUNK_NUMBER = CL.CHUNK_NUMBER AND LC.SHARDSPACE_ID = CL.SSID
      AND ROWNUM < 2) PRIORITY,
  TF.FAMILY_ID, LC.SHARDSPACE_ID, LC.CHUNK_NUMBER, LC.STATE,
  CL.DB_NAME,
  LC.SHARDSPACE SHARDSPACE_NAME, 
  nvl2(LC.PART_OBJECT_ID,
       (CASE WHEN CM.INST_ID>0 THEN CM.INST_ID
       ELSE
                (SELECT FUTURE_MASTER FROM GV$GCSPFMASTER_INFO GC
                 WHERE  GC.INST_ID=USERENV('Instance') AND 
                        GC.DATA_OBJECT_ID = LC.PART_OBJECT_ID)
       END), 
       NULL), LC.CHUNK_UNIQUE_ID
from
  (LOCAL_CHUNK LC cross join TABLE_FAMILY TF)
    left outer join PARTITION_SET PS on (PS.SHARDSPACE_ID = LC.SHARDSPACE_ID)
    left outer join (select CHUNK_NUMBER, MIN(MASTER_INST) INST_ID
                     FROM GV$GWM_RAC_AFFINITY 
                     GROUP BY CHUNK_NUMBER) CM
               on  ( CM.CHUNK_NUMBER= LC.CHUNK_NUMBER)
    left outer join LOCAL_CHUNK_LOC CL on
        (LC.CHUNK_NUMBER = CL.CHUNK_NUMBER 
            AND LC.SHARDSPACE_ID = CL.SSID)
where
  LC.STATE in (0,1) --exclude chunks that are down
with read only
/

create or replace public synonym LOCAL_CHUNKS for LOCAL_CHUNKS
/

grant read on LOCAL_CHUNKS to PUBLIC with grant option
/
show errors

------------------------------------------------------------------------------
--
-- Usr visisble views for querying shard catalog
--
------------------------------------------------------------------------------

-- Sharded databases
CREATE OR REPLACE VIEW sha_databases
   (db_unique_name, region_name, connect_string, db_created, status, version,
    rac_type, shardgroup, last_ddl, ddl_error, deployment_state, dg_broker_id,
    shardspace, db_up, is_primary, db_host, oracle_home
   )
AS SELECT
   d.name,
   r.name,
   d.connect_string,
   CASE d.conv_state
      WHEN 'S' THEN 'N'
      WHEN 'C' THEN 'Y' 
      ELSE 'UNKNOWN' END,
   CASE d.status
      WHEN 'U' THEN 'UNDEPLOYED'
      WHEN 'R' THEN 'REPLICATON_CONFIGURED'
      WHEN 'D' THEN 'GSM_SET_UP'
      WHEN 'I' THEN 'ADD_INCOMPLETE'
      WHEN 'S' THEN 'NEEDS_RESYNC'
      ELSE 'UNKNOWN' END,
   dbms_gsm_utility.dbVersRevLookup(d.version),
   CASE d.db_type
      WHEN 'N' THEN 'NON_RAC'
      WHEN 'A' THEN 'ADMIN_RAC'
      WHEN 'P' THEN 'POLICY_RAC'
      WHEN 'S' THEN 'SIHA'
      WHEN 'U' THEN 'UNKNOWN'
      ELSE 'UNKNOWN' END,
   s.name,
   d.ddl_num,
   d.ddl_error,
   CASE d.dpl_status
      WHEN 0 THEN 'NOT_DEPLOYED'
      WHEN 1 THEN 'DEPLOY_REQUESTED'
      WHEN 2 THEN 'REPLICATION_CONFIGURED'
      WHEN 3 THEN 'HAS_CHUNKS'
      WHEN 4 THEN 'DEPLOYED'
      WHEN 5 THEN 'OGG DEPLOYED'
      ELSE 'UNKNOWN' END,
   d.drset_number,
   ss.name,
   CASE BITAND(d.flags, 1)
      WHEN 1 THEN 'Y'
      ELSE 'N' END,
   CASE BITAND(d.flags,2)
      WHEN 2 THEN 'Y'
      ELSE 'N' END,
   v.hostname,
   d.oracle_home
FROM database d
   LEFT JOIN region r ON (d.region_num = r.num)
   LEFT JOIN shard_group s ON (d.shardgroup_id = s.shardgroup_id)
   LEFT JOIN shard_space ss ON (d.shardspace_id = ss.shardspace_id)
   LEFT JOIN vncr v ON (d.hostid = v.hostid);
/

create or replace public synonym SHA_DATABASES for SHA_DATABASES
/

grant read on SHA_DATABASES to GSMADMIN_ROLE
/

grant select on sha_databases to gds_catalog_select
/

show errors
      
ALTER SESSION SET CURRENT_SCHEMA = SYS;

@?/rdbms/admin/sqlsessend.sql

OHA YOOOO