set lines 180 trimspool on verify off CREATE OR REPLACE PACKAGE gdp$uptime_migration AS -- Author: Geert De Paep - Uptime Technologies procedure SetDebug(DebugA in boolean default true); Procedure VerifyTargetDatabase(DbNameA in varchar2, HostNameA in varchar2 default null, InstanceNameA in varchar2 default null, VersionLikeA in varchar2 default null); procedure SetScriptOptions(GenSqlA in boolean default true, LogFileNameA in varchar2 default null, WheneverSqlErrorA in boolean default false, AddInfoA in boolean default true, CheckRoleExistanceA in boolean default false, NrPausesA in number default 0, DocFormatA in varchar2 default 'TXT', IncDropUsersA in boolean default false, IncDropUsersCascadeA in boolean default false, LineSizeA in number default 200 ); procedure SetDatafileOptions(SrcSeparatorA in varchar2 default null, DstSeparatorA in varchar2 default null, FilesizeInitialPctA in number default 100, FilesizeAutomaxPctA in number default 100, ForceAutoextendA in boolean default true, DefaultDirectoryA in varchar2 default null, ConvertFilenamesToLowerA in boolean default false, IncDropPermanentTablespacesA in boolean default false, IncIncludeDropTSContentsA in boolean default false, IncDropTemporaryTablespacesA in boolean default false ); PROCEDURE ExcludeTablespace(TablespaceA IN VARCHAR2); PROCEDURE IncludeTablespace(TablespaceA IN VARCHAR2); PROCEDURE ExcludeSysPriv(PrivilegeA IN VARCHAR2); PROCEDURE ExcludeRole(RoleA IN VARCHAR2); PROCEDURE AddDatafileDirectory(IfLikeA IN VARCHAR2, DirA IN VARCHAR2); PROCEDURE SetUserList(UserListA in varchar2); procedure SetCreateOptions(CreateUsers in boolean, SysPrivsUsers in boolean, ObjPrivsUsers in boolean, DependentTS in boolean, PublicSynonyms in boolean, SetQuotas in boolean, CreateRoles in boolean, SysPrivsRoles in boolean, ObjPrivsRoles in boolean, GrantRoles in boolean, Contexts in boolean); procedure SetCreateOptions(PrePostImportA in varchar2); procedure Run(BigBannerA in varchar2 default null); procedure Reset; procedure CORP; procedure MDB; procedure MDBW; procedure BORP; procedure CORPSTAT; procedure ZINT; END gdp$uptime_migration; / CREATE OR REPLACE PACKAGE BODY gdp$uptime_migration AS -- Minimum extent size for tablespaces -- Create-options: OptCreateUsers boolean; OptSysPrivsUsers boolean; OptObjPrivsUsers boolean; OptDependentTS boolean; OptPublicSynonyms boolean; OptSetQuotas boolean; OptCreateRoles boolean; OptSysPrivsRoles boolean; OptObjPrivsRoles boolean; OptGrantRoles boolean; OptContexts boolean; -- Script-options: DEBUG BOOLEAN := false; GenSql boolean := true; -- If true, generate SQL stmts, if false, only tell what will be done LogFileName varchar2(256); -- If specified, generate "spool " in the output IncludeWheneverSqlError BOOLEAN; -- Enclose CREATE statements by "whenever sqlerror" NrPauses NUMBER; -- Ask this number of times for confirmation DocFormat VARCHAR2(3); -- Output format AddInfo BOOLEAN; -- Add extra informational messages IncDropUsers BOOLEAN; -- Generates 'DROP USER' statements IncDropUsersCascade BOOLEAN; -- Adds CASCADE to DROP USER statements CheckRoleExistance BOOLEAN; -- Skip role creation if it already exists LineSize number; -- Datafile-options: SourceDirectorySeparator CHAR(1); -- Typically / on UNIX and \ on Windows DestinationDirectorySeparator CHAR(1); -- Typically / on UNIX and \ on Windows DefaultDatafileDirectory VARCHAR2(256); -- If specified, use this dir for all datafile names. If null, keep original directory ConvertFilenamesToLower BOOLEAN; -- Convert all datafile-names to lower IncDropPermanentTablespaces BOOLEAN; -- Generate DROP statements for permanent tablespaces IncIncludeDropTSContents BOOLEAN; -- Adds 'including contents and datafiles' to drop tablespace IncDropTemporaryTablespaces BOOLEAN; -- Generate DROP statements for temporary tablespaces ForceAutoextend BOOLEAN; -- Create all datafiles with autoextend option FilesizeInitialPct NUMBER; -- Create datafiles initially as FilesizeInitialPct percent from current size FilesizeAutomaxPct NUMBER; -- Create datafiles maxsize as FilesizeAutomaxPct percent from current maxsize FilesizeAutomaxMaxKb number; -- Create datafiles maxsize never bigger than FilesizeAutomaxMaxKb k ForceAutoallocate BOOLEAN; -- Internal Variables: OptVerifyDbName varchar2(64); -- If specified, the output will contain a check on database name OptVerifyHostName varchar2(128); OptVerifyInstanceName varchar2(64); OptVerifyVersionLike varchar2(32); TYPE V256Tbl IS TABLE OF VARCHAR2(256) INDEX BY BINARY_INTEGER; TYPE V30Tbl IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER; TYPE V61Tbl IS TABLE OF VARCHAR2(61) INDEX BY BINARY_INTEGER; DatafileLikeTable V256Tbl; DatafileDirectoryTable V256Tbl; CreatedTablespaces V30Tbl; IncludedTablespaces V30Tbl; ExcludedSysPrivs V30Tbl; ExcludedRoles V30Tbl; CreatedRoles V30Tbl; -- List of roles for which CREATE ROLE is already done GrantedSysPrivsRoles V30Tbl; -- List of roles that have received sysprivs GrantedObjPrivsRoles V30Tbl; -- List of roles that have received objprivs GrantedRoles V61Tbl; -- List of roles that have been granted to user or other role PausesPrinted NUMBER; DbBlockSize NUMBER; DbVersion varchar2(32); DbName VARCHAR2(32); QueuedLevel number; QueuedMessage varchar2(4000); UserTab Dbms_Utility.uncl_array; ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ FUNCTION AddPostIfNotNull(MsgA IN VARCHAR2, PostFixA IN varchar2) RETURN VARCHAR2 IS -- Help function to append a postfix to a value, only when that value is not null BEGIN IF (MsgA IS NULL) THEN RETURN NULL; ELSE RETURN MsgA||PostFixA; END IF; END; ------------------------------------------------------------------------------ FUNCTION AddPreIfNotNull(MsgA IN VARCHAR2, PreFixA IN varchar2) RETURN VARCHAR2 IS -- Help function to prepend a prefix to a value, only when that value is not null BEGIN IF (MsgA IS NULL) THEN RETURN NULL; ELSE RETURN PreFixA||MsgA; END IF; END; -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - procedure PutLineSplit(PrefixA in varchar2, MsgA in varchar2, WidthA in number, SplitOnA in varchar2 default ' ', AllowSplitA in boolean default true) is -- Put a line in the output. Take the global variable "linesize" into account for wrapping. -- If the line is longer than linesize and wraps, the PrefixA will -- be repeated on the next line. -- Lines will only be wrapped after a character listed in SplitOnA -- If AllowSpliA is false and line is longer than linesize, an error will be raised SpacePos number; Msg varchar2(20000); Cntr number := 0; -- To avoid infinite loop begin if (LineSize < length(PrefixA)+10) then Raise_Application_Error(-20999,'Error in PutLineSplit: Linesize too small for prefix '||PrefixA); end if; if (SplitOnA is null) then Raise_Application_Error(-20999,'Error in PutLineSplit: SplitOnA may not be null'); end if; if (MsgA is null) then if (DocFormat = 'HTP') then htp.p('
'); else dbms_output.put_line(MsgA); end if; else Msg := MsgA; while (Length(PrefixA||Msg) > WidthA and Cntr < 1000) loop for i in 1 .. length(SplitOnA) loop SpacePos := instr(PrefixA||Msg,substr(SplitOnA,i,1),-(length(PrefixA||Msg)-WidthA+1)); if (SpacePos <> 0) then exit; end if; end loop; if (SpacePos = 0 and NOT AllowSplitA) then -- No character found to split on Raise_Application_Error(-20999,'Error in PutLineSplit: Linesize too small, unable to wrap data. You must increase linesize.'); elsif (SpacePos = 0) then -- No character found to split on if (DocFormat = 'HTP') then htp.p(substr(PrefixA||Msg,1,WidthA)||'
'); elsif (DocFormat = 'HTM') then dbms_output.put_line(substr(PrefixA||Msg,1,WidthA)||'
'); else dbms_output.put_line(substr(PrefixA||Msg,1,WidthA)); end if; Msg := substr(PrefixA||Msg,WidthA+1); else if (DocFormat = 'HTP') then htp.p(substr(PrefixA||Msg,1,SpacePos)||'
'); elsif (DocFormat = 'HTM') then dbms_output.put_line(substr(PrefixA||Msg,1,SpacePos)||'
'); else dbms_output.put_line(substr(PrefixA||Msg,1,SpacePos)); end if; Msg := substr(PrefixA||Msg,SpacePos+1); end if; Cntr := Cntr + 1; end loop; if (DocFormat = 'HTP') then htp.p(PrefixA||Msg); elsif (DocFormat = 'HTM') then dbms_output.put_line(PrefixA||Msg); else dbms_output.put_line(PrefixA||Msg); end if; end if; exception when OTHERS then raise_application_error(-20000,'Error in PutLineSplit',true); end; ------------------------------------------------------------------------------ PROCEDURE PrintDebug(MsgA IN VARCHAR2) IS BEGIN IF (DEBUG) THEN PutLineSplit('--DEBUG ',MsgA,200); END IF; END; ------------------------------------------------------------------------------ PROCEDURE PrintInfo(LevelA IN number, MsgA IN VARCHAR2, ConditionalA in boolean default false) -- This procedure prints an informational line in the output. -- I.e. it will generate: prompt -- It will alos take into account the pauses, so at the beginning of the -- output, it will generate a number of: pause -- If ConditionalA = true, the MsgA will only be printed if it is followed -- by a PrintMessage(...) statement, and not if it is followed by another PrintInfo(...) IS BEGIN if (ConditionalA) then PrintDebug('Entering PrintInfo with Msg '||substr(MsgA,1,10)||'... and ConditionalA=true'); -- We don't know if this message really needs to be printed. It depends on -- whether there will still be printed more data QueuedLevel := LevelA; QueuedMessage := MsgA; else PrintDebug('Entering PrintInfo with Msg '||substr(MsgA,1,10)||'... and ConditionalA=false'); IF (PausesPrinted < NrPauses AND GenSql) THEN PutLineSplit('pause ',MsgA||' ... ',LineSize); PausesPrinted := PausesPrinted + 1; IF (PausesPrinted = NrPauses AND NrPauses > 0) THEN PutLineSplit('pause ','The rest of this script will run automatically (no more pauses) ...', LineSize); END IF; ELSE IF (AddInfo) THEN PutLineSplit('prompt ',MsgA, LineSize); IF (LevelA <= 2) THEN -- Print an additional horizontal line if level <= 2 PutLineSplit(null, LPad('-',Length('prompt '||MsgA),'-'), LineSize); END IF; IF (LevelA = 1) THEN -- Print an additional blank line if level = 1 PutLineSplit(null, '', LineSize); END IF; END IF; END IF; QueuedMessage := null; end if; END; ------------------------------------------------------------------------------ PROCEDURE PrintMessage(MsgA IN VARCHAR2) IS -- This procedure puts the MsgA into the output -- It will first print the Queued message, if there is any BEGIN if (QueuedMessage is not null) then PrintDebug('Entering PrintMessage, BUT first need to print previously queued message'); PrintInfo(QueuedLevel, QueuedMessage, false); end if; PutLineSplit(null,MsgA,LineSize, AllowSplitA => false); END; ------------------------------------------------------------------------------ PROCEDURE StartWheneverSqlError IS BEGIN IF (IncludeWheneverSqlError) then PrintMessage('whenever sqlerror exit sql.sqlcode'); END IF; END; ------------------------------------------------------------------------------ PROCEDURE StopWheneverSqlError IS BEGIN IF (IncludeWheneverSqlError) then PrintMessage('whenever sqlerror continue'); END IF; END; ------------------------------------------------------------------------------ Procedure VerifyTargetDatabase(DbNameA in varchar2, HostNameA in varchar2 default null, InstanceNameA in varchar2 default null, VersionLikeA in varchar2 default null) is begin OptVerifyDbName := DbNameA; OptVerifyHostName := HostNameA; OptVerifyInstanceName := InstanceNameA; OptVerifyVersionLike := VersionLikeA; end; ------------------------------------------------------------------------------ Procedure DoVerifyTargetDatabase is begin if (OptVerifyDbName is not null) then PrintMessage('prompt Checking if we are in the correct database...'); PrintMessage('whenever sqlerror exit'); PrintMessage('set serveroutput on format wrapped'); PrintMessage('declare'); PrintMessage(' DbName varchar2(30);'); PrintMessage(' HostName varchar2(30);'); PrintMessage(' InstanceName varchar2(30);'); PrintMessage(' Version varchar2(30);'); PrintMessage('begin'); PrintMessage(' select instance_name, host_name, version, d.name'); PrintMessage(' into InstanceName, HostName, Version, DbName'); PrintMessage(' from v$instance, v$database d;'); PrintMessage(' dbms_output.put_line(''Checking if we are in the requested database:'');'); PrintMessage(' if (upper(DbName) = upper('''||OptVerifyDbName||''')) then'); PrintMessage(' dbms_output.put_line(''Database name: ''||DbName);'); PrintMessage(' else'); PrintMessage(' raise_application_error(-20000,''WRONG DATABASE!!! Databasename (''||DbName||'') not correct'');'); PrintMessage(' end if;'); if (OptVerifyInstanceName is not null) then PrintMessage(' if (upper(InstanceName) = upper('''||OptVerifyInstanceName||''')) then'); PrintMessage(' dbms_output.put_line(''Instance name: ''||InstanceName);'); PrintMessage(' else'); PrintMessage(' raise_application_error(-20000,''WRONG DATABASE!!! Instancename (''||InstanceName||'') not correct'');'); PrintMessage(' end if;'); end if; if (OptVerifyHostName is not null) then PrintMessage(' if (upper(HostName) = upper('''||OptVerifyHostName||''')) then'); PrintMessage(' dbms_output.put_line(''Host name: ''||HostName);'); PrintMessage(' else'); PrintMessage(' raise_application_error(-20000,''WRONG DATABASE!!! HostName (''||HostName||'') not correct'');'); PrintMessage(' end if;'); end if; if (OptVerifyVersionLike is not null) then PrintMessage(' if (Version like '''||OptVerifyVersionLike||''') then'); PrintMessage(' dbms_output.put_line(''Version : ''||Version);'); PrintMessage(' else'); PrintMessage(' raise_application_error(-20000,''WRONG DATABASE!!! Version (''||Version||'') not correct'');'); PrintMessage(' end if;'); end if; PrintMessage(' dbms_output.put_line(''This is the correct database!'');'); PrintMessage('end;'); PrintMessage('/'); PrintMessage('whenever sqlerror continue'); PrintMessage(''); end if; end; ------------------------------------------------------------------------------ FUNCTION FetchViewText(OwnerA IN VARCHAR2, ViewA IN VARCHAR2) RETURN varchar2 IS Cur NUMBER; Dummy NUMBER; BufSize NUMBER := 20000; Offset NUMBER := 0; OutData VARCHAR2(20000); OutSize NUMBER; BEGIN Cur := Dbms_Sql.open_cursor(); Dbms_Sql.parse(Cur,'select text from dba_views where owner = :owner and view_name = :view_name', Dbms_Sql.native); Dbms_Sql.bind_variable(Cur, 'owner', Upper(OwnerA)); Dbms_Sql.bind_variable(Cur, 'view_name', Upper(ViewA)); Dbms_Sql.define_column_long(Cur, 1); Dummy := Dbms_Sql.EXECUTE(Cur); Dummy := Dbms_Sql.fetch_rows(Cur); IF (Dummy = 0) THEN RETURN '[View '||OwnerA||'.'||ViewA||' does not exist]'; END IF; Dbms_Sql.column_value_long(Cur, 1, BufSize, Offset, OutData, OutSize); Dbms_Sql.close_cursor(Cur); OutData := replace(OutData,Chr(10)); RETURN OutData; END; ------------------------------------------------------------------------------ FUNCTION FetchViewCollist(OwnerA IN VARCHAR2, ViewA IN VARCHAR2) RETURN varchar2 IS Collist VARCHAR2(20000); BEGIN FOR c_rec IN (SELECT column_name FROM dba_tab_columns WHERE owner = OwnerA AND table_name = ViewA ORDER BY column_id) LOOP collist := collist || ','||c_rec.column_name; END LOOP; RETURN SubStr(collist,2); END; ------------------------------------------------------------------------------ function RoleCreated(RoleA in varchar2) return boolean IS -- Function returns tue if the 'CREATE ROLE' statement has already been -- generated during the current run of this procedure. begin FOR i IN 1 .. CreatedRoles.Count LOOP IF (RoleA = CreatedRoles(i)) THEN RETURN true; END IF; END LOOP; return false; end; ------------------------------------------------------------------------------ procedure MarkRoleAsCreated(RoleA in varchar2) IS -- Internally register that the 'CREATE ROLE' has been generated begin CreatedRoles(CreatedRoles.count+1) := RoleA; end; ------------------------------------------------------------------------------ function GrantedSysPrivsToRole(RoleA in varchar2) return boolean is begin FOR i IN 1 .. GrantedSysPrivsRoles.Count LOOP IF (RoleA = GrantedSysPrivsRoles(i)) THEN RETURN true; END IF; END LOOP; return false; end; ------------------------------------------------------------------------------ procedure MarkGrantedSysPrivsToRole(RoleA in varchar2) is begin GrantedSysPrivsRoles(GrantedSysPrivsRoles.count+1) := RoleA; end; ------------------------------------------------------------------------------ function GrantedObjPrivsToRole(RoleA in varchar2) return boolean is begin FOR i IN 1 .. GrantedObjPrivsRoles.Count LOOP IF (RoleA = GrantedObjPrivsRoles(i)) THEN RETURN true; END IF; END LOOP; return false; end; ------------------------------------------------------------------------------ procedure MarkGrantedObjPrivsToRole(RoleA in varchar2) is begin GrantedObjPrivsRoles(GrantedObjPrivsRoles.count+1) := RoleA; end; ------------------------------------------------------------------------------ function RoleGranted(RoleA in VARCHAR2, ToA IN varchar2) return boolean is begin FOR i IN 1 .. GrantedRoles.Count LOOP IF (Upper(RoleA||'.'||ToA) = GrantedRoles(i)) THEN RETURN true; END IF; END LOOP; return false; end; ------------------------------------------------------------------------------ procedure MarkRoleAsGranted(RoleA in varchar2, ToA IN varchar2) is begin GrantedRoles(GrantedRoles.count+1) := Upper(RoleA||'.'||ToA); end; ------------------------------------------------------------------------------ PROCEDURE RecreateTablespace(TablespaceA IN VARCHAR2, ReasonA in varchar2) IS t_rec dba_tablespaces%ROWTYPE; NrFiles NUMBER := 0; NewFilename VARCHAR2(512); Prefix VARCHAR2(16); DirectoryToUse VARCHAR2(256); FilenameToUse VARCHAR2(256); UNEXISTANT_TS exception; Assm varchar2(32); BEGIN -- Exclude SYSTEM tablespace IF (TablespaceA = 'SYSTEM') THEN RETURN; END IF; -- Check if this tablespace was already created before FOR i IN 1 .. CreatedTablespaces.Count LOOP IF (TablespaceA = CreatedTablespaces(i)) THEN RETURN; END IF; END LOOP; begin SELECT * INTO t_rec FROM dba_tablespaces WHERE tablespace_name = Upper(TablespaceA); exception when NO_DATA_FOUND then raise UNEXISTANT_TS; end; if (NOT GenSql) then PrintMessage('Tablespace '||t_rec.tablespace_name||' will be created because '||ReasonA); else -- Drop the tablespace first if requested to do so IF (IncDropPermanentTablespaces AND t_rec.CONTENTS = 'PERMANENT') THEN PrintInfo(3,'Dropping tablespace '||t_rec.tablespace_name); IF (IncIncludeDropTSContents) then PrintMessage('drop tablespace '||t_rec.tablespace_name||' including contents and datafiles;'); ELSE PrintMessage('drop tablespace '||t_rec.tablespace_name||';'); END IF; ELSIF (IncDropTemporaryTablespaces AND t_rec.CONTENTS = 'TEMPORARY') THEN PrintInfo(3,'Dropping tablespace '||t_rec.tablespace_name); PrintMessage('drop tablespace '||t_rec.tablespace_name||';'); END IF; -- Write the first part of the CREATE statement (no datafiles yet) PrintInfo(3,'Creating tablespace '||t_rec.tablespace_name||' because '||ReasonA); StartWheneverSqlError; IF (t_rec.CONTENTS = 'PERMANENT') then PrintMessage('CREATE TABLESPACE '||t_rec.tablespace_name); ELSIF (t_rec.CONTENTS = 'TEMPORARY') THEN PrintMessage('CREATE TEMPORARY TABLESPACE '||t_rec.tablespace_name); ELSIF (t_rec.CONTENTS = 'UNDO') THEN PrintMessage('CREATE UNDO TABLESPACE '||t_rec.tablespace_name); ELSE PrintMessage('-- ERROR: this tablespace type is not supported '||t_rec.CONTENTS); END IF; -- Add all datafiles FOR d_rec IN (SELECT * FROM dba_data_files WHERE tablespace_name = Upper(TablespaceA) ORDER BY file_id) LOOP IF (NrFiles = 0 AND t_rec.CONTENTS in ('PERMANENT','UNDO')) THEN Prefix := ' DATAFILE '; ELSIF (NrFiles = 0 AND t_rec.CONTENTS = 'TEMPORARY') THEN Prefix := ' TEMPFILE '; ELSE Prefix := ' , '; END IF; PrintDebug('Adding file '||d_rec.file_name||' '||Ceil(d_rec.bytes/1024/1024)||'M --> '||Ceil(d_rec.maxbytes/1024/1024)||'M'); DirectoryToUse := NULL; -- Search if a special mapping is defined for this datafile: FOR i IN 1 .. DatafileLikeTable.Count LOOP IF (d_rec.file_name LIKE DatafileLikeTable(i)) THEN DirectoryToUse := DatafileDirectoryTable(i); EXIT; END IF; END LOOP; IF (DirectoryToUse IS NULL) THEN DirectoryToUse := DefaultDatafileDirectory; END IF; IF (ConvertFilenamesToLower) then FilenameToUse := Lower(d_rec.file_name); ELSE FilenameToUse := d_rec.file_name; END IF; IF (DirectoryToUse IS NULL) THEN NewFilename := FilenameToUse; ELSE NewFileName := RTrim(DirectoryToUse,DestinationDirectorySeparator)||DestinationDirectorySeparator|| SubStr(FilenameToUse,InStr(d_rec.file_name,SourceDirectorySeparator,-1)+1); end if; PrintMessage(Prefix||''''||NewFilename||''' size '||ceil((d_rec.bytes*FilesizeInitialPct/100)/1024/1024)||'M'); IF (d_rec.autoextensible = 'YES') THEN PrintMessage(' AUTOEXTEND on NEXT '||(d_rec.increment_by*DbBlockSize)/1024||'K MAXSIZE '|| Ceil(least(d_rec.maxbytes*FilesizeAutomaxPct/100/1024,FilesizeAutomaxMaxKb))||'K'); ELSIF (ForceAutoextend) THEN PrintMessage(' AUTOEXTEND on NEXT '||Ceil((d_rec.bytes/20)/1024)||'K MAXSIZE '|| Ceil(least(d_rec.bytes*FilesizeAutomaxPct/100/1024,FilesizeAutomaxMaxKb))||'K'); END IF; NrFiles := NrFiles + 1; END LOOP; -- Adding tempfiles FOR d_rec IN (SELECT * FROM dba_temp_files WHERE tablespace_name = Upper(TablespaceA) ORDER BY file_id) LOOP IF (NrFiles = 0) THEN Prefix := ' TEMPFILE '; ELSE Prefix := ' , '; END IF; DirectoryToUse := NULL; -- Search if a special mapping is defined for this datafile: FOR i IN 1 .. DatafileLikeTable.Count LOOP IF (d_rec.file_name LIKE DatafileLikeTable(i)) THEN DirectoryToUse := DatafileDirectoryTable(i); EXIT; END IF; END LOOP; IF (DirectoryToUse IS NULL) THEN DirectoryToUse := DefaultDatafileDirectory; END IF; IF (ConvertFilenamesToLower) then FilenameToUse := Lower(d_rec.file_name); ELSE FilenameToUse := d_rec.file_name; END IF; IF (DirectoryToUse IS NULL) THEN NewFilename := d_rec.file_name; ELSE NewFileName := RTrim(DirectoryToUse,DestinationDirectorySeparator)||DestinationDirectorySeparator|| SubStr(FilenameToUse,InStr(d_rec.file_name,SourceDirectorySeparator,-1)+1); end if; PrintMessage(Prefix||''''||NewFilename||''' size '||ceil((d_rec.bytes*FilesizeInitialPct/100)/1024/1024)||'M'); IF (d_rec.autoextensible = 'YES') THEN PrintMessage(' AUTOEXTEND on NEXT '||(d_rec.increment_by*DbBlockSize)/1024||'K MAXSIZE '|| Ceil(least(d_rec.maxbytes*FilesizeAutomaxPct/100/1024,FilesizeAutomaxMaxKb))||'K'); ELSIF (ForceAutoextend) THEN PrintMessage(' AUTOEXTEND on NEXT '||Ceil((d_rec.bytes/20)/1024)||'K MAXSIZE '|| Ceil(least(d_rec.bytes*FilesizeAutomaxPct/100/1024,FilesizeAutomaxMaxKb))||'K'); END IF; NrFiles := NrFiles + 1; END LOOP; IF (t_rec.extent_management = 'LOCAL') THEN IF (t_rec.CONTENTS = 'TEMPORARY') THEN --TEMP TS must have UNIFORM size PrintMessage(' extent management LOCAL uniform size '||t_rec.next_extent); ELSIF (t_rec.allocation_type = 'SYSTEM' OR ForceAutoallocate) THEN PrintMessage(' extent management LOCAL autoallocate'); ELSIF (t_rec.CONTENTS = 'UNDO') THEN -- UNDO TS must have autoallocate PrintMessage(' extent management LOCAL autoallocate'); ELSIF (t_rec.allocation_type = 'UNIFORM') THEN PrintMessage(' extent management LOCAL uniform size '||t_rec.next_extent); ELSE Raise_application_error(-20000,'Error: Unsupported allocation type: '||t_rec.allocation_type); END IF; if (DbVersion not like '8.%') then execute immediate 'select segment_space_management from dba_tablespaces '|| ' where tablespace_name = '''||t_rec.tablespace_name||'''' into Assm; PrintMessage(' segment space management '||Assm); end if; END IF; IF (t_rec.CONTENTS NOT IN ('TEMPORARY','UNDO')) THEN PrintMessage(' '||t_rec.LOGGING); end if; PrintMessage(';'); StopWheneverSqlError; end if; CreatedTablespaces(CreatedTablespaces.Count+1) := TablespaceA; EXCEPTION when UNEXISTANT_TS then PrintMessage('prompt !! WARNING Unexistant tablespace '||TablespaceA||' found, check def_ts and temp_ts in dba_users !!'); WHEN OTHERS THEN Raise_application_error(-20000,'Error in RecreateTablespace for '||TablespaceA,true); END; ------------------------------------------------------------------------------ function IsExcludedSysPriv(PrivilegeA in varchar2) return boolean is begin for i in 1 .. ExcludedSysPrivs.count loop if (upper(ExcludedSysPrivs(i)) = upper(PrivilegeA)) then return true; end if; end loop; return false; end; ------------------------------------------------------------------------------ FUNCTION IsPredefinedRole(RoleA IN VARCHAR2) RETURN BOOLEAN IS BEGIN IF (RoleA IN ('CONNECT','RESOURCE','DBA','EXP_FULL_DATABASE','IMP_FULL_DATABASE', 'SNMPAGENT','SELECT_CATALOG_ROLE','HS_ADMIN_ROLE','EXECUTE_CATALOG_ROLE', 'DELETE_CATALOG_ROLE','GATHER_SYSTEM_STATISTICS','MONITOR_ROLE', 'ORA_OWNER','ORA_OWNER_SESSION','ORA_OWNER_SPECIAL','OLAP_DBA','WM_ADMIN_ROLE', 'AQ_ADMINISTRATOR_ROLE','AQ_USER_ROLE','JAVA_ADMIN','JAVA_DEPLOY', 'JAVASYSPRIV','JAVAUSERPRIV','JAVAIDPRIV','JAVADEBUGPRIV', 'OEM_MONITOR','RECOVERY_CATALOG_OWNER' )) THEN RETURN true; ELSE RETURN FALSE; END IF; END; ------------------------------------------------------------------------------ function IsExcludedRole(RoleA in varchar2) return boolean is begin for i in 1 .. ExcludedRoles.count loop if (upper(ExcludedRoles(i)) = upper(RoleA)) then return true; end if; end loop; return false; end; ------------------------------------------------------------------------------ function IsUser(UserA in varchar2) return boolean is x number; begin select 1 into x from dba_users where username = upper(UserA); return true; exception when no_data_found then return false; end; ------------------------------------------------------------------------------ PROCEDURE CreateRole(RoleA IN VARCHAR2, ReasonA in varchar2) IS BEGIN IF (GenSql) then PrintInfo(3,'Creating role '||RoleA||' because '||ReasonA); StartWheneverSqlError; IF (CheckRoleExistance) then PrintMessage('declare'); PrintMessage(' NrFound number;'); PrintMessage('begin'); PrintMessage(' select count(*) into NrFound from dba_roles where role = '''||RoleA||''';'); PrintMessage(' if (NrFound = 0) then'); PrintMessage(' execute immediate ''create role '||RoleA||''';'); PrintMessage(' dbms_output.put_line(''Created role '||RoleA||''');' ); PrintMessage(' else'); PrintMessage(' dbms_output.put_line(''Role '||RoleA||' already exists'');' ); PrintMessage(' end if;'); PrintMessage('end;'); PrintMessage('/'); ELSE PrintMessage('create role '||RoleA||';'); END IF; StopWheneverSqlError; ELSE PrintMessage('Role '||RoleA||' will be created because '||ReasonA); END IF; EXCEPTION WHEN OTHERS THEN Raise_application_error(-20000,'Error in CreateRoleWithSysPrivs for '||RoleA,true); END; ------------------------------------------------------------------------------ PROCEDURE DoRolesGrantedToUser(GranteeA IN VARCHAR2, ActionA IN VARCHAR2, LevelA IN NUMBER DEFAULT 0) -- Do action on the roles that are granted to this user + parent roles IS UserHasUnlimitedTS CHAR(1); NrRoles NUMBER; NrGrants number; Prefix VARCHAR2(25); BEGIN IF (ActionA NOT IN ('CREATE','ADDSYSPRIVS','ADDOBJPRIVS','GRANT')) THEN Raise_Application_Error(-20000,'Internal error: DoRolesGrantedToUser called with invalid action'); END IF; IF (LevelA > 25) THEN Raise_Application_Error(-20000,'Nested level too deep for roles granted to other roles'); ELSE Prefix := LPad(' ',LevelA+1); END IF; PrintDebug(Prefix||'Entering DoRolesGrantedToUser for Grantee='||GranteeA||', Action='||ActionA||', Level '||LevelA); -- IF (GenSql) THEN FOR r_rec IN (SELECT granted_role, Decode(admin_option,'YES',' with admin option','') AS admin_option FROM dba_role_privs WHERE grantee = GranteeA order by granted_role) LOOP PrintDebug(Prefix||'Role '||r_rec.granted_role||' is granted to '||GranteeA||', processing...'); IF (ActionA = 'CREATE' AND NOT IsPredefinedRole(r_rec.granted_role) and NOT IsExcludedRole(r_rec.granted_role)) then if (NOT RoleCreated(r_rec.granted_role) ) then CreateRole(r_rec.granted_role,'it was granted to '||GranteeA); MarkRoleAsCreated(r_rec.granted_role); end if; ELSIF (ActionA = 'GRANT' and NOT IsExcludedRole(r_rec.granted_role)) then if ( NOT RoleGranted(RoleA => r_rec.granted_role, ToA => GranteeA)) then IF (GenSql) then PrintInfo(3,'Granting '||r_rec.granted_role||' to '||GranteeA); StartWheneverSqlError; PrintMessage('grant '||r_rec.granted_role||' to '||GranteeA||r_rec.admin_option||';'); -- Revoke unlimited tablespace for RESOURCE and DBA SELECT Decode(Count(*),0,'N','Y') INTO UserHasUnlimitedTS FROM dba_sys_privs WHERE grantee = GranteeA; IF (r_rec.granted_role IN ('RESOURCE','DBA') AND UserHasUnlimitedTS = 'N' and IsUser(GranteeA)) THEN PrintInfo(3,'Revoking UNLIMITED TABLESPACE from '||GranteeA); PrintMessage('revoke unlimited tablespace from '||GranteeA||';'); END IF; StopWheneverSqlError; ELSE PrintMessage('Role '||r_rec.granted_role||' will be granted to '||GranteeA); END IF; MarkRoleAsGranted(RoleA => r_rec.granted_role, ToA => GranteeA); end if; ELSIF (ActionA = 'ADDSYSPRIVS' AND NOT IsPredefinedRole(r_rec.granted_role) and NOT IsExcludedRole(r_rec.granted_role)) THEN if (NOT GrantedSysPrivsToRole(r_rec.granted_role) ) then IF (GenSql) then PrintInfo(3,'Adding system privileges to role '||r_rec.granted_role, true); FOR p_rec IN (SELECT grantee, privilege, Decode(admin_option,'YES',' with admin option','') AS admin_option FROM dba_sys_privs WHERE grantee = r_rec.granted_role order by grantee, privilege) LOOP if (NOT IsExcludedSysPriv(p_rec.privilege)) then PrintMessage('grant '||p_rec.privilege||' to '||r_rec.granted_role||p_rec.admin_option||';'); end if; END LOOP; -- Grants on objects of SYS are not imported in user-import -- Should be given to roles in advance to avoid compilation errors due to insufficient privileges PrintInfo(3,'Adding object privileges of SYS objects to role '||r_rec.granted_role, true); FOR o_rec IN (SELECT owner, table_name, grantee, privilege, Decode(grantable,'YES',' with grant option','') AS grantable FROM dba_tab_privs WHERE grantee = r_rec.granted_role and owner = 'SYS' ORDER BY grantor, table_name, privilege) LOOP PrintMessage('GRANT '||o_rec.privilege||' ON '||o_rec.owner||'.'||o_rec.table_name|| ' TO '||r_rec.granted_role||o_rec.grantable||';'); END LOOP; ELSE SELECT Count(*) INTO NrGrants FROM dba_sys_privs WHERE grantee = r_rec.granted_role; IF (NrGrants > 0) then PrintMessage(NrGrants||' system privileges will be granted to role '||r_rec.granted_role); END IF; SELECT Count(*) INTO NrGrants FROM dba_tab_privs WHERE grantee = r_rec.granted_role and owner = 'SYS'; IF (NrGrants > 0) then PrintMessage(NrGrants||' object privileges on SYS objects will be granted to role '||r_rec.granted_role); END IF; END IF; MarkGrantedSysprivsToRole(r_rec.granted_role); end if; ELSIF (ActionA = 'ADDOBJPRIVS' AND NOT IsPredefinedRole(r_rec.granted_role) and NOT IsExcludedRole(r_rec.granted_role)) THEN if (NOT GrantedObjPrivsToRole(r_rec.granted_role)) then IF (GenSql) then PrintInfo(3,'Adding object privileges to role '||r_rec.granted_role, true); FOR o_rec IN (SELECT owner, table_name, grantee, privilege, Decode(grantable,'YES',' with grant option','') AS grantable FROM dba_tab_privs WHERE grantee = r_rec.granted_role ORDER BY grantor, table_name, privilege) LOOP PrintMessage('GRANT '||o_rec.privilege||' ON '||o_rec.owner||'.'||o_rec.table_name|| ' TO '||r_rec.granted_role||o_rec.grantable||';'); END LOOP; ELSE SELECT Count(*) INTO NrGrants FROM dba_tab_privs WHERE grantee = r_rec.granted_role; IF (NrGrants > 0) then PrintMessage(NrGrants||' object privileges will be granted to role '||r_rec.granted_role); END IF; END IF; MarkGrantedObjprivsToRole(r_rec.granted_role); end if; elsif (IsExcludedRole(r_rec.granted_role)) then PrintDebug(Prefix||'Role '||r_rec.granted_role||' is in list of excluded roles, nothing done'); ELSE PrintDebug(Prefix||'Nothing to do for role '||r_rec.granted_role); END IF; IF (NOT IsPredefinedRole(r_rec.granted_role) and NOT IsExcludedRole(r_rec.granted_role)) then PrintDebug(Prefix||'Now recursively checking '||r_rec.granted_role); DoRolesGrantedToUser(r_rec.granted_role, ActionA, LevelA + 1); END IF; END LOOP; -- ELSE -- IF (ActionA = 'CREATE') then -- select count(distinct granted_role) into NrRoles -- from dba_role_privs -- connect by prior granted_role = grantee -- start with grantee = upper(GranteeA); -- if (NrRoles > 0) then -- PrintMessage(NrRoles||' roles will be created for user '||GranteeA); -- end if; -- ELSIF (ActionA = 'GRANT') then -- select count(*) into NrGrants -- from dba_role_privs -- connect by prior granted_role = grantee -- start with grantee = upper(GranteeA); -- if (NrRoles > 0) then -- PrintMessage(NrGrants||' grants are needed for the roles of user '||GranteeA); -- end if; -- ELSIF (ActionA = 'ADDSYSPRIVS') THEN -- PrintMessage('Todo...'); -- ELSIF (ActionA = 'ADDOBJPRIVS') THEN -- PrintMessage('Todo...'); -- end if; -- END IF; PrintDebug(Prefix||'Finished DoRolesGrantedToUser for Grantee='||GranteeA||', Action='||ActionA||', Level '||LevelA); EXCEPTION WHEN OTHERS THEN Raise_application_error(-20000,'Error in DoRolesGrantedToUser for '||GranteeA||' at level '||LevelA,true); END; ------------------------------------------------------------------------------ PROCEDURE RolesToWhichObjPrivsAreGranted(GrantorA IN VARCHAR2) IS -- If the user has granted object privileges to a role, create that role as well NrRoles number; BEGIN -- if (NOT GenSql) then -- select count(distinct grantee) into NrRoles -- FROM dba_tab_privs -- WHERE grantor = GrantorA -- AND grantee IN (SELECT ROLE FROM dba_roles); -- if (NrRoles > 0) then -- PrintMessage('User '||GrantorA||' will grant object privileges to '||NrRoles||' different roles'); -- end if; -- else FOR r_rec IN (SELECT DISTINCT grantee FROM dba_tab_privs WHERE grantor = GrantorA AND grantee IN (SELECT ROLE FROM dba_roles) ) LOOP if (NOT RoleCreated(r_rec.grantee)) then CreateRole(r_rec.grantee,GrantorA||' gave obj privs to it'); MarkRoleAsCreated(r_rec.grantee); end if; END LOOP; -- end if; END; ------------------------------------------------------------------------------ PROCEDURE CreatePublicSynonyms(UsernameA IN VARCHAR2) IS NrSyn number; BEGIN PrintDebug('Entering CreatePublicSynonyms for user '||UsernameA); if (NOT GenSql) then select count(*) into NrSyn FROM dba_synonyms WHERE owner = 'PUBLIC' AND table_owner = UsernameA; if (NrSyn > 0) then PrintMessage(NrSyn||' public synonyms refer to user '||UsernameA); end if; else StartWheneverSqlError; FOR s_rec IN (SELECT * FROM dba_synonyms WHERE owner = 'PUBLIC' AND table_owner = UsernameA) LOOP PrintInfo(3,'Creating public synonym '||UsernameA||'.'||s_rec.synonym_name); PrintMessage('CREATE or replace public synonym '||s_rec.synonym_name||' for '||s_rec.table_owner||'.'||s_rec.table_name||';'); END LOOP; StopWheneverSqlError; end if; END; ------------------------------------------------------------------------------ PROCEDURE CreateDependentTablespaces(UsernameA IN VARCHAR2) IS u_rec dba_users%ROWTYPE; USER_NOT_FOUND EXCEPTION; BEGIN PrintDebug('Entering CreateDependentTablespaces for user '||UsernameA); begin SELECT * INTO u_rec FROM dba_users WHERE username = Upper(UsernameA); EXCEPTION WHEN No_Data_Found THEN RAISE USER_NOT_FOUND; END; IF (GenSql) THEN PrintInfo(3,'Creating dependent tablespaces for user '||UsernameA, true); END IF; FOR t_rec IN (SELECT DISTINCT default_tablespace AS tablespace_name, 'is default TS for '||UsernameA as reason FROM dba_users WHERE username = Upper(UsernameA) UNION ALL SELECT DISTINCT temporary_tablespace AS tablespace_name, 'is temp TS for '||UsernameA FROM dba_users WHERE username = Upper(UsernameA) UNION ALL SELECT DISTINCT tablespace_name, 'user '||UsernameA||' has quota on it' FROM dba_ts_quotas WHERE username = Upper(UsernameA) UNION all SELECT DISTINCT tablespace_name, 'user '||UsernameA||' has data in it' FROM dba_segments WHERE owner = Upper(UsernameA) ) loop RecreateTablespace(t_rec.tablespace_name,t_rec.reason); END LOOP; EXCEPTION WHEN OTHERS THEN Raise_application_error(-20000,'Error in CreateDependentTS for '||UserNameA,true); END; ------------------------------------------------------------------------------ procedure CreateContexts(UserNameA in varchar2) is Stmt varchar2(1024); CtxType varchar2(64); begin PrintDebug('Entering CreateContexts for '||UsernameA); IF (GenSql) THEN PrintInfo(3,'Creating contexts for user '||UsernameA, true); end if; for c_rec in (select * from dba_context where schema = upper(UsernameA)) loop Stmt := 'create context '||c_rec.namespace||' using '||c_rec.schema||'.'||c_rec.package; if (NOT DbVersion like '8.%') then -- Accessed globally was only introduced in Oracle 9i execute immediate 'select type from dba_context where namespace = '''||c_rec.namespace||'''' into CtxType; Stmt := Stmt || ' ' || CtxType; end if; if (GenSql) then PrintMessage(Stmt); else PrintMessage('Context '||c_rec.namespace||' will be created'); end if; end loop; end; ------------------------------------------------------------------------------ PROCEDURE CreateOneUser(UsernameA IN VARCHAR2) IS u_rec dba_users%ROWTYPE; USER_NOT_FOUND EXCEPTION; NrPrivs number; BEGIN PrintDebug('Entering CreateOneUser for '||UsernameA); begin SELECT * INTO u_rec FROM dba_users WHERE username = Upper(UsernameA); EXCEPTION WHEN No_Data_Found THEN PrintDebug('ERROR: User '||UsernameA||' not found in dba_users'); RAISE USER_NOT_FOUND; END; if (OptCreateUsers) then if (OptDependentTS) THEN PrintDebug('Creating dependent TS before creating user '||UsernameA); CreateDependentTablespaces(UsernameA); end if; if (NOT GenSql) then PrintMessage('User '||u_rec.username||' will be created'); else IF (IncDropUsers AND NOT IncDropUsersCascade) THEN PrintInfo(3,'Dropping user '||u_rec.username); PrintMessage('drop user '||u_rec.username||';'); ELSIF (IncDropUsers AND IncDropUsersCascade) THEN PrintInfo(3,'Dropping user '||u_rec.username); PrintMessage('drop user '||u_rec.username||' cascade;'); END IF; PrintInfo(3,'Creating user '||u_rec.username); StartWheneverSqlError; IF (u_rec.password <> 'EXTERNAL') then PrintMessage('CREATE USER '||u_rec.username||' identified by values '''||u_rec.password||''''); else PrintMessage('CREATE USER '||u_rec.username||' identified externally'); END IF; PrintMessage(' default tablespace '||u_rec.default_tablespace); PrintMessage(' temporary tablespace '||u_rec.temporary_tablespace); PrintMessage(' profile '||u_rec.PROFILE||';'); end if; end if; if (OptSetQuotas) then IF (GenSql) THEN PrintInfo(3,'Setting quotas for '||UsernameA, true); END IF; FOR q_rec IN (SELECT Decode(max_bytes,-1,'UNLIMITED',To_Char( ceil(max_bytes/1024/1024) )||'M' ) AS max_bytes, tablespace_name FROM dba_ts_quotas WHERE username = UsernameA) LOOP IF (GenSql) then PrintMessage('ALTER USER '||UsernameA||' quota '||q_rec.max_bytes||' on '||q_rec.tablespace_name||';'); ELSE PrintMessage('User '||UsernameA||' will get quotas of '||q_rec.max_bytes||' on '||q_rec.tablespace_name); END IF; END LOOP; end if; if (OptSysPrivsUsers) THEN PrintDebug('SysPrivs=true, generating grants for system privileges granted to '||UsernameA); select count(*) into NrPrivs FROM dba_sys_privs WHERE grantee = upper(UsernameA); if (NrPrivs > 0 AND GenSql) then PrintInfo(3,'Granting '||NrPrivs||' system privileges to user '||UsernameA, true); FOR p_rec IN (SELECT grantee, privilege, Decode(admin_option,'YES',' with admin option','') AS admin_option FROM dba_sys_privs WHERE grantee = upper(UsernameA)) LOOP if (NOT IsExcludedSysPriv(p_rec.privilege)) then PrintMessage('grant '||p_rec.privilege||' to '||p_rec.grantee||p_rec.admin_option||';'); end if; END LOOP; elsif (NrPrivs > 0) then PrintMessage('User '||UsernameA||' will receive '||NrPrivs||' system privileges directly'); ELSE PrintDebug('No system privileges granted to '||UsernameA); end if; end if; if (OptObjPrivsUsers) then PrintDebug('ObjPrivs=true, generating grants for object privileges granted to '||UsernameA); select count(*) into NrPrivs FROM dba_tab_privs WHERE grantee = Upper(UsernameA); if (NrPrivs > 0 AND GenSql) then PrintInfo(3,'Granting '||NrPrivs||' object privileges to user '||UsernameA, true); FOR s_rec IN (SELECT owner, table_name, grantee, privilege, Decode(grantable,'YES',' with grant option','') AS grantable FROM dba_tab_privs WHERE grantee = Upper(UsernameA) ORDER BY grantor, table_name, privilege) LOOP PrintMessage('GRANT '||s_rec.privilege||' ON '||s_rec.owner||'.'||s_rec.table_name|| ' TO '||s_rec.grantee||s_rec.grantable||';'); END LOOP; ELSIF (NrPrivs > 0) then PrintMessage('User '||UsernameA||' will receive '||NrPrivs||' object privileges'); ELSE PrintDebug('No object privileges granted to '||UsernameA); end if; end if; if (OptPublicSynonyms) THEN PrintDebug('PublicSynonyms=true, generating create synonyms for objects of '||UsernameA); CreatePublicSynonyms(UsernameA); end if; if (OptContexts) THEN PrintDebug('OptContexts=true, generating create context for packages of '||UsernameA); CreateContexts(UsernameA); end if; StopWheneverSqlError; PrintDebug('Finished CreateOneUser for '||UsernameA); EXCEPTION WHEN USER_NOT_FOUND THEN Raise_application_error(-20000,'Error in CreatOneUser: user does not exist: '||UserNameA,true); WHEN OTHERS THEN Raise_application_error(-20000,'Error in CreatOneUser for '||UserNameA,true); END; ------------------------------------------------------------------------------ PROCEDURE RecreateTablespaces(TsListA IN VARCHAR2 DEFAULT null) IS TmpList VARCHAR2(2000); CommaPos NUMBER; Cntr NUMBER := 0; BEGIN IF (GenSql) THEN PrintInfo(2,'Creating tablespaces '||TsListA||' (null=all)'); END IF; IF (Trim(TsListA) IS NULL) THEN FOR t_rec IN (SELECT tablespace_name FROM dba_tablespaces WHERE tablespace_name NOT IN ('SYSTEM')) loop TmpList := TmpList||','||t_rec.tablespace_name; END LOOP; TmpList := SubStr(TmpList,2); ELSE TmpList := TsListA; END IF; WHILE (TmpList IS NOT NULL AND Cntr < 1000) LOOP CommaPos := InStr(TmpList,','); IF (CommaPos > 0) THEN RecreateTablespace( Trim(Upper(SubStr(TmpList,1,CommaPos-1))),'it is in list of requested TS' ); TmpList := SubStr(TmpList,CommaPos+1); else RecreateTablespace( Trim(Upper(TmpList)),'it is in list of requested TS' ); TmpList := NULL; END IF; Cntr := Cntr + 1; END LOOP; END; ------------------------------------------------------------------------------ PROCEDURE ViewsOfUser(UserA IN VARCHAR2, GenSqlA IN boolean) IS NrViews NUMBER; ViewText VARCHAR2(20000); ViewCollist VARCHAR2(20000); NrDep NUMBER; BEGIN IF (NOT GenSqlA) THEN SELECT Count(*) INTO NrViews FROM dba_views WHERE owner = Upper(UserA); PrintMessage('User '||UserA||' has '||NrViews||' views'); NrDep := 0; FOR s_rec IN (SELECT referenced_owner, referenced_link_name, Count(*) AS nr_dep FROM dba_dependencies WHERE owner = Upper(UserA) AND (referenced_owner <> Upper(UserA) OR referenced_owner IS NULL) AND TYPE = 'VIEW' GROUP BY referenced_owner, referenced_link_name ORDER BY referenced_link_name, referenced_owner) LOOP PrintMessage(s_rec.nr_dep||' views have dependencies to '||s_rec.referenced_owner||AddPreIfNotNull(s_rec.referenced_link_name,'@')); NrDep := NrDep + s_rec.nr_dep; END LOOP; IF (NrDep > 0) THEN PrintMessage('Note: remote dependencies over database links are not included'); PrintMessage(''); END IF; ELSE PrintInfo(2,'Views for user '||UserA); FOR v_rec IN (SELECT owner, view_name FROM dba_views WHERE owner = Upper(UserA)) LOOP ViewText := FetchViewText(v_rec.owner, v_rec.view_name); ViewColList := FetchViewCollist(v_rec.owner, v_rec.view_name); --DbLinks := GetDbLinksFromSqlText(ViewText); PrintMessage('CREATE OR REPLACE FORCE VIEW '||v_rec.owner||'.'||v_rec.view_name||' '|| '('||ViewCollist||') AS '||ViewText||';'); PrintMessage(''); END LOOP; END IF; END; ------------------------------------------------------------------------------ PROCEDURE SynonymsOwnedByUser(UserA IN VARCHAR2, GenSqlA IN boolean) IS BEGIN IF (NOT GenSqlA) then FOR s_rec IN (SELECT table_owner, db_link, Count(*) AS nr_syn FROM dba_synonyms WHERE owner = Upper(UserA) AND (table_owner <> Upper(UserA) OR table_owner IS NULL) GROUP BY table_owner, db_link ORDER BY db_link, table_owner) LOOP PrintMessage('User '||UserA||' has '||s_rec.nr_syn||' synonyms to '||Nvl(s_rec.table_owner,'')||AddPreIfNotNull(s_rec.db_link,'@')); END LOOP; ELSE PrintInfo(2,'Synonyms for user '||UserA); FOR s_rec IN (SELECT * FROM dba_synonyms WHERE owner = Upper(UserA) AND (table_owner <> Upper(UserA) OR table_owner IS NULL) ORDER BY db_link, table_owner, table_name) LOOP PrintMessage('CREATE OR REPLACE SYNONYM '||UserA||'.'||s_rec.synonym_name|| ' FOR '||AddPostIfNotNull(s_rec.table_owner,'.')||s_rec.table_name||AddPreIfNotNull(s_rec.db_link,'@')||';'); END LOOP; PrintMessage(''); END IF; END; ------------------------------------------------------------------------------ PROCEDURE Dependencies(UserListA IN VARCHAR2 DEFAULT NULL, GenSqlA IN boolean) IS UserTab Dbms_Utility.uncl_array; UserTabLen NUMBER; BEGIN dbms_application_info.set_action('Dependencies'); Dbms_Utility.comma_to_table( UserListA, UserTabLen, UserTab); FOR i IN 1 .. UserTabLen LOOP PrintInfo(2,'Dependencies for user '||UserTab(i)); SynonymsOwnedByUser(UserTab(i), GenSqlA => GenSqlA); ViewsOfUser(UserTab(i), GenSqlA => GenSqlA); END LOOP; END; ------------------------------------------------------------------------------ PROCEDURE RecreateUsers IS BEGIN dbms_application_info.set_action('RecreateUsers'); PrintDebug('Entering RecreateUsers, UserTab.count='||UserTab.count); for i in 1 .. UserTab.count LOOP CreateOneUser( UserTab(i) ); END LOOP; PrintDebug('Finished RecreateUsers'); END; ------------------------------------------------------------------------------ PROCEDURE RecreateRoles(UserListA IN VARCHAR2 DEFAULT null) IS BEGIN dbms_application_info.set_action('RecreateRoles'); PrintDebug('Entering RecreateRoles'); for i in 1 .. UserTab.count LOOP if (OptCreateRoles) THEN PrintDebug('CreateRoles=true, processing CREATE for user '||UserTab(i)); DoRolesGrantedToUser(UserTab(i),'CREATE'); PrintDebug('CreateRoles=true, also processing RolesToWhichObjPrivsAreGranted for role '||UserTab(i)); RolesToWhichObjPrivsAreGranted(UserTab(i)); ELSE PrintDebug('CreateRoles=false, not creating roles of user '||UserTab(i)); end if; if (OptSysPrivsRoles) then PrintDebug('SysPrivs=true, processing ADDSYSPRIVS for roles of user '||UserTab(i)); DoRolesGrantedToUser(UserTab(i),'ADDSYSPRIVS'); ELSE PrintDebug('SysPrivs=false, not grant system privs to roles of user '||UserTab(i)); end if; if (OptObjPrivsRoles) then PrintDebug('ObjPrivs=true, processing ADDOBJPRIVS for roles of user '||UserTab(i)); DoRolesGrantedToUser(UserTab(i),'ADDOBJPRIVS'); ELSE PrintDebug('ObjPrivs=false, not grant object privs to roles of user '||UserTab(i)); end if; if (OptGrantRoles) then PrintDebug('GrantRoles=true, processing GRANT for roles of user '||UserTab(i)); DoRolesGrantedToUser(UserTab(i),'GRANT'); ELSE PrintDebug('GrantRoles=false, not granting roles to user '||UserTab(i)); end if; end loop; PrintDebug('Finished RecreateRoles'); end; ------------------------------------------------------------------------------- procedure SetDebug(DebugA in boolean default true) is begin Debug := DebugA; PrintDebug('Debug option is enabled'); end; ------------------------------------------------------------------------------- procedure SetScriptOptions(GenSqlA in boolean default true, LogFileNameA in varchar2 default null, WheneverSqlErrorA in boolean default false, AddInfoA in boolean default true, CheckRoleExistanceA in boolean default false, NrPausesA in number default 0, DocFormatA in varchar2 default 'TXT', IncDropUsersA in boolean default false, IncDropUsersCascadeA in boolean default false, LineSizeA in number default 200 ) is begin dbms_application_info.set_action('Setting Script Options'); -- Indicate if a real migrate script should be generated (true) or just -- a text file with information about what the migrate script would do if (GenSqlA) then GenSql := true; else GenSql := false; end if; LogFileName := LogFileNameA; -- Indicate if CREATE statements should be enclosed by WHENEVER SQL commands if (WheneverSqlErrorA) then IncludeWheneverSqlError := True; else IncludeWheneverSqlError := false; end if; if (AddInfoA) then AddInfo := True; else AddInfo := false; end if; -- Indicate if the CREATE ROLE statements should be executed 'as is' or -- if result should only create roles if they don't exists yet in the target database if (CheckRoleExistanceA) then CheckRoleExistance := True; else CheckRoleExistance := false; end if; -- Specify how many pause statements should be included in the output before -- running the rest of the script automatically if (NrPausesA >= 0) then NrPauses := NrPausesA; else Raise_Application_Error(-20999,'Error in SetScriptOptions: NrPausesA should be >= 0'); end if; if (upper(DocFormatA) in ('TXT','HTM')) then DocFormat := upper(DocFormatA); else Raise_Application_Error(-20999,'Error in SetScriptOptions: DocFormatA should be TXT or HTM'); end if; -- Generates 'DROP USER' statements before every CREATE USER IncDropUsers := IncDropUsersA; -- Adds CASCADE to each DROP USER statements IncDropUsersCascade := IncDropUsersCascade; if (LineSizeA > 0) then LineSize := LineSizeA; end if; end; ------------------------------------------------------------------------------- procedure SetDatafileOptions(SrcSeparatorA in varchar2 default null, DstSeparatorA in varchar2 default null, FilesizeInitialPctA in number default 100, FilesizeAutomaxPctA in number default 100, ForceAutoextendA in boolean default true, DefaultDirectoryA in varchar2 default null, ConvertFilenamesToLowerA in boolean default false, IncDropPermanentTablespacesA in boolean default false, IncIncludeDropTSContentsA in boolean default false, IncDropTemporaryTablespacesA in boolean default false ) is begin dbms_application_info.set_action('Setting datafile options'); if (SrcSeparatorA in ('/','\')) then SourceDirectorySeparator := SrcSeparatorA; elsif (SrcSeparatorA is not null) then Raise_Application_Error(-20999,'Error in SetDatafileOptions: SrcSeparatorA should be / or \'); end if; if (DstSeparatorA in ('/','\')) then DestinationDirectorySeparator := DstSeparatorA; elsif (DstSeparatorA is not null) then Raise_Application_Error(-20999,'Error in SetDatafileOptions: DstSeparatorA should be / or \'); end if; -- Create new datafiles as small files (they will grow during import due to autoextend) if (FilesizeInitialPctA > 0) then FilesizeInitialPct := FilesizeInitialPctA; else Raise_Application_Error(-20999,'Error in SetDatafileOptions: FilesizeInitialPctA should be > 0'); end if; -- Specify the generated value of autoextend maxsize as a percentage of the current file size if (FilesizeAutomaxPctA > 0) then FilesizeAutomaxPct := FilesizeAutomaxPctA; else Raise_Application_Error(-20999,'Error in SetDatafileOptions: FilesizeAutomaxPctA should be > 0'); end if; -- Force all files to have the autoextend option enabled. If set to false, the -- same setting will be used as on the source database ForceAutoextend := ForceAutoextendA; ConvertFilenamesToLower := ConvertFilenamesToLowerA; -- Indicate the directory where all datafiles will be put on the target database -- Specify an empty string to keep datafiles in the same directory as the source database -- Note: an AddDatafileDirectory may override the target location of the datafile DefaultDatafileDirectory := rtrim(DefaultDirectoryA,'\/'); -- Generate DROP statements for permanent tablespaces IncDropPermanentTablespaces := IncDropPermanentTablespacesA; -- Adds 'including contents and datafiles' to drop tablespace IncIncludeDropTSContents := IncIncludeDropTSContentsA; -- Generate DROP statements for temporary tablespaces IncDropTemporaryTablespaces := IncDropTemporaryTablespacesA; end; ------------------------------------------------------------------------------ PROCEDURE ExcludeTablespace(TablespaceA IN VARCHAR2) IS begin -- Specify which tablespaces from the source database should be excluded for -- generating 'create tablespace' statements for i in 1 .. IncludedTablespaces.count loop if (IncludedTablespaces(i) = TablespaceA) then Raise_Application_Error(-20999,'Error: cannot exclude and include the same tablespace: '||TablespaceA); end if; end loop; CreatedTablespaces(CreatedTablespaces.Count+1) := TablespaceA; END; ------------------------------------------------------------------------------ PROCEDURE IncludeTablespace(TablespaceA IN VARCHAR2) IS begin -- Specify which tablespaces from the source database should be included for -- generating 'create tablespace' statements, even if there are no -- dependencies with any user for i in 1 .. CreatedTablespaces.count loop if (CreatedTablespaces(i) = TablespaceA) then Raise_Application_Error(-20999,'Error: cannot exclude and include the same tablespace: '||TablespaceA); end if; end loop; IncludedTablespaces(IncludedTablespaces.Count+1) := TablespaceA; END; ------------------------------------------------------------------------------ PROCEDURE ExcludeSysPriv(PrivilegeA IN VARCHAR2) IS begin -- Specify which system privileges from the source database should be excluded for -- generating 'grant ' statements ExcludedSysPrivs(ExcludedSysPrivs.Count+1) := PrivilegeA; END; ------------------------------------------------------------------------------ PROCEDURE ExcludeRole(RoleA IN VARCHAR2) IS begin -- Specify which tablespaces from the source database should be excluded for -- generating create and grant statements ExcludedRoles(ExcludedRoles.Count+1) := RoleA; END; ------------------------------------------------------------------------------ PROCEDURE AddDatafileDirectory(IfLikeA IN VARCHAR2, DirA IN VARCHAR2) IS BEGIN -- Change directory path for certain files. Acts as a replace() on the filename: -- I.e.: (arg1,arg2) means: if source-datafile like arg1 then directory on the -- target database will be arg2 (arg2 should only specify a directory) IF (IfLikeA IS NOT NULL) THEN DatafileLikeTable(DatafileLikeTable.Count+1) := IfLikeA; DatafileDirectoryTable(DatafileDirectoryTable.Count+1) := DirA; ELSE Raise_Application_Error(-20000,'Cannot call AddDatafileDirectory with first argument NULL'); END IF; EXCEPTION WHEN OTHERS THEN Raise_Application_Error(-20000,'Error in AddDatafileDirectory for '||IfLikeA||' and '||DirA,TRUE); END; ------------------------------------------------------------------------------- PROCEDURE SetUserList(UserListA in varchar2) is UserTabLen number; BEGIN dbms_application_info.set_action('Setting userlist'); PrintDebug('Entering SetUserList'); UserTab.delete; IF (Trim(UserListA) IS NULL) THEN -- No users specified, take all users in the database FOR u_rec IN (SELECT username FROM dba_users WHERE username NOT IN ('SYS','SYSTEM','SYSMAN','SCHEDULER_ADMIN','MGMT_USER','MGMT_VIEW','DBSNMP','WMSYS')) loop UserTab(UserTab.count+1) := u_rec.username; END LOOP; ELSE Dbms_Utility.comma_to_table(UserListA, UserTabLen, UserTab); for i in 1 .. UserTab.count LOOP if (UserTab(i) is null) then UserTab.delete(i); end if; end loop; END IF; PrintDebug('Found '||UserTab.count||' users to be processed, leaving SetUserList'); end; ------------------------------------------------------------------------------- procedure SetCreateOptions(CreateUsers in boolean, SysPrivsUsers in boolean, ObjPrivsUsers in boolean, DependentTS in boolean, PublicSynonyms in boolean, SetQuotas in boolean, CreateRoles in boolean, SysPrivsRoles in boolean, ObjPrivsRoles in boolean, GrantRoles in boolean, Contexts in boolean) is begin dbms_application_info.set_action('Setting Create Options'); OptCreateUsers := CreateUsers; OptSysPrivsUsers := SysPrivsUsers; OptObjPrivsUsers := ObjPrivsUsers; OptDependentTS := DependentTS; OptPublicSynonyms := PublicSynonyms; OptSetQuotas := SetQuotas; OptCreateRoles := CreateRoles; OptSysPrivsRoles := SysPrivsRoles; OptObjPrivsRoles := ObjPrivsRoles; OptGrantRoles := GrantRoles; OptContexts := Contexts; end; ------------------------------------------------------------------------------- procedure SetCreateOptions(PrePostImportA in varchar2) is begin dbms_application_info.set_action('Setting Create Options'); if (upper(PrePostImportA) = 'PRE') then --Post-import: create all the necessary sql to be executed before the import: SetCreateOptions(CreateUsers=>true, SysPrivsUsers=>true, ObjPrivsUsers=>false, DependentTS=>true, PublicSynonyms=>false, SetQuotas=>true, CreateRoles=>true, SysPrivsRoles=>true, ObjPrivsRoles=>false, GrantRoles=>true, Contexts=>false); elsif (upper(PrePostImportA) = 'POST') then --Post-import: create all the necessary sql to be executed after the import: SetCreateOptions(CreateUsers=>false, SysPrivsUsers=>false, ObjPrivsUsers=>true, DependentTS=>false, PublicSynonyms=>true, SetQuotas=>false, CreateRoles=>false, SysPrivsRoles=>false, ObjPrivsRoles=>true, GrantRoles=>false, Contexts=>true); else Raise_Application_Error(-20999,'Error in SetCreateOptions: PrePostImportA should be PRE or POST'); end if; end; ------------------------------------------------------------------------------ procedure BigBanner(MsgA in varchar2) is begin PrintMessage('--='||lpad('=',length(MsgA),'=')); PrintMessage('-- '||MsgA); PrintMessage('--='||lpad('=',length(MsgA),'=')); end; ------------------------------------------------------------------------------ PROCEDURE Initialize IS BEGIN dbms_application_info.set_action('Initializing'); Dbms_Output.ENABLE(1000000); PrintMessage('whenever oserror exit'); SELECT NAME INTO DbName FROM v$database; PrintMessage(''); PrintMessage('-- Script for database '||DbName||', generated at '||To_Char(SYSDATE,'DD-Mon-YYYY HH24:MI:SS')); PrintMessage('set feedback off linesize 1000 trimspool on'); PrintMessage('set serveroutput on format wrapped'); PrintMessage(''); PrintMessage('-- This script can recreate users, roles, tablespaces, etc...'); PrintMessage('-- It can be used before and after a user-export/import (exp owner=...)'); PrintMessage('-- Please verify the script manually before running it'); PrintMessage('-- Use of this script is at your own risk'); PrintMessage(''); if (LogFileName is not null) then PrintMessage('spool '||LogFileName); end if; SELECT Value INTO DbBlockSize FROM v$parameter WHERE NAME = 'db_block_size'; select version into DbVersion from v$instance; CreatedRoles.DELETE; GrantedSysPrivsRoles.DELETE; GrantedObjPrivsRoles.DELETE; GrantedRoles.DELETE; PausesPrinted := 0; QueuedMessage := ''; if (SourceDirectorySeparator is null) then DECLARE NrSlash NUMBER := 0; NrBack NUMBER := 0; BEGIN FOR n_rec IN (SELECT NAME FROM v$datafile) LOOP FOR i IN 1 .. Length(n_rec.NAME) LOOP IF (SubStr(n_rec.NAME,i,1) = '/') THEN NrSlash := NrSlash + 1; END IF; IF (SubStr(n_rec.NAME,i,1) = '\') THEN NrBack := NrBack + 1; END IF; END LOOP; END LOOP; IF (NrSlash > 0) THEN SourceDirectorySeparator := '/'; PrintDebug('Platform is Unix, SourceDirectorySeparator = /'); ELSE SourceDirectorySeparator := '\'; PrintDebug('Platform is Windows, SourceDirectorySeparator = \'); END IF; END; end if; if (DestinationDirectorySeparator is null) then DestinationDirectorySeparator := SourceDirectorySeparator; end if; END; ------------------------------------------------------------------------------ PROCEDURE Finalize IS BEGIN if (LogFileName is not null) then PrintMessage('spool off'); end if; PrintMessage('set feedback on'); end; ------------------------------------------------------------------------------- procedure Run(BigBannerA in varchar2 default null) is begin if (BigBannerA is not null) then BigBanner('START OF '||BigBannerA); end if; Initialize; DoVerifyTargetDatabase; for i in 1 .. IncludedTablespaces.count loop RecreateTablespace(IncludedTablespaces(i),'it was explicitly included'); end loop; RecreateUsers; RecreateRoles; Finalize; if (BigBannerA is not null) then BigBanner('END OF '||BigBannerA); end if; PrintMessage(''); PrintMessage(''); PrintMessage(''); dbms_application_info.set_action('Finished Run'); end; ------------------------------------------------------------------------------- procedure Reset is begin -- SetDebug Debug := false; -- VerifyTargetDatabase OptVerifyDbName := null; OptVerifyHostName := null; OptVerifyInstanceName := null; OptVerifyVersionLike := null; -- SetScriptOptions GenSql := true; LogFileName := null; IncludeWheneverSqlError := true; NrPauses := 1; DocFormat := 'TXT'; AddInfo := TRUE; IncDropUsers := FALSE; IncDropUsersCascade := FALSE; CheckRoleExistance := TRUE; LineSize := 200; -- SetDatafileOptions SourceDirectorySeparator := ''; DestinationDirectorySeparator := ''; DefaultDatafileDirectory := ''; ConvertFilenamesToLower := TRUE; IncDropPermanentTablespaces := FALSE; IncIncludeDropTSContents := FALSE; IncDropTemporaryTablespaces := FALSE; ForceAutoextend := FALSE; FilesizeInitialPct := 100; FilesizeAutomaxPct := 100; FilesizeAutomaxMaxKb := 33554416; ForceAutoallocate := TRUE; -- SetCreateOptions OptCreateUsers := true; OptSysPrivsUsers := true; OptObjPrivsUsers := false; OptDependentTS := true; OptPublicSynonyms := false; OptSetQuotas := true; OptCreateRoles := true; OptSysPrivsRoles := true; OptObjPrivsRoles := false; OptGrantRoles := true; OptContexts := false; -- ExcludeTablespace CreatedTablespaces.delete; -- IncludeTablespace IncludedTablespaces.delete; -- ExcludeSysPriv ExcludedSysPrivs.delete; -- ExcludeRole ExcludedRoles.delete; -- AddDatafileDirectory DatafileLikeTable.delete; DatafileDirectoryTable.delete; -- SetUserList UserTab.delete; -- Internal CreatedRoles.delete; GrantedSysPrivsRoles.delete; GrantedObjPrivsRoles.delete; GrantedRoles.delete; PausesPrinted := 0; QueuedMessage := ''; end; ------------------------------------------------------------------------------ procedure CORP is begin SetDebug(false); VerifyTargetDatabase('CORP', InstanceNameA => 'CORP', HostNameA => 'ANTILOPE', VersionLikeA => '10.2.0.3%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportCORP.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '\', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 1000, ForceAutoextendA => true, DefaultDirectoryA => 'E:\Oracle\Oradata\CORP'); ExcludeTablespace('TEMP'); ExcludeTablespace('DRSYS'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); IncludeTablespace('CIM_DATA'); ExcludeSysPriv('ADMINISTER RESOURCE MANAGER'); -- Does not exist in 10g ExcludeRole('SNMPAGENT'); -- Does not exist in 10g AddDatafileDirectory('%INDEX%','F:\ORACLE\ORADATA\CORP'); SetUserList('CIM,CORP'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for CORP (40_PreImportCORP.sql)'); SetCreateOptions(PrePostImportA => 'POST'); SetScriptOptions(LogFileNameA => 'PostImportCORP.log'); Run('POST-IMPORT STATEMENTS for CORP (60_PostImportCORP.sql)'); end; ------------------------------------------------------------------------------ procedure MDB is begin SetDebug(false); VerifyTargetDatabase('MDB', InstanceNameA => 'MDB', HostNameA => 'ANTILOPE', VersionLikeA => '10.2.0.3%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportMDB.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '\', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 120, ForceAutoextendA => true, DefaultDirectoryA => 'F:\Oracle\Oradata\MDB'); ExcludeTablespace('TEMP'); ExcludeTablespace('DRSYS'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); ExcludeSysPriv('ADMINISTER RESOURCE MANAGER'); -- Does not exist in 10g ExcludeRole('SNMPAGENT'); -- Does not exist in 10g AddDatafileDirectory('%INDEX%','E:\ORACLE\ORADATA\MDB'); SetUserList('BVDMDB_SET_MNGT,BVDMDBIMPORT,BVDMDB'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for MDB (40_PreImportMDB.sql)'); SetCreateOptions(PrePostImportA => 'POST'); Run('POST-IMPORT STATEMENTS for MDB (60_PostImportMDB.sql)'); end; ------------------------------------------------------------------------------ procedure MDBW is begin SetDebug(false); VerifyTargetDatabase('MDBW', InstanceNameA => 'MDBW', HostNameA => 'ANTILOPE', VersionLikeA => '10.2.0.3%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportMDBW.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '\', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 120, ForceAutoextendA => true, DefaultDirectoryA => 'F:\Oracle\Oradata\MDBW'); ExcludeTablespace('TEMP'); ExcludeTablespace('DRSYS'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); ExcludeSysPriv('ADMINISTER RESOURCE MANAGER'); -- Does not exist in 10g ExcludeRole('SNMPAGENT'); -- Does not exist in 10g ExcludeRole('JAVADEBUGPRIV'); ExcludeRole('JAVAIDPRIV'); ExcludeRole('JAVAUSERPRIV'); ExcludeRole('JAVASYSPRIV'); AddDatafileDirectory('%INDEX%','E:\ORACLE\ORADATA\MDBW'); SetUserList('BVDMDB_SET_MNGT,BVDMDBIMPORT,BVDMDB'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for MDBW (40_PreImportMDBW.sql)'); SetCreateOptions(PrePostImportA => 'POST'); Run('POST-IMPORT STATEMENTS for MDBW (60_PostImportMDBW.sql)'); end; ------------------------------------------------------------------------------ procedure BORP is begin SetDebug(false); VerifyTargetDatabase('BORP', InstanceNameA => 'BORP', HostNameA => 'ANTILOPE', VersionLikeA => '10.2.0.3%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportBORP.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '\', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 120, ForceAutoextendA => true, DefaultDirectoryA => 'E:\Oracle\Oradata\BORP'); ExcludeTablespace('TEMP'); ExcludeTablespace('DRSYS'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); ExcludeSysPriv('EXTENDS ANY TYPE'); -- Does not exist in 10g ExcludeRole('SNMPAGENT'); -- Does not exist in 10g -- ExcludeRole('JAVADEBUGPRIV'); -- ExcludeRole('JAVAIDPRIV'); -- ExcludeRole('JAVAUSERPRIV'); -- ExcludeRole('JAVASYSPRIV'); AddDatafileDirectory('%INDEX%','F:\ORACLE\ORADATA\BORP'); SetUserList('BORP,CACC,CADEV,CDEV,CPDEV,CPRD,CPRDEV,MACC,MDEV,MPRD,PRACC,PRDEV,PRPRD,QM,QMEUA,QM_1,QM_2,QM_BORP,RMB,SACC,SDEV,SPRD'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for BORP (40_PreImportBORP.sql)'); SetCreateOptions(PrePostImportA => 'POST'); Run('POST-IMPORT STATEMENTS for BORP (60_PostImportBORP.sql)'); end; ------------------------------------------------------------------------------ procedure CORPSTAT is begin SetDebug(false); VerifyTargetDatabase('CORP', InstanceNameA => 'CORP', HostNameA => 'ANTILOPE', VersionLikeA => '10.2.0.3%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportCORPStat.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '\', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 1000, ForceAutoextendA => true, DefaultDirectoryA => 'E:\Oracle\Oradata\CORP'); ExcludeTablespace('TEMP'); ExcludeTablespace('DRSYS'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); ExcludeSysPriv('ADMINISTER RESOURCE MANAGER'); -- Does not exist in 10g ExcludeRole('SNMPAGENT'); -- Does not exist in 10g AddDatafileDirectory('%INDEX%','F:\ORACLE\ORADATA\CORP'); SetUserList('STAT'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for CORP (XX_PreImportCORPStat.sql)'); SetCreateOptions(PrePostImportA => 'POST'); SetScriptOptions(LogFileNameA => 'PostImportCORPStat.log'); Run('POST-IMPORT STATEMENTS for CORP (XX_PostImportCORPStat.sql)'); end; ------------------------------------------------------------------------------ procedure ZINT is begin SetDebug(false); VerifyTargetDatabase('TRUDBA', InstanceNameA => 'TRUDBA', HostNameA => 'trudba', VersionLikeA => '9.2.0%'); SetScriptOptions(GenSqlA => true, LogFileNameA => 'PreImportZINT.log', WheneverSqlErrorA => false, AddInfoA => true, CheckRoleExistanceA => true, NrPausesA => 0, LineSizeA => 150); -- Indicate the file system type for the source and destination database: SetDatafileOptions(SrcSeparatorA => '/', DstSeparatorA => '\', FilesizeInitialPctA => 1, FilesizeAutomaxPctA => 1000, ForceAutoextendA => true, DefaultDirectoryA => 'I:\Oracle\Oradata\ZINT'); ExcludeTablespace('TEMP'); ExcludeTablespace('RBS'); ExcludeTablespace('USERS'); SetUserList('ZINT'); SetCreateOptions(PrePostImportA => 'PRE'); Run('PRE-IMPORT STATEMENTS for ZINT (XX_PreImportCORPStat.sql)'); SetCreateOptions(PrePostImportA => 'POST'); SetScriptOptions(LogFileNameA => 'PostImportCORPStat.log'); Run('POST-IMPORT STATEMENTS for ZINT (XX_PostImportCORPStat.sql)'); end; ------------------------------------------------------------------------------ begin dbms_application_info.set_module('RecreateUsers','Initializing'); Reset; END gdp$uptime_migration; /