oracletool.pl
上传用户:abclishi
上传日期:2007-01-07
资源大小:99k
文件大小:435k
源码类别:

Oracle数据库

开发平台:

Perl

  1.    logit("   Updating password for database $database");
  2.    $foo = dirname($scriptname);
  3.    if ($encryption_enabled) {
  4.       $sessionid = buildSessionid($username,$password);
  5.       logit("   SessionID = $sessionid");
  6.       logit("   Encryption is enabled.");
  7.     } else {
  8.       $sessionid = "$username~$password";
  9.       logit("   Encryption is NOT enabled.");
  10.    }
  11.    $sessioncookie = cookie(-name=>"$database.sessionid",-value=>"$sessionid",-expires=>"$expiration",-path=>"$foo");
  12.    print header(-cookie=>$sessioncookie);
  13.    $message     = "Password for database $database has been updated.";
  14.    $duration    = "1";
  15.    $url         = "$scriptname?database=$database&object_type=FRAMEPAGE";
  16.    $bgline = "<BODY BGCOLOR=$bgcolor>n";
  17.    if ($bgimage) {
  18.       if ((-e "$ENV{'DOCUMENT_ROOT'}/$bgimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$bgimage")) {
  19.          logit("   Background image is $ENV{'DOCUMENT_ROOT'}/$bgimage and is readable");
  20.          $bgline = "<BODY BACKGROUND=$bgimage>n";
  21.       }
  22.    }
  23.    
  24.    print <<"EOF";
  25. <HTML>
  26.   <HEAD>
  27.     <TITLE>Notice!</TITLE>
  28.     <META HTTP-EQUIV="Refresh" Content="$duration;URL=$url">
  29.   </HEAD>
  30.     $bgline
  31.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  32.     <CENTER>
  33.       $message
  34.     </CENTER
  35.   </BODY
  36. </HTML>
  37. EOF
  38. logit("Exit subroutine addPasswd");
  39. exit;
  40. }
  41. sub recentEvents {
  42.    logit("Enter subroutine recentEvents");
  43.    my ($sql,$text,$link,$infotext,$cols);
  44.    $sql = "$copyright
  45. SELECT 
  46.    TO_CHAR(TO_DATE(D.VALUE,'J'),'Day, Month DD, YYYY')||' -  '||
  47.    TO_CHAR(TO_DATE(S.VALUE,'sssss'),'HH24:MI:SS') "Instance startup time"
  48. FROM V$INSTANCE D, V$INSTANCE S
  49.    WHERE D.KEY = 'STARTUP TIME - JULIAN'
  50.    AND S.key = 'STARTUP TIME - SECONDS'
  51. " if ($oracle7);
  52.    $sql = "$copyright
  53. SELECT
  54.    TO_CHAR(STARTUP_TIME,'Day, Month DD YYYY -  HH24:MI:SS') "Instance startup time"
  55. FROM V$INSTANCE
  56. " if ($oracle8);
  57.    $text = "";
  58.    $link = "";
  59.    DisplayTable($sql,$text,$link);
  60.    $sql = "$copyright
  61. SELECT 
  62.    TO_CHAR(COUNT(*),'999,999,999,999') "Log switches"
  63. FROM V$LOG_HISTORY
  64.    WHERE FIRST_TIME > SYSDATE-1
  65. ";
  66.    $text = "Number of redo log switches last 24 hours.";
  67.    $link = "";
  68.    DisplayTable($sql,$text,$link);
  69.    $sql = "$copyright
  70. SELECT
  71.    NAME "Username"
  72. FROM SYS.USER$
  73.    WHERE CTIME > SYSDATE-30
  74.    AND TYPE = 1
  75. ";
  76.    $sql = "$copyright
  77. SELECT
  78.    NAME "Username"
  79. FROM SYS.USER$
  80.    WHERE CTIME > SYSDATE-30
  81.    AND TYPE# = 1
  82. " if ($oracle8);
  83.    $text        = "Users added in the last 30 days.";
  84.    $link        = "$scriptname?database=$database&object_type=USERINFO";
  85.    $infotext    = "No users have been added in the last 30 days.";
  86.    DisplayColTable($sql,$text,$link,$infotext,$schema_cols);
  87.    $sql = "$copyright
  88. SELECT
  89.    NAME "Role"
  90. FROM SYS.USER$
  91.    WHERE CTIME > SYSDATE-30
  92.    AND TYPE = 0
  93. ";
  94.    $sql = "$copyright
  95. SELECT
  96.    NAME "Role"
  97. FROM SYS.USER$
  98.    WHERE CTIME > SYSDATE-30
  99.    AND TYPE# = 0
  100. " if ($oracle8);
  101.    $text        = "Roles added in the last 30 days.";
  102.    $link        = "$scriptname?database=$database&object_type=ROLES";
  103.    $infotext    = "No roles have been added in the last 30 days.";
  104.    DisplayColTable($sql,$text,$link,$infotext,$schema_cols);
  105.    if ($oracle8) {
  106.      $sql = "$copyright
  107. SELECT
  108.    VDF.NAME "File name",
  109.    TO_CHAR(VDF.BYTES,'999,999,999,999') "Bytes",
  110.    TO_CHAR(VDF.CREATION_TIME,'Dy, Mon DD YYYY HH24:MI:SS') "Creation date",
  111.    TS.NAME "Tablespace name"
  112. FROM V$DATAFILE VDF,
  113.      SYS.TS$ TS
  114. WHERE VDF.CREATION_TIME > SYSDATE - 30
  115. AND VDF.TS# = TS.TS#
  116.    ORDER BY VDF.CREATION_TIME DESC
  117. ";
  118.       $text = "Datafiles which have been added in the last 30 days.";
  119.       $infotext = "There have been no datafiles added in the last 30 days.";
  120.       $link = "";
  121.       DisplayTable($sql,$text,$link,$infotext);
  122.    }
  123.    $sql = "$copyright
  124. SELECT
  125.    DS.SEGMENT_NAME "Object name",
  126.    DS.SEGMENT_TYPE "Object type",
  127.    DS.OWNER "Owner",
  128.    DO.STATUS "Status",
  129.    DS.TABLESPACE_NAME "Tablespace name",
  130.    TO_CHAR(DO.LAST_DDL_TIME,'Dy, Mon DD YYYY HH24:MI:SS') "Last DDL date",
  131.    TO_CHAR(DO.CREATED,'Dy, Mon DD YYYY HH24:MI:SS') "Creation date"
  132. FROM DBA_SEGMENTS DS, DBA_OBJECTS DO
  133.    WHERE DS.SEGMENT_TYPE NOT LIKE '%PARTITION'
  134.    AND DS.SEGMENT_NAME = DO.OBJECT_NAME
  135.    AND DO.CREATED > SYSDATE-1
  136. ORDER BY CREATED, SEGMENT_TYPE DESC
  137. ";
  138.    $text = "Objects which have been created in the last 24 hours.";
  139.    $infotext = "There have been no objects created in the last 24 hours.";
  140.    ObjectTable($sql,$text,$infotext);
  141.    $sql = "$copyright
  142. SELECT
  143.    DS.SEGMENT_NAME "Object name",
  144.    DS.SEGMENT_TYPE "Object type",
  145.    DS.OWNER "Owner",
  146.    DO.STATUS "Status",
  147.    DS.TABLESPACE_NAME "Tablespace name",
  148.    TO_CHAR(DO.LAST_DDL_TIME,'Dy, Mon DD YYYY HH24:MI:SS') "Last DDL date",
  149.    TO_CHAR(DO.CREATED,'Dy, Mon DD YYYY HH24:MI:SS') "Creation date"
  150. FROM DBA_SEGMENTS DS, DBA_OBJECTS DO
  151.    WHERE DS.SEGMENT_TYPE NOT LIKE '%PARTITION'
  152.    AND DS.SEGMENT_NAME = DO.OBJECT_NAME
  153.    AND DO.LAST_DDL_TIME > SYSDATE-1
  154. ORDER BY LAST_DDL_TIME DESC
  155. ";
  156.    $text = "Objects which have been edited in the last 24 hours.";
  157.    $infotext = "There have been no objects edited in the last 24 hours.";
  158.    ObjectTable($sql,$text,$infotext);
  159.    logit("Exit subroutine recentEvents");
  160. }
  161. sub showPerformance {
  162.    logit("Enter subroutine showPerformance");
  163.    my ($sql,$cursor,$value,$text,$link,$infotext);
  164.    my ($username,$sid,$counter,$rows);
  165. # Check to see if TIMED_STATISTICS is set to true.
  166.    $sql = "$copyright
  167. SELECT VALUE
  168.    FROM V$PARAMETER 
  169. WHERE NAME = 'timed_statistics'
  170. ";
  171.    $cursor=$dbh->prepare($sql);
  172.    $cursor->execute;
  173.    $value = $cursor->fetchrow_array;
  174.    $cursor->finish;
  175.  
  176. # If timed_statistics is enabled, get some info about CPU usage.
  177.  
  178.    if ($value eq "TRUE") {
  179.       $sql = "$copyright
  180. SELECT 
  181.    SS.USERNAME "Username", 
  182.    SE.SID "SID",
  183.    TO_CHAR(VALUE,'999,999,999,999') "Value"
  184. FROM V$SESSION SS,
  185.      V$SESSTAT SE,
  186.      V$STATNAME SN
  187. WHERE SE.STATISTIC# = SN.STATISTIC#
  188.    AND NAME = 'CPU used by this session'
  189.    AND SE.SID = SS.SID
  190.    AND SS.USERNAME IS NOT NULL
  191. ORDER BY VALUE DESC
  192. ";
  193.    $text = "Top ten CPU users (Via TIMED_STATISTICS)";
  194.    $infotext = "No CPU usage via Oracle at this time.";
  195.    $link = "";
  196.    $rows = 10;
  197.    DisplayTable($sql,$text,$link,$infotext,$rows);
  198.    } else {
  199.       message("TIMED_STATISTICS is set to FALSE.");
  200.    }
  201. # Put SGA and memory info in a table together to save space..
  202.    print <<"EOF";
  203. <TABLE BORDER=0 CELLPADDING=20>
  204.   <TR>
  205.     <TD VALIGN=TOP ALIGN=CENTER>
  206.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  207. EOF
  208. # Instance SGA information
  209.    $sql = "$copyright
  210. SELECT
  211.    NAME                                 "Name",
  212.    TO_CHAR(VALUE,'999,999,999,999')     "Value"
  213. FROM V$SGA
  214. ";
  215.    $text = "Instance SGA info";
  216.    $link = "";
  217.    DisplayTable($sql,$text,$link);
  218. print <<"EOF";
  219.     </TD>
  220.     <TD VALIGN=TOP ALIGN=CENTER>
  221.     <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  222. EOF
  223.    $sql = "$copyright
  224. SELECT
  225.    NAME                                 "Name",
  226.    TO_CHAR(BYTES,'999,999,999,999')     "Bytes"
  227. FROM V$SGASTAT
  228.    WHERE NAME IN ('free memory','db_block_buffers','log_buffer','dictionary cache','sql area','library cache')
  229. ";
  230.    $text = "Memory usage";
  231.    $link = "";
  232.    DisplayTable($sql,$text,$link);
  233.    print <<"EOF";
  234.     </TD>
  235.   </TR>
  236. </TABLE>
  237. EOF
  238. # Data dictionary cache miss ratio
  239.    $sql = "$copyright
  240. SELECT
  241.    TO_CHAR(SUM(gets),'999,999,999,999')                         "Gets",
  242.    TO_CHAR(SUM(getmisses),'999,999,999,999')                    "Misses",
  243.    TO_CHAR(SUM(getmisses) / SUM(gets) * 100,'999')||'%'         "Percentage"
  244. FROM V$ROWCACHE
  245. ";
  246.    $text = "Data dictionary cache miss ratio";
  247.    $link = "";
  248.    DisplayTable($sql,$text,$link);
  249. # Sort area information. Thanks to Tommy Wareing.
  250.    $sql = "$copyright
  251. SELECT
  252.    S.SID "SID",
  253.    S.SERIAL# "Serial#",
  254.    S.USERNAME "Ora user",
  255.    S.OSUSER "OS user",
  256.    U.TABLESPACE "Tablespace",
  257.    SUM(U.EXTENTS) "Extents",
  258.    SUM(U.BLOCKS) "Blocks",
  259.    SA.SQL_TEXT "SQL Text"
  260. FROM V$SESSION S,
  261.      V$SORT_USAGE U,
  262.      V$SQLAREA SA
  263. WHERE S.SADDR=U.SESSION_ADDR
  264. AND U.CONTENTS='TEMPORARY'
  265. AND S.SQL_ADDRESS=SA.ADDRESS(+)
  266. GROUP BY S.SID, S.SERIAL#, S.USERNAME, S.OSUSER, U.TABLESPACE, 
  267. SA.SQL_TEXT
  268. ";
  269.    $text = "Sort Area Usage";
  270.    $link = "";
  271.    $infotext = "No sorts currently using disk.";
  272.    DisplayTable($sql,$text,$link,$infotext);
  273. # Percentage of sorts that are taking place in memory,
  274. # as opposed to in temporary segments on disk.
  275. $sql = "$copyright
  276. SELECT 
  277.    ROUND((SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0))
  278.         / (SUM(DECODE(NAME, 'sorts (memory)', VALUE, 0))
  279.         + SUM(DECODE(NAME, 'sorts (disk)', VALUE, 0))))
  280.         * 100,2) "Percentage"
  281. FROM V$SYSSTAT
  282. ";
  283.    $text = "Percentage of sorts that are taking place in memory";
  284.    $link = "";
  285.    DisplayTable($sql,$text,$link);
  286. # Information from v$librarycache
  287.    $sql = "$copyright
  288. SELECT
  289.    NAMESPACE                                            "Namespace",
  290.    TO_CHAR(GETS,'999,999,999,999')                      "Gets",
  291.    TO_CHAR(GETHITS,'999,999,999,999')                   "Gethits",
  292.    TO_CHAR(GETHITRATIO,'99.99')                         "GetHitRatio",
  293.    TO_CHAR(PINS,'999,999,999,999')                      "Pins",
  294.    TO_CHAR(PINHITS,'999,999,999,999')                   "PinHits",
  295.    TO_CHAR(PINHITRATIO,'99.99')                         "PinHitRatio",
  296.    TO_CHAR(RELOADS,'999,999,999,999')                   "Reloads",
  297.    TO_CHAR(INVALIDATIONS,'999,999,999,999')             "Invalidations"
  298. FROM V$LIBRARYCACHE
  299. ";
  300.    $sql = "$copyright
  301. SELECT
  302.    NAMESPACE                                            "Namespace",
  303.    TO_CHAR(GETS,'999,999,999,999')                      "Gets",
  304.    TO_CHAR(GETHITS,'999,999,999,999')                   "Get hits",
  305.    TO_CHAR(GETHITRATIO,'99.99')                         "Get hit ratio",
  306.    TO_CHAR(PINS,'999,999,999,999')                      "Pins",
  307.    TO_CHAR(PINHITS,'999,999,999,999')                   "Pin hits",
  308.    TO_CHAR(PINHITRATIO,'99.99')                         "Pin hit ratio",
  309.    TO_CHAR(RELOADS,'999,999,999,999')                   "Reloads",
  310.    TO_CHAR(INVALIDATIONS,'999,999,999,999')             "Invalidations",
  311.    TO_CHAR(DLM_LOCK_REQUESTS,'999,999,999,999')         "DLM lock requests",
  312.    TO_CHAR(DLM_PIN_REQUESTS,'999,999,999,999')          "DLM pin requests",
  313.    TO_CHAR(DLM_PIN_RELEASES,'999,999,999,999')          "DLM pin releases",
  314.    TO_CHAR(DLM_INVALIDATION_REQUESTS,'999,999,999,999') "DLM invalidation requests",
  315.    TO_CHAR(DLM_INVALIDATIONS,'999,999,999,999')         "DLM invalidations"
  316. FROM V$LIBRARYCACHE
  317. " if ($oracle8 && parallel());
  318.    $text = "Library cache information";
  319.    $link = "";
  320.    DisplayTable($sql,$text,$link);
  321. # Resource limit info for Oracle8 databases.
  322.    if ( $oracle8 ) {
  323.       $sql = "$copyright
  324. SELECT
  325.    RESOURCE_NAME                "Resource name",
  326.    INITIAL_ALLOCATION           "Initial value",
  327.    CURRENT_UTILIZATION          "Current utilization",
  328.    MAX_UTILIZATION              "Max utilization",
  329.    LIMIT_VALUE                  "Upper limit"
  330. FROM V$RESOURCE_LIMIT
  331. ";
  332.       $text = "Resource limits";
  333.       $link = "";
  334.       DisplayTable($sql,$text,$link);
  335.    }
  336. # Parallel query slave stats
  337.    $sql = "$copyright
  338. SELECT 
  339.    SLAVE_NAME "Slave name",
  340.    STATUS "Status",
  341.    TO_CHAR(SESSIONS,'999,999,999,999') "Sessions",
  342.    TO_CHAR(IDLE_TIME_CUR,'999,999,999,999') "Idle time (cur)",
  343.    TO_CHAR(IDLE_TIME_TOTAL,'999,999,999,999') "Idle time (tot)",
  344.    TO_CHAR(BUSY_TIME_CUR,'999,999,999,999') "Busy time (cur)",
  345.    TO_CHAR(BUSY_TIME_TOTAL,'999,999,999,999') "Busy time (tot)",
  346.    TO_CHAR(CPU_SECS_CUR ,'999,999,999,999') "CPU seconds (cur)",
  347.    TO_CHAR(CPU_SECS_TOTAL,'999,999,999,999') "CPU seconds (tot)",
  348.    TO_CHAR(MSGS_SENT_CUR,'999,999,999,999') "Msgs sent (cur)",
  349.    TO_CHAR(MSGS_SENT_TOTAL,'999,999,999,999') "Msgs sent (tot)",
  350.    TO_CHAR(MSGS_RCVD_CUR,'999,999,999,999') "Msgs rcvd (cur)",
  351.    TO_CHAR(MSGS_RCVD_TOTAL,'999,999,999,999') "Msgs rcvd (tot)"
  352. FROM V$PQ_SLAVE
  353. ";
  354.       $text = "Parallel query slave statistics";
  355.       $infotext = "No parallel query slaves are active";
  356.       $link = "";
  357.       DisplayTable($sql,$text,$link,$infotext);
  358. # Parallel query server stats
  359.    $sql = "$copyright
  360. SELECT
  361.    STATISTIC "Statistic",
  362.    TO_CHAR(VALUE,'999,999,999,999') "Value" 
  363. FROM V$PQ_SYSSTAT
  364. ";
  365.       $text = "Parallel query server status";
  366.       $link = "";
  367.       DisplayTable($sql,$text,$link);
  368.    logit("Exit subroutine showPerformance");
  369. }
  370. sub showParameters {
  371.    logit("Enter subroutine showParameters");
  372.    my ($sql,$text,$link);
  373. # Instance parameters
  374.    $sql = "$copyright
  375. SELECT 
  376.    NAME "Name",
  377.    DESCRIPTION "Description",
  378.    VALUE "Value",
  379.    ISDEFAULT "Default",
  380.    ISSES_MODIFIABLE "Session mod",
  381.    ISSYS_MODIFIABLE "System mod",
  382.    ISADJUSTED "Changed"
  383. FROM V$PARAMETER
  384.    ORDER BY NAME
  385. ";
  386.    $text = "Instance parameter information";
  387.    $link = "";
  388.    DisplayTable($sql,$text,$link);
  389.    logit("Exit subroutine showParameters");
  390. }
  391. sub showRows {
  392.    logit("Enter subroutine showRows");
  393.    my $numrows = shift;
  394.    my ($sql,$text,$link,$infotext,$error,$rowtext);
  395. # Check to see if they want all rows..
  396. # If so, set numrows to 1000000.
  397. # Anyone wanting to see that many rows
  398. # in a web browser is on drugs.
  399.    if ($numrows eq "all") {
  400.       $numrows = "1000000";
  401.       $rowtext = "All";
  402.    } else {
  403.       $rowtext = $numrows;
  404.    }
  405. # If they entered a "where" clause, use it.
  406. if ($whereclause) {
  407. # Get rid of trailing semicolon, if present.
  408.    $whereclause =~ s/;$//;
  409.    $whereclause = " AND $whereclause";
  410. }
  411. # Show the first $numrows rows of a table
  412.    $sql = "$copyright
  413. SELECT * FROM $schema.$object_name 
  414. WHERE ROWNUM <= $numrows
  415. $whereclause
  416. ";
  417.    $text = "$rowtext rows of $object_name";
  418.    $link = "";
  419.    $infotext = "There are no rows to display.";
  420.    $error = DisplayTable($sql,$text,$link,$infotext);
  421.    if (!($error =~ /^d+$/)) {
  422.       message("Error in your "where" clause.<BR>Check the SQL and try again.<BR><BR>$error");
  423.    }
  424.    logit("Exit subroutine showRows");
  425. }
  426. sub showRollback {
  427.    logit("Enter subroutine showRollback");
  428.    refreshButton();
  429.    my ($sql,$text,$link,$infotext);
  430. # Rollback segment information
  431.    $sql = "$copyright
  432. SELECT 
  433.    A.NAME "Rollback name",
  434.    TO_CHAR(C.INITIAL_EXTENT,'999,999,999,999') "Initial extent",
  435.    TO_CHAR(C.NEXT_EXTENT,'999,999,999,999') "Next extent",
  436.    TO_CHAR(C.MIN_EXTENTS,'999,999,999,999') "Min extents",
  437.    B.EXTENTS "Extents",
  438.    TO_CHAR(C.MAX_EXTENTS,'999,999,999,999') "Max extents",
  439.    TO_CHAR(D.BYTES,'999,999,999,999') "Size",
  440.    NVL(TO_CHAR(B.OPTSIZE,'999,999,999,999'),'Not set') "Optimal",
  441.    TO_CHAR(B.EXTENDS,'999,999,999') "Extends",
  442.    TO_CHAR(B.SHRINKS,'999,999,999') "Shrinks",
  443.    TO_CHAR(B.WRAPS,'999,999,999') "Wraps",
  444.    B.STATUS "Status"
  445. FROM V$ROLLNAME A, V$ROLLSTAT B, DBA_ROLLBACK_SEGS C, DBA_SEGMENTS D
  446.    WHERE A.NAME = '$object_name'
  447.    AND C.SEGMENT_NAME = '$object_name'
  448.    AND A.USN = B.USN
  449.    AND D.SEGMENT_NAME = '$object_name'
  450.    AND D.SEGMENT_TYPE = 'ROLLBACK'
  451. ";
  452.    $text = "Rollback segment info";
  453.    $link = "$scriptname?database=$database&object_type=RBSDDL&arg=$object_name";
  454.    DisplayTable($sql,$text,$link);
  455. # Active transactions occupying this rollback
  456.    $sql = "$copyright
  457. SELECT 
  458.    OSUSER "OS user",
  459.    USERNAME "Ora user",
  460.    SID                                  "SID",
  461.    SERIAL#                              "Serial#",
  462.    SEGMENT_NAME "RBS",
  463.    SA.SQL_TEXT "SQL Text"
  464. FROM   V$SESSION S,
  465.        V$TRANSACTION T,
  466.        DBA_ROLLBACK_SEGS R,
  467.        V$SQLAREA SA
  468. WHERE  R.SEGMENT_NAME = '$object_name'
  469. AND    S.TADDR = T.ADDR
  470. AND    T.XIDUSN = R.SEGMENT_ID(+)
  471. AND    S.SQL_ADDRESS = SA.ADDRESS(+)
  472. ";
  473.    $text = "Transaction info";
  474.    $link = "";
  475.    $infotext = "No current transactions on this segment";
  476.    DisplayTable($sql,$text,$link,$infotext);
  477. # Tablespace information for the tablespace this rollback belongs to.
  478. # Good for monitoring the growth of a rollback with a long running
  479. # transaction.
  480.    $sql = "$copyright
  481. SELECT TABLESPACE_NAME 
  482.    FROM DBA_SEGMENTS
  483. WHERE SEGMENT_NAME = '$object_name'
  484. AND SEGMENT_TYPE = 'ROLLBACK'
  485. ";
  486.    my $cursor=$dbh->prepare($sql);
  487.    $cursor->execute;
  488.    $object_name = $cursor->fetchrow_array;
  489.    $cursor->finish;
  490.    $sql = "$copyright
  491. SELECT * FROM
  492.    (SELECT TO_CHAR(SUM(BYTES),'999,999,999,999')        "Bytes allocated"
  493. FROM DBA_DATA_FILES WHERE TABLESPACE_NAME = '$object_name'),
  494.    (SELECT TO_CHAR(SUM(BYTES),'999,999,999,999')        "Bytes used"
  495. FROM DBA_EXTENTS WHERE TABLESPACE_NAME = '$object_name'),
  496.    (SELECT TO_CHAR(SUM(BYTES),'999,999,999,999')        "Bytes free"
  497. FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME = '$object_name'),
  498.    (SELECT TO_CHAR(MAX(BYTES),'999,999,999,999')        "Largest free extent"
  499. FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME = '$object_name')
  500. ";
  501.    $text = "$object_name tablespace allocation";
  502.    $link = "";
  503.    DisplayTable($sql,$text,$link);
  504.    logit("Exit subroutine showRollback");
  505. }
  506. sub showTransactions {
  507.    logit("Enter subroutine showTransactions");
  508.    my ($sql,$text,$link,$infotext);
  509. # Display a refresh button
  510.    refreshButton();
  511. # Check for transactions which are rolling back.
  512.    $sql = "$copyright
  513. SELECT
  514.    S.USERNAME "Username",
  515.    S.SID "SID",
  516.    S.SERIAL# "Serial#",
  517.    TO_CHAR(T.USED_UBLK,'999,999,999,999,999') "Used undo blocks",
  518.    DRS.SEGMENT_NAME "RBS name"
  519. FROM V$SESSION S,
  520.      V$TRANSACTION T,
  521.      DBA_ROLLBACK_SEGS DRS
  522.    WHERE T.ADDR IN
  523. (SELECT
  524.    ADDR
  525. FROM V$TRANSACTION 
  526.    WHERE FLAG = 7811)
  527.    AND S.TADDR IN
  528. (SELECT
  529.    ADDR
  530. FROM V$TRANSACTION
  531.    WHERE FLAG = 7811)
  532.    AND T.ADDR = S.TADDR
  533.    AND T.XIDUSN = DRS.SEGMENT_ID
  534. ";
  535.    $text = "The following sessions appear to be in a rollback status.";
  536.    $infotext = "No transactions are in a rollback status.";
  537.    $link = "$scriptname?database=$database&object_type=SESSIONS";
  538.    DisplayTable($sql,$text,$link,$infotext);
  539. # Active transactions occupying all rollbacks
  540.    $sql = "$copyright
  541. SELECT
  542.    SEGMENT_NAME                         "RBS",
  543.    OSUSER                               "OS user",
  544.    USERNAME                             "Ora user",
  545.    SID "SID",
  546.    SERIAL# "Serial#",
  547.    SA.SQL_TEXT                          "SQL Text"
  548. FROM   V$SESSION S,
  549.        V$TRANSACTION T,
  550.        DBA_ROLLBACK_SEGS R,
  551.        V$SQLAREA SA
  552. WHERE    S.TADDR = T.ADDR
  553. AND    T.XIDUSN = R.SEGMENT_ID(+)
  554. AND    S.SQL_ADDRESS = SA.ADDRESS(+)
  555. ";
  556.    $text = "Transaction info";
  557.    $link = "$scriptname?database=$database&object_type=ROLLBACK";
  558.    $infotext = "No transactions active on any segments.";
  559.    DisplayTable($sql,$text,$link,$infotext);
  560.    logit("Exit subroutine showTransactions");
  561. }
  562. sub showRollbacks {
  563.    logit("Enter subroutine showRollbacks");
  564.    my ($sql,$cursor,$foo,$text,$link,$infotext);
  565. # Display a refresh button
  566.    refreshButton();
  567. # Rollback segment information
  568.    $sql = "$copyright
  569. SELECT
  570.    A.SEGMENT_NAME "Name",
  571.    A.OWNER "Owner",
  572.    A.TABLESPACE_NAME "Tablespace",
  573.    TO_CHAR(A.BYTES,'999,999,999,999') "Bytes",
  574.    TO_CHAR(A.INITIAL_EXTENT,'999,999,999,999') "Initial Extent",
  575.    TO_CHAR(A.NEXT_EXTENT,'999,999,999,999') "Next extent",
  576.    TO_CHAR(A.EXTENTS,'999,999,999,999') "Extents",
  577.    TO_CHAR(A.MAX_EXTENTS,'999,999,999,999') "Max Extents",
  578.    NVL(TO_CHAR(C.OPTSIZE,'999,999,999,999'),'Not set') "Optimal",
  579.    B.STATUS "Status",
  580.    TO_CHAR(C.WRITES,'999,999,999,999,999') "Writes",
  581.    C.WAITS "Waits",
  582.    C.XACTS "Active Xacts"
  583. FROM DBA_SEGMENTS A, DBA_ROLLBACK_SEGS B, V$ROLLSTAT C
  584.    WHERE A.SEGMENT_TYPE = 'ROLLBACK'
  585.    AND A.SEGMENT_NAME = B.SEGMENT_NAME
  586.    AND B.SEGMENT_ID = C.USN
  587.    AND ( B.INSTANCE_NUM = 
  588.       ( SELECT VALUE FROM V$PARAMETER
  589.            WHERE NAME = 'instance_number' )
  590.          OR B.INSTANCE_NUM IS NULL )
  591. ORDER BY A.SEGMENT_NAME, A.TABLESPACE_NAME
  592. ";
  593.    $text = "Online rollback segments";
  594.    $link = "$scriptname?database=$database&object_type=ROLLBACK";
  595.    DisplayTable($sql,$text,$link);
  596.    $sql = "$copyright
  597. SELECT
  598.    SEGMENT_NAME "Name",
  599.    STATUS "Status",
  600.    OWNER "Owner",
  601.    TABLESPACE_NAME "Tablespace"
  602. FROM DBA_ROLLBACK_SEGS
  603.    WHERE STATUS != 'ONLINE'
  604. ";
  605.    $text = "Warning: You have rollback(s) which are not online";
  606.    $link = "$scriptname?database=$database&object_type=ROLLBACK";
  607.    DisplayTable($sql,$text,$link);
  608. # Show gets and waits percentages for performance 
  609.    $sql = "$copyright
  610. SELECT 
  611.    SUM(VALUE)
  612. FROM V$SYSSTAT
  613.    WHERE NAME IN
  614. ('db block gets','consistent gets')
  615. ";
  616.    $cursor=$dbh->prepare($sql);
  617.    $cursor->execute;
  618.    $foo = $cursor->fetchrow_array;
  619.    $cursor->finish;
  620.    $sql = "$copyright
  621. SELECT 
  622.    TO_CHAR(SUM(VALUE),'999,999,999,999') "Total gets"
  623. FROM V$SYSSTAT
  624.    WHERE NAME IN
  625. ('db block gets','consistent gets')
  626. ";
  627.    $text = "Total gets";
  628.    $link = "";
  629.    DisplayTable($sql,$text,$link);
  630.    
  631.    $sql = "$copyright
  632. SELECT 
  633.    CLASS "Class",
  634.    TO_CHAR(COUNT,'999,999,999,999') "Count", 
  635.    TO_CHAR(COUNT/$foo,'99.99') "Wait %"
  636.    FROM V$WAITSTAT
  637. WHERE CLASS IN
  638. ('system undo header','system undo block','undo header','undo block')
  639. ";
  640.    $text = "Wait statistics.<BR>If any wait% is greater than 1, you may need to add rollbacks.";
  641.    $link = "";
  642.    DisplayTable($sql,$text,$link);
  643.    $sql = "$copyright
  644. SELECT
  645.    DF.TABLESPACE_NAME "Tablespace name",
  646.    TO_CHAR(DF.BYTES,'999,999,999,999') "Bytes allocated",
  647.    NVL(TO_CHAR(DF.BYTES-SUM(FS.BYTES),'999,999,999,999'),
  648.         TO_CHAR(DF.BYTES,'999,999,999,999')) "Bytes used",
  649.    NVL(TO_CHAR(SUM(FS.BYTES),'999,999,999,999'),0) "Bytes free",
  650.    NVL(ROUND((DF.BYTES-SUM(FS.BYTES))*100/DF.BYTES),100)||'%' "Percent used",
  651.    NVL(ROUND(SUM(FS.BYTES)*100/DF.BYTES),0)||'%' "Percent free"
  652. FROM DBA_FREE_SPACE FS,
  653.    (SELECT TABLESPACE_NAME, SUM(BYTES) BYTES FROM DBA_DATA_FILES GROUP BY
  654. TABLESPACE_NAME ) DF
  655. WHERE FS.TABLESPACE_NAME (+) = DF.TABLESPACE_NAME
  656. AND DF.TABLESPACE_NAME IN (
  657.    SELECT DISTINCT TABLESPACE_NAME
  658.       FROM DBA_ROLLBACK_SEGS )
  659. GROUP BY DF.TABLESPACE_NAME, DF.BYTES
  660. ORDER BY "Percent free"
  661. ";
  662.    $text = "Tablespaces containing rollback segments.";
  663.    $link = "";
  664.    DisplayTable($sql,$text,$link);
  665.    logit("Exit subroutine showRollbacks");
  666. }
  667. sub showContention {
  668.    logit("Enter subroutine showContention");
  669.    my ($sql,$text,$link,$infotext);
  670. # Locking contention information
  671.    $sql = "$copyright
  672. SELECT DISTINCT 
  673.    O.OBJECT_NAME "Object_name",
  674.    SH.USERNAME "Holding username",
  675.    SH.SID "Holder SID",
  676.    SW.USERNAME "Waiting username",
  677.    SW.SID "Waiter SID",
  678.    DECODE(LH.LMODE,
  679. 1, 'null', 
  680. 2, 'row share', 
  681. 3, 'row exclusive', 
  682. 4, 'share', 
  683. 5, 'share row exclusive', 
  684. 6, 'exclusive') "Mode held"
  685.   FROM DBA_OBJECTS O,
  686.        V$SESSION SW, 
  687.        V$LOCK LW, 
  688.        V$SESSION SH, 
  689.        V$LOCK LH
  690. WHERE LH.ID1  = O.OBJECT_ID
  691. AND  LH.ID1  = LW.ID1
  692. AND  SH.SID  = LH.SID
  693. AND  SW.SID  = LW.SID
  694. AND  SH.LOCKWAIT IS NULL
  695. AND  SW.LOCKWAIT IS NOT NULL
  696. AND  LH.TYPE = 'TM'
  697. AND  LW.TYPE = 'TM'
  698. ";
  699.    $text = "Object lock contention info";
  700.    $link = "";
  701.    $infotext = "No object lock contention found.";
  702.    DisplayTable($sql,$text,$link,$infotext);
  703. # Locked objects (Not neccessarily contending).
  704.    $sql = "$copyright
  705. SELECT 
  706.    A.OBJECT_NAME "Object_name",
  707.    A.OWNER "Owner",
  708.    B.OBJECT_ID "Object ID",
  709.    B.SESSION_ID "SID",
  710.    B.ORACLE_USERNAME "Oracle user",
  711.    B.PROCESS "OS process ID",
  712.    DECODE(B.LOCKED_MODE,
  713. 0,'None',
  714. 1,'Null',
  715. 2,'Row-S (SS)',
  716. 3,'Row-X (SX)',
  717. 4,'Share',
  718. 5,'S/Row-X (SSX)',
  719. 6,'Exclusive') "Locked mode"
  720. FROM DBA_OBJECTS A, V$LOCKED_OBJECT B
  721.    WHERE A.OBJECT_ID = B.OBJECT_ID
  722. ORDER BY A.OBJECT_NAME, A.OWNER
  723. ";
  724.    $text = "Object lock info";
  725.    $link = "";
  726.    $infotext = "No object locks found.";
  727.    DisplayTable($sql,$text,$link,$infotext);
  728. # Session wait information
  729. $sql = "$copyright
  730. SELECT 
  731.    SES.USERNAME "Username",
  732.    SW.SID "SID",
  733.    SW.EVENT "Event"
  734. FROM V$SESSION SES,
  735.      V$SESSION_WAIT SW
  736. WHERE SES.SID = SW.SID
  737. AND SES.USERNAME IS NOT NULL
  738. ";
  739.    $text = "Session wait info";
  740.    $link = "";
  741.    $infotext = "No waits found.";
  742.    DisplayTable($sql,$text,$link,$infotext);
  743.    logit("Exit subroutine showContention");
  744. }
  745. sub showRefreshgroups {
  746.    logit("Enter subroutine showRefreshgroups");
  747.    my ($sql,$cursor,$text,$link,$infotext);
  748. #   $sql = "$copyright
  749. #SELECT
  750. #   OWNER "Refresh owner",
  751. #   NAME "Refresh Name",
  752. #   TABLE_NAME "Table name",
  753. #   MASTER_VIEW "Master view",
  754. #   MASTER_OWNER "Master owner",
  755. #   MASTER "Master table",
  756. #   MASTER_LINK "DB link",
  757. #   CAN_USE_LOG "Log?",
  758. #   UPDATABLE "Updatable?",
  759. #   TO_CHAR(LAST_REFRESH,'Month DD, YYYY - HH24:MI') "Last refresh"
  760. #FROM DBA_SNAPSHOTS
  761. #";
  762. #   $text = "Parent snapshots";
  763. #   $link = "$scriptname?database=$database&object_type=SNAPINFO";
  764. #   $infotext = "";
  765. #   DisplayTable($sql,$text,$link,$infotext);
  766.    $sql = "$copyright
  767. SELECT 
  768.    REFGROUP "Group ID",
  769.    ROWNER "Group owner",
  770.    RNAME "Group name",
  771.    ROLLBACK_SEG "Rollback",
  772.    PUSH_DEFERRED_RPC "Push changes?",
  773.    JOB "Job ID",
  774.    TO_CHAR(NEXT_DATE,'Month DD, YYYY - HH24:MI') "Next date",
  775.    BROKEN "Broken?",
  776.    PURGE_OPTION "Purge option",
  777.    PARALLELISM "Parallelism"
  778. FROM DBA_REFRESH
  779. ";
  780.    $text = "Refresh groups";
  781.    $link = "$scriptname?database=$database&object_type=REFRESHINFO";
  782.    $infotext = "No refresh groups";
  783.    DisplayTable($sql,$text,$link,$infotext);
  784.    logit("Exit subroutine showRefreshgroups");
  785. }
  786. sub showRefreshinfo {
  787.    logit("Enter subroutine showRefreshinfo");
  788.    my ($sql,$cursor,$text,$link,$infotext);
  789.    $sql = "$copyright
  790. SELECT
  791.    OWNER "Owner",
  792.    NAME "Name",
  793.    TYPE "Type",
  794.    ROLLBACK_SEG "Rollback",
  795.    PUSH_DEFERRED_RPC "Push changes?",
  796.    JOB "Job ID",
  797.    TO_CHAR(NEXT_DATE,'Month DD, YYYY - HH24:MI') "Next date",
  798.    BROKEN "Broken?",
  799.    PURGE_OPTION "Purge option",
  800.    PARALLELISM "Parallelism"
  801. FROM DBA_REFRESH_CHILDREN
  802.    WHERE REFGROUP = $object_name
  803. ";
  804.    $text = "Refresh group children";
  805.    $link = "";
  806.    $infotext = "No refresh group children";
  807.    DisplayTable($sql,$text,$link,$infotext);
  808.    logit("Exit subroutine showRefreshinfo");
  809. }
  810. sub showAdvRepGroup {
  811.    logit("Enter subroutine showAdvRepGroup");
  812.    my ($sql,$cursor,$text,$link,$infotext); 
  813.    $sql = "$copyright
  814. SELECT 
  815.    DBLINK "DB link",
  816.    MASTERDEF "Masterdef",
  817.    SNAPMASTER "Snap link",
  818.    MASTER_COMMENT "Comment",
  819.    DECODE(MASTER,
  820.                  'Y','YES',
  821.                  'N','NO')      "Master?"
  822. FROM DBA_REPSITES
  823.    WHERE GNAME = '$object_name'
  824. ORDER BY MASTERDEF DESC
  825.    ";
  826.    $text = "Information for replicated group $object_name.";
  827.    $link = "";
  828.    $infotext = "";
  829.    DisplayTable($sql,$text,$link,$infotext);
  830.    $sql = "$copyright
  831. SELECT 
  832.    SNAME "Owner",
  833.    ONAME "Object name",
  834.    TYPE "Object type",
  835.    STATUS "Status",
  836.    GENERATION_STATUS "Generation status",
  837.    ID "ID",
  838.    OBJECT_COMMENT "Comment"
  839. FROM DBA_REPOBJECT
  840.    WHERE GNAME = '$object_name'
  841. ORDER BY TYPE DESC
  842. ";
  843.    $text = "";
  844.    $link = "";
  845.    $infotext = "";
  846.    DisplayTable($sql,$text,$link,$infotext);
  847.    logit("Exit subroutine showAdvRepGroup");
  848. }
  849. sub showAdvRepGroups {
  850.    logit("Enter subroutine showAdvRepGroups");
  851.    my ($sql,$cursor,$text,$link,$infotext);
  852.    $sql = "$copyright
  853. SELECT 
  854.    GNAME  "Group name",
  855.    DECODE(MASTER,
  856.                  'Y','YES',
  857.                  'N','NO') "Master?",
  858.    STATUS "Status",
  859.    SCHEMA_COMMENT "Comment"
  860. FROM DBA_REPGROUP
  861.    ORDER BY MASTER
  862. ";
  863.    $text = "Advanced replication group(s)";
  864.    $link = "$scriptname?database=$database&object_type=ADVREPGROUP";
  865.    $infotext = "";
  866.    DisplayTable($sql,$text,$link,$infotext);
  867.    $sql = "$copyright
  868. SELECT 
  869.    TO_CHAR(ID,'999,999,999,999') "ID",
  870.    SOURCE "Source",
  871.    USERID "User ID",
  872.    TO_CHAR(TIMESTAMP,'Month DD, YYYY - HH24:MI') "Timestamp",
  873.    ROLE "Role",
  874.    MASTER "Master",
  875.    SNAME "Remote schema",
  876.    REQUEST "Request",
  877.    ONAME "Object_name",
  878.    TYPE "Object type",
  879.    STATUS "Status",
  880.    MESSAGE "Message",
  881.    ERRNUM "Ora error",
  882.    GNAME "Group name"
  883. FROM DBA_REPCATLOG
  884. ";
  885.    $text = "Repcatlog entries";
  886.    $link = "";
  887.    $infotext = "No entries in the Repcatlog table.";
  888.    DisplayTable($sql,$text,$link,$infotext);
  889.    logit("Exit subroutine showAdvRepGroups");
  890. }
  891. sub showRepmaster {
  892.    logit("Enter subroutine showRepmaster");
  893.    my ($sql,$cursor,$text,$link,$infotext);
  894.    $sql = "$copyright
  895. SELECT
  896.    SNAPSHOT_ID "Snap ID",
  897.    NAME "Name",
  898.    OWNER "Owner",
  899.    SNAPSHOT_SITE "Snap site",
  900.    CAN_USE_LOG "Use log?",
  901.    UPDATABLE "Updatable?",
  902.    REFRESH_METHOD "Refresh method",
  903.    VERSION "Version"
  904. FROM DBA_REGISTERED_SNAPSHOTS
  905. ";
  906.    $text = "Registered snapshots";
  907.    $link = "$scriptname?database=$database&object_type=SNAPINFO";
  908.    $infotext = "";
  909.    DisplayTable($sql,$text,$link,$infotext);
  910.    logit("Exit subroutine showRepmaster");
  911. }   
  912. sub showSnapinfo {
  913.    logit("Enter subroutine showSnapinfo");
  914.    my ($sql,$cursor,$text,$link,$infotext);
  915.    $sql = "$copyright
  916. SELECT
  917.    NAME "Name",
  918.    OWNER "Owner",
  919.    SNAPSHOT_SITE "Snap site"
  920. FROM DBA_REGISTERED_SNAPSHOTS
  921.    WHERE SNAPSHOT_ID = $object_name
  922. ";
  923.    $text = "Detailed snapshot info";
  924.    $link = "";
  925.    $infotext = "";
  926.    DisplayTable($sql,$text,$link,$infotext);
  927.    $sql = "$copyright
  928. SELECT 
  929.    QUERY_TXT "Query text"
  930. FROM DBA_REGISTERED_SNAPSHOTS
  931.    WHERE SNAPSHOT_ID = $object_name
  932. ";
  933.    $text = "";
  934.    DisplayPiecedData($sql,$text);
  935.    $sql = "$copyright
  936. SELECT 
  937.    LOG_TABLE "Log table",
  938.    MASTER "Master",
  939.    LOG_OWNER "Log owner",
  940.    ROWIDS "Rowids?",
  941.    PRIMARY_KEY "Primary key?",
  942.    FILTER_COLUMNS "Filter columns?",
  943.    TO_CHAR(CURRENT_SNAPSHOTS,'Month DD, YYYY - HH24:MI') "Current snapshot"
  944. FROM DBA_SNAPSHOT_LOGS
  945.    WHERE SNAPSHOT_ID = $object_name
  946. ";
  947.    
  948.    $text = "Snapshot log table";
  949.    $link = "";
  950.    $infotext = "No snapshot log table for this snapshot.";
  951.    DisplayTable($sql,$text,$link,$infotext);
  952.    logit("Exit subroutine showSnapinfo");
  953. }
  954. sub showControlfiles {
  955.    logit("Enter subroutine showControlfiles");
  956.    my ($sql,$cursor,$text,$link,$infotext);
  957.    my ($alloc,$used,$alloc_total,$used_total);
  958.    $sql = "$copyright
  959. SELECT
  960.    NAME "Name",
  961.    DECODE (STATUS,'','OK') "Status"
  962. FROM V$CONTROLFILE
  963. ";
  964.    $text = "Controlfile info";
  965.    $link = "";
  966.    $infotext = "There is something terribly wrong...";
  967.    DisplayTable($sql,$text,$link,$infotext);
  968.    if ($oracle8) {
  969.       $sql = "$copyright
  970. SELECT 
  971.    RECORDS_TOTAL*RECORD_SIZE,
  972.    RECORDS_USED*RECORD_SIZE
  973. FROM V$CONTROLFILE_RECORD_SECTION
  974. ";
  975.    $cursor=$dbh->prepare($sql);
  976.    $cursor->execute;
  977.    while (($alloc,$used) = $cursor->fetchrow_array) {
  978.       $alloc_total += $alloc;
  979.       $used_total  += $used;
  980.    }
  981.    $cursor->finish;
  982.    $sql = "$copyright
  983. SELECT 
  984.    TO_CHAR($alloc_total,'999,999,999,999') "Total allocated",
  985.    TO_CHAR($used_total,'999,999,999,999') "Total used"
  986. FROM DUAL
  987. ";
  988.    $text = "Controlfile record space usage";
  989.    $link = "";
  990.    $infotext = "There is something terribly wrong...";
  991.    DisplayTable($sql,$text,$link,$infotext);
  992.       $sql = "$copyright
  993. SELECT
  994.    DECODE(TYPE,
  995.       'DATABASE','Database',
  996.       'CKPT PROGRESS','Checkpoint progress',
  997.       'REDO THREAD','Redo thread',
  998.       'REDO LOG','Redo log',
  999.       'DATAFILE','Datafile',
  1000.       'FILENAME','Filename',
  1001.       'TABLESPACE','Tablespace',
  1002.       'LOG HISTORY','Log history',
  1003.       'OFFLINE RANGE','Offline range',
  1004.       'ARCHIVED LOG','Archived log',
  1005.       'BACKUP SET','Backup set',
  1006.       'BACKUP PIECE','Backup piece',
  1007.       'BACKUP DATAFILE','Backup datafile',
  1008.       'BACKUP REDOLOG','Backup redolog',
  1009.       'DATAFILE COPY','Datafile copy',
  1010.       'BACKUP CORRUPTION','Backup corruption',
  1011.       'COPY CORRUPTION','Copy corruption',
  1012.       'DELETED OBJECT','Deleted object','Reserved') "Record type",
  1013.    TO_CHAR(RECORD_SIZE,'999,999,999,999') "Record size",
  1014.    TO_CHAR(RECORDS_TOTAL,'999,999,999,999') "Records total",
  1015.    TO_CHAR(RECORDS_USED,'999,999,999,999') "Records used",
  1016.    TO_CHAR(RECORDS_TOTAL*RECORD_SIZE,'999,999,999,999') "Space allocated",
  1017.    TO_CHAR(RECORDS_USED*RECORD_SIZE,'999,999,999,999') "Space used"
  1018. FROM V$CONTROLFILE_RECORD_SECTION
  1019. ";
  1020.    $text = "Controlfile record info";
  1021.    $link = "";
  1022.    $infotext = "There is something terribly wrong...";
  1023.    DisplayTable($sql,$text,$link,$infotext);
  1024.    }
  1025.    logit("Exit subroutine showControlfiles");
  1026. }
  1027. sub showArchiving {
  1028.    logit("Enter subroutine showArchiving");
  1029.    my ($sql,$cursor,$value,$log_archive_dest,$text,$link,$infotext);
  1030.    $sql = "$copyright
  1031. SELECT 
  1032.    VALUE FROM V$PARAMETER
  1033. WHERE NAME = 'log_archive_dest'
  1034. ";
  1035.    $cursor=$dbh->prepare($sql);
  1036.    $cursor->execute;
  1037.    $value = $cursor->fetchrow_array;
  1038.    $log_archive_dest .= $value;
  1039.    $sql = "$copyright
  1040. SELECT 
  1041.    VALUE FROM V$PARAMETER
  1042. WHERE NAME = 'log_archive_format'
  1043. ";
  1044.    $cursor=$dbh->prepare($sql);
  1045.    $cursor->execute;
  1046.    $value = $cursor->fetchrow_array;
  1047.    $log_archive_dest .= $value;
  1048.    $sql = "$copyright
  1049. SELECT '$log_archive_dest' "Archive log format" FROM DUAL
  1050. ";
  1051.    $text = "";
  1052.    $link = "";
  1053.    $infotext = "";
  1054.    DisplayTable($sql,$text,$link,$infotext);
  1055.    
  1056. #   print <<"EOF";
  1057. #<TABLE BORDER=1>
  1058. #  <TH><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Archive log destination / format</TH>
  1059. #  <TR>
  1060. #    <TD><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$log_archive_dest</TD>
  1061. #  </TR>
  1062. #</TABLE>
  1063. #EOF
  1064.    $sql = "$copyright
  1065. SELECT 
  1066.    THREAD# "Thread#",
  1067.    SEQUENCE# "Sequence#",
  1068.    TIME "Time of first entry",
  1069.    LOW_CHANGE# "Lowest  SCN",
  1070.    (HIGH_CHANGE#-1) "Highest SCN",
  1071.    ARCHIVE_NAME "Archived log name"
  1072. FROM V$LOG_HISTORY
  1073. ORDER BY SEQUENCE# DESC
  1074. " if ($oracle7);
  1075.    $sql = "$copyright
  1076. SELECT 
  1077.    THREAD# "Thread#",
  1078.    SEQUENCE# "Sequence#",
  1079.    TO_CHAR(FIRST_TIME,'Day, Month DD YYYY - HH24:MI:SS') "Time of first entry",
  1080.    FIRST_CHANGE# "Lowest  SCN",
  1081.    NEXT_CHANGE# "Highest SCN",
  1082.    RECID "Controlfile RecID",
  1083.    STAMP "Controlfile stamp"
  1084. FROM V$LOG_HISTORY
  1085. ORDER BY SEQUENCE# DESC
  1086. " if ($oracle8);
  1087.    $sql = "$copyright
  1088. SELECT 
  1089.    THREAD# "Thread#",
  1090.    SEQUENCE# "Sequence#",
  1091.    TO_CHAR(FIRST_TIME,'Day, Month DD YYYY - HH24:MI:SS') "Time of first entry",
  1092.    FIRST_CHANGE# "Lowest  SCN",
  1093.    NEXT_CHANGE# "Highest SCN",
  1094.    RECID "Controlfile RecID",
  1095.    STAMP "Controlfile stamp"
  1096. FROM V$LOG_HISTORY
  1097.    WHERE THREAD# = (
  1098. SELECT VALUE FROM V$PARAMETER
  1099.    WHERE NAME = 'thread')
  1100. ORDER BY SEQUENCE# DESC
  1101. " if ( ($oracle8) && (parallel()) );
  1102.    $text = "Archived redo log info";
  1103.    $link = "";
  1104.    $infotext = "There are no archived redologs to report on.";
  1105.    DisplayTable($sql,$text,$link,$infotext);
  1106.    logit("Exit subroutine showArchiving");
  1107. }
  1108. sub showRedo {
  1109.    logit("Enter subroutine showRedo");
  1110.    my ($sql,$cursor,$value,$text,$link);
  1111.    $sql = "$copyright
  1112. SELECT
  1113.    VALUE FROM V$PARAMETER
  1114. WHERE NAME = 'log_archive_start'
  1115. ";
  1116.    $cursor=$dbh->prepare($sql);
  1117.    $cursor->execute;
  1118.    $value = $cursor->fetchrow_array;
  1119.    if ( $value eq "TRUE" ) {
  1120.       print <<"EOF";
  1121. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0>
  1122.   <TR>
  1123.     <TD ALIGMN=CENTER>
  1124.       <FORM METHOD="GET" ACTION="$scriptname">
  1125.         <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1126.         <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1127.         <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="ARCHIVING">
  1128.         <INPUT TYPE="SUBMIT" NAME="archiving" VALUE="Archiving information">
  1129.       </FORM>
  1130.     </TD>
  1131.   </TR>
  1132. </TABLE>
  1133. EOF
  1134.     } else {
  1135.       message("Database archiving is not enabled.");
  1136.    }
  1137. # Online redo log information
  1138.    $sql = "$copyright
  1139. SELECT
  1140.    A.MEMBER "Member",
  1141.    B.GROUP# "Group#",
  1142.    B.THREAD# "Thread#",
  1143.    B.SEQUENCE# "Sequence#",
  1144.    TO_CHAR(B.BYTES,'999,999,999,999') "Bytes",
  1145.    B.MEMBERS "Members",
  1146.    B.ARCHIVED "Archived",
  1147.    B.STATUS "Status"
  1148. FROM V$LOGFILE A, V$LOG B
  1149.    WHERE A.GROUP# = B.GROUP#
  1150. ORDER BY A.MEMBER
  1151. ";
  1152.    $text = "Online redo log info";
  1153.    $link = "";
  1154.    DisplayTable($sql,$text,$link);
  1155.    $sql = "$copyright
  1156. SELECT
  1157.    TO_CHAR(TRUNC(FIRST_TIME),'Mon DD') "Date",
  1158.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'00',1,0)),'9999') "00",
  1159.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'01',1,0)),'9999') "01",
  1160.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'02',1,0)),'9999') "02",
  1161.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'03',1,0)),'9999') "03",
  1162.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'04',1,0)),'9999') "04",
  1163.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'05',1,0)),'9999') "05",
  1164.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'06',1,0)),'9999') "06",
  1165.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'07',1,0)),'9999') "07",
  1166.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'08',1,0)),'9999') "08",
  1167.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'09',1,0)),'9999') "09",
  1168.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'10',1,0)),'9999') "10",
  1169.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'11',1,0)),'9999') "11",
  1170.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'12',1,0)),'9999') "12",
  1171.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'13',1,0)),'9999') "13",
  1172.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'14',1,0)),'9999') "14",
  1173.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'15',1,0)),'9999') "15",
  1174.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'16',1,0)),'9999') "16",
  1175.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'17',1,0)),'9999') "17",
  1176.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'18',1,0)),'9999') "18",
  1177.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'19',1,0)),'9999') "19",
  1178.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'20',1,0)),'9999') "20",
  1179.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'21',1,0)),'9999') "21",
  1180.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'22',1,0)),'9999') "22",
  1181.    TO_CHAR(SUM(DECODE(TO_CHAR(FIRST_TIME,'HH24'),'23',1,0)),'9999') "23"
  1182. FROM V$LOG_HISTORY
  1183.    GROUP BY TRUNC(FIRST_TIME)
  1184.    ORDER BY TRUNC(FIRST_TIME) DESC
  1185. " if $oracle8;
  1186.    $sql = "$copyright
  1187. SELECT
  1188.    SUBSTR(TIME,1,5) "Day",
  1189.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'00',1,0)),'9999') "00",
  1190.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'01',1,0)),'9999') "01",
  1191.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'02',1,0)),'9999') "02",
  1192.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'03',1,0)),'9999') "03",
  1193.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'04',1,0)),'9999') "04",
  1194.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'05',1,0)),'9999') "05",
  1195.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'06',1,0)),'9999') "06",
  1196.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'07',1,0)),'9999') "07",
  1197.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'08',1,0)),'9999') "08",
  1198.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'09',1,0)),'9999') "09",
  1199.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'10',1,0)),'9999') "10",
  1200.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'11',1,0)),'9999') "11",
  1201.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'12',1,0)),'9999') "12",
  1202.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'13',1,0)),'9999') "13",
  1203.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'14',1,0)),'9999') "14",
  1204.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'15',1,0)),'9999') "15",
  1205.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'16',1,0)),'9999') "16",
  1206.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'17',1,0)),'9999') "17",
  1207.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'18',1,0)),'9999') "18",
  1208.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'19',1,0)),'9999') "19",
  1209.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'20',1,0)),'9999') "20",
  1210.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'21',1,0)),'9999') "21",
  1211.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'22',1,0)),'9999') "22",
  1212.    TO_CHAR(SUM(DECODE(SUBSTR(TIME,10,2),'23',1,0)),'9999') "23"
  1213. FROM V$LOG_HISTORY
  1214.    GROUP BY SUBSTR(TIME,1,5)
  1215. " if $oracle7;
  1216.    $text = "Graph of log switch history by day and hour";
  1217.    $link = "";
  1218.    DisplayTable($sql,$text,$link);
  1219.    logit("Exit subroutine showRedo");
  1220. }
  1221. sub checkPriv {
  1222.    logit("Enter subroutine checkPriv");
  1223.    my ($privilege,$yesno);
  1224.    $privilege = shift;
  1225.    logit("   Checking for privilege "$privilege"");
  1226.    $sql = "$copyright
  1227. SELECT
  1228.    COUNT(*)
  1229. FROM SESSION_PRIVS
  1230.    WHERE PRIVILEGE = '$privilege'
  1231. ";
  1232.    $cursor=$dbh->prepare($sql) or ErrorPage("$DBI::errstr");
  1233.    $cursor->execute;
  1234.    $yesno = $cursor->fetchrow_array;
  1235.    $cursor->finish;
  1236.    logit("   Returning value of $yesno for privilege");
  1237.    logit("Exit subroutine checkPriv");
  1238.    return($yesno);
  1239. }
  1240. sub refreshButton {
  1241.    logit("Enter subroutine refreshButton");
  1242.    my $url = "$scriptname?database=$database&user=$user&schema=$schema&object_type=$object_type&arg=$object_name";
  1243.    my $sid = $query->param('sid') || "";
  1244.    my $serial = $query->param('serial') || "";
  1245. # Display refresh button
  1246.    print <<"EOF";
  1247.   <FORM METHOD="POST" ACTION="$scriptname">
  1248.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1249. EOF
  1250.    print "<INPUT TYPE=HIDDEN NAME=database    VALUE=$database>n" if $database;
  1251.    print "<INPUT TYPE=HIDDEN NAME=user        VALUE=$user>n" if $user;
  1252.    print "<INPUT TYPE=HIDDEN NAME=schema      VALUE=$schema>n" if $schema;
  1253.    print "<INPUT TYPE=HIDDEN NAME=object_type VALUE=$object_type>n" if $object_type;
  1254.    print "<INPUT TYPE=HIDDEN NAME=arg         VALUE=$object_name>n" if $object_name;
  1255.    print "<INPUT TYPE=HIDDEN NAME=url         VALUE=$url>n" if $url;
  1256.    print "<INPUT TYPE=HIDDEN NAME=sid         VALUE=$sid>n" if $sid;
  1257.    print "<INPUT TYPE=HIDDEN NAME=serial      VALUE=$serial>n" if $serial;
  1258.    print "<INPUT TYPE=SUBMIT NAME=sessions    VALUE=Refresh>n";
  1259.    print "</FORM>n";
  1260.    logit("Exit subroutine refreshButton");
  1261. }
  1262. sub topSessions {
  1263.    logit("Enter subroutine topSessions");
  1264.    my ($sql,$cursor,$sid,$serial,$username,$command,$osuser,$status,$process,$terminal,$program);
  1265.    my ($sortfield,$refreshrate,$highlight,$color,$blockchanges,$sqltext);
  1266.    $sortfield = $query->param('sortfield') || "orauser";
  1267.    $refreshrate = $ENV{'AUTO_REFRESH'} || "10";
  1268.    $highlight = "#FFFFC6";
  1269.    logit("   Sort field = $sortfield");
  1270.    print <<"EOF";
  1271.   <FORM METHOD="POST" ACTION="$scriptname">
  1272.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1273.     <INPUT TYPE=HIDDEN NAME=database    VALUE=$database>
  1274.     <INPUT TYPE=HIDDEN NAME=object_type VALUE=$object_type>
  1275.     <INPUT TYPE=HIDDEN NAME=arg         VALUE=$object_name>
  1276.     <INPUT TYPE=HIDDEN NAME=refreshrate VALUE=$refreshrate>
  1277.     <INPUT TYPE=HIDDEN NAME=sortfield   VALUE=$sortfield>
  1278.     <INPUT TYPE=SUBMIT NAME=foobar      VALUE="AutoRefresh ($refreshrate)">
  1279.   </FORM>
  1280. EOF
  1281.    print << "EOF";
  1282. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1283.   <TR>
  1284.     <TD WIDTH=100%>
  1285.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1286. EOF
  1287.    if ($sortfield eq "sid") {
  1288.       $color = $highlight;
  1289.    } else {
  1290.       $color = $headingcolor;
  1291.    }
  1292.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=sid>SID</A></TH>n";
  1293.    if ($sortfield eq "serial") {
  1294.       $color = $highlight;
  1295.    } else {
  1296.       $color = $headingcolor;
  1297.    }
  1298.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=serial>Serial#</A></TH>n";
  1299.    if ($sortfield eq "orauser") {
  1300.       $color = $highlight;
  1301.    } else {
  1302.       $color = $headingcolor;
  1303.    }
  1304.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=orauser>Ora user</A></TH>n";
  1305.    if ($sortfield eq "osuser") {
  1306.       $color = $highlight;
  1307.    } else {
  1308.       $color = $headingcolor;
  1309.    }
  1310.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=osuser>OSuser</A></TH>n";
  1311.    if ($sortfield eq "command") {
  1312.       $color = $highlight;
  1313.    } else {
  1314.       $color = $headingcolor;
  1315.    }
  1316.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=command>Commmand</A></TH>n";
  1317.    if ($sortfield eq "blockchanges") {
  1318.       $color = $highlight;
  1319.    } else {
  1320.       $color = $headingcolor;
  1321.    }
  1322.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=blockchanges>Block changes</A></TH>n";
  1323.    if ($sortfield eq "status") {
  1324.       $color = $highlight;
  1325.    } else {
  1326.       $color = $headingcolor;
  1327.    }
  1328.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=status>Status</A></TH>n";
  1329.    if ($sortfield eq "process") {
  1330.       $color = $highlight;
  1331.    } else {
  1332.       $color = $headingcolor;
  1333.    }
  1334.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=process>Process</A></TH>n";
  1335.    if ($sortfield eq "sqltext") {
  1336.       $color = $highlight;
  1337.    } else {
  1338.       $color = $headingcolor;
  1339.    }
  1340.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=sqltext>SQL text</A></TH>n";
  1341.    if ($sortfield eq "program") {
  1342.       $color = $highlight;
  1343.    } else {
  1344.       $color = $headingcolor;
  1345.    }
  1346.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=program>Program</A></TH>n";
  1347.    if ($sortfield eq "terminal") {
  1348.       $color = $highlight;
  1349.    } else {
  1350.       $color = $headingcolor;
  1351.    }
  1352.    print "         <TH BGCOLOR='$color' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'><A HREF=$scriptname?database=$database&object_type=$object_type&arg=$object_name&sortfield=terminal>Terminal</A></TH>n";
  1353.    $sortfield = "SID DESC" if ($sortfield eq "sid");
  1354.    $sortfield = "SERIAL# DESC" if ($sortfield eq "serial");
  1355.    $sortfield = "USERNAME" if ($sortfield eq "orauser");
  1356.    $sortfield = "OSUSER" if ($sortfield eq "osuser");
  1357.    $sortfield = "COMMAND DESC" if ($sortfield eq "command");
  1358.    $sortfield = "BLOCK_CHANGES DESC" if ($sortfield eq "blockchanges");
  1359.    $sortfield = "STATUS" if ($sortfield eq "status");
  1360.    $sortfield = "PROCESS DESC" if ($sortfield eq "process");
  1361.    $sortfield = "SQL_TEXT DESC" if ($sortfield eq "sqltext");
  1362.    $sortfield = "TERMINAL" if ($sortfield eq "terminal");
  1363.    $sortfield = "PROGRAM" if ($sortfield eq "program");
  1364.    
  1365.    $sql = "$copyright
  1366. SELECT
  1367.    VS.SID SID,
  1368.    VS.SERIAL# SERIAL#,
  1369.    VS.USERNAME USERNAME,
  1370.    VS.OSUSER OSUSER,
  1371.    DECODE(VS.COMMAND,
  1372. '0','None',
  1373. '1','Create table',
  1374. '2','Insert',
  1375. '3','Select',
  1376. '4','Create cluster',
  1377. '5','Alter cluster',
  1378. '6','Update',
  1379. '7','Delete',
  1380. '8','Drop cluster',
  1381. '9','Create index',
  1382. '10','Drop index',
  1383. '11','Alter index',
  1384. '12','Drop table',
  1385. '13','Create sequence',
  1386. '14','Alter sequence',
  1387. '15','Alter table',
  1388. '16','Drop sequence',
  1389. '17','Grant',
  1390. '18','Revoke',
  1391. '19','Create synonym',
  1392. '20','Drop synonym',
  1393. '21','Create view',
  1394. '22','Drop view',
  1395. '23','Validate index',
  1396. '24','Create procedure',
  1397. '25','Alter procedure',
  1398. '26','Lock table',
  1399. '27','No operation in progress',
  1400. '28','Rename',
  1401. '29','Comment',
  1402. '30','Audit',
  1403. '31','Noaudit',
  1404. '32','Create database link',
  1405. '33','Drop database link',
  1406. '34','Create database',
  1407. '35','Alter database',
  1408. '36','Create rollback segment',
  1409. '37','Alter rollback segment',
  1410. '38','Drop rollback segment',
  1411. '39','Create tablespace',
  1412. '40','Alter tablespace',
  1413. '41','Drop tablespace',
  1414. '42','Alter session',
  1415. '43','Alter user',
  1416. '44','Commit',
  1417. '45','Rollback',
  1418. '46','Savepoint',
  1419. '47','PL/SQL Execute',
  1420. '48','Set transaction',
  1421. '49','Alter system switch log',
  1422. '50','Explain',
  1423. '51','Create user',
  1424. '52','Create role',
  1425. '53','Drop user',
  1426. '54','Drop role',
  1427. '55','Set role',
  1428. '56','Create schema',
  1429. '57','Create control file',
  1430. '58','Alter tracing',
  1431. '59','Create trigger',
  1432. '60','Alter trigger',
  1433. '61','Drop trigger',
  1434. '62','Analyze table',
  1435. '63','Analyze index',
  1436. '64','Analyze cluster',
  1437. '65','Create profile',
  1438. '66','Drop profile',
  1439. '67','Alter profile',
  1440. '68','Drop procedure',
  1441. '69','Drop procedure',
  1442. '70','Alter resource cost',
  1443. '71','Create snapshot log',
  1444. '72','Alter snapshot log',
  1445. '73','Drop snapshot log',
  1446. '74','Create snapshot',
  1447. '75','Alter snapshot',
  1448. '76','Drop snapshot',
  1449. '79','Alter role',
  1450. '85','Truncate table',
  1451. '86','Truncate cluster',
  1452. '88','Alter view',
  1453. '91','Create function',
  1454. '92','Alter function',
  1455. '93','Drop function',
  1456. '94','Create package',
  1457. '95','Alter package',
  1458. '96','Drop package',
  1459. '97','Create package body',
  1460. '98','Alter package body',
  1461. '99','Drop package body') COMMAND,
  1462.    TO_CHAR(VSI.BLOCK_CHANGES,'999,999,999,999') BLOCK_CHANGES,
  1463.    VS.STATUS STATUS,
  1464.    VS.PROCESS PROCESS,
  1465.    VST.SQL_TEXT,
  1466.    VS.TERMINAL TERMINAL,
  1467.    VS.PROGRAM PROGRAM
  1468. FROM V$SESSION VS,
  1469.      V$SESS_IO VSI,
  1470.      V$SQLTEXT VST
  1471. WHERE VS.SID = VSI.SID
  1472. AND VS.SQL_ADDRESS = VST.ADDRESS
  1473. AND VST.PIECE = 0
  1474. AND VS.USERNAME IS NOT NULL
  1475.    ORDER BY $sortfield
  1476. ";
  1477.    $cursor = $dbh->prepare($sql);
  1478.    $cursor->execute;
  1479.    while (($sid,$serial,$username,$osuser,$command,$blockchanges,$status,$process,$sqltext,$terminal,$program) = $cursor->fetchrow_array) {
  1480.       $sid = "&nbsp" unless $sid;
  1481.       $serial = "&nbsp" unless $serial;
  1482.       $username = "&nbsp" unless $username;
  1483.       $osuser = "&nbsp" unless $osuser;
  1484.       $command = "&nbsp" unless $command;
  1485.       $blockchanges = "&nbsp" unless $blockchanges;
  1486.       $status = "&nbsp" unless $status;
  1487.       $process = "&nbsp" unless $process;
  1488.       $sqltext = "&nbsp" unless $sqltext;
  1489.       $terminal = "&nbsp" unless $terminal;
  1490.       $program = "&nbsp" unless $program;
  1491.       print "<TR><TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=SESSIONS&user=$username&sid=$sid&serial=$serial>$sid</A></TD>n";
  1492.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$serial</TD>n";
  1493.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A HREF=$scriptname?database=$database&object_type=SESSIONS&user=$username>$username</A></TD>n";
  1494.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$osuser</TD>n";
  1495.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$command</TD>n";
  1496.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$blockchanges</TD>n";
  1497.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status</TD>n";
  1498.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$process</TD>n";
  1499.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$sqltext</TD>n";
  1500.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$program</TD>n";
  1501.       print "<TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$terminal</TD></TR>n";
  1502.    }
  1503.    $cursor->finish;
  1504.    print <<"EOF";
  1505.       </TABLE>
  1506.     </TD>
  1507.   </TR>
  1508. </TABLE>
  1509. EOF
  1510.    logit("Exit subroutine topSessions");
  1511. }
  1512.       
  1513.    
  1514. sub showSessions {
  1515.    logit("Enter subroutine showSessions");
  1516. # Instance session information
  1517.    my ($sql,$text,$cursor,$numfields,@row,$counter1,$counter2,$count,$paddr);
  1518.    my (@username,@osuser,@sid,@serial,@status,@process,@program,@command);
  1519.    my (@address,@hash_value,@rows_processed,@logon_time,@sqltext,$altersystem);
  1520.    my ($mysid,$sessions,$sid,$serial,$user,$moresql);
  1521.    $user = shift;
  1522.    $sid = $query->param('sid') || "";
  1523.    $serial = $query->param('serial') || "";
  1524. # Find out if the connected user has the "ALTER SYSTEM" privilege.
  1525. # This has nothing to do with the above $user variable.
  1526.    $altersystem = checkPriv("ALTER SYSTEM");
  1527.    refreshButton();
  1528.   
  1529.    print "</CENTER>n";
  1530. # If user is not "%", then count the number of sessions
  1531. # and show a message if there is none.
  1532.    if ( $user ne "%" ) {
  1533.       $sql = "$copyright
  1534. SELECT COUNT(*) FROM V$SESSION
  1535.    WHERE USERNAME = '$user'
  1536. ";
  1537.       $cursor = $dbh->prepare($sql);
  1538.       $cursor->execute;
  1539.       $count = $cursor->fetchrow_array;
  1540.       $cursor->finish;
  1541.       if ( $count == 0 ) {
  1542.          message("$user has no sessions in this instance.");
  1543.          Footer();
  1544.          exit;
  1545.       }
  1546.     } else {
  1547. #      DisplayGraph("sessions","","Active and inactive session history");
  1548.    }
  1549. # If a sid and serial# is passed, create the SQL to select only that session.
  1550.    if ($sid && $serial) {
  1551.       $moresql = "AND S.SID = $sid AND S.SERIAL# = $serialn";
  1552.    } else {
  1553.       $moresql = "";
  1554.    }
  1555. # Get my SID
  1556.    $sql = "$copyright
  1557. SELECT DISTINCT SID FROM V$MYSTAT
  1558. ";
  1559.    $cursor = $dbh->prepare($sql);
  1560.    $cursor->execute;
  1561.    $mysid = $cursor->fetchrow_array;
  1562.    $cursor->finish;
  1563.    $sql = "$copyright
  1564. SELECT DISTINCT
  1565.    S.USERNAME,
  1566.    S.OSUSER,
  1567.    S.SID,
  1568.    S.SERIAL#,
  1569.    S.STATUS,
  1570.    S.PROCESS,
  1571.    S.PROGRAM,
  1572.    DECODE(S.COMMAND,
  1573. '0','No command in progress',
  1574. '1','Create table',
  1575. '2','Insert',
  1576. '3','Select',
  1577. '4','Create cluster',
  1578. '5','Alter cluster',
  1579. '6','Update',
  1580. '7','Delete',
  1581. '8','Drop cluster',
  1582. '9','Create index',
  1583. '10','Drop index',
  1584. '11','Alter index',
  1585. '12','Drop table',
  1586. '13','Create sequence',
  1587. '14','Alter sequence',
  1588. '15','Alter table',
  1589. '16','Drop sequence',
  1590. '17','Grant',
  1591. '18','Revoke',
  1592. '19','Create synonym',
  1593. '20','Drop synonym',
  1594. '21','Create view',
  1595. '22','Drop view',
  1596. '23','Validate index',
  1597. '24','Create procedure',
  1598. '25','Alter procedure',
  1599. '26','Lock table',
  1600. '27','No operation in progress',
  1601. '28','Rename',
  1602. '29','Comment',
  1603. '30','Audit',
  1604. '31','Noaudit',
  1605. '32','Create database link',
  1606. '33','Drop database link',
  1607. '34','Create database',
  1608. '35','Alter database',
  1609. '36','Create rollback segment',
  1610. '37','Alter rollback segment',
  1611. '38','Drop rollback segment',
  1612. '39','Create tablespace',
  1613. '40','Alter tablespace',
  1614. '41','Drop tablespace',
  1615. '42','Alter session',
  1616. '43','Alter user',
  1617. '44','Commit',
  1618. '45','Rollback',
  1619. '46','Savepoint',
  1620. '47','PL/SQL Execute',
  1621. '48','Set transaction',
  1622. '49','Alter system switch log',
  1623. '50','Explain',
  1624. '51','Create user',
  1625. '52','Create role',
  1626. '53','Drop user',
  1627. '54','Drop role',
  1628. '55','Set role',
  1629. '56','Create schema',
  1630. '57','Create control file',
  1631. '58','Alter tracing',
  1632. '59','Create trigger',
  1633. '60','Alter trigger',
  1634. '61','Drop trigger',
  1635. '62','Analyze table',
  1636. '63','Analyze index',
  1637. '64','Analyze cluster',
  1638. '65','Create profile',
  1639. '66','Drop profile',
  1640. '67','Alter profile',
  1641. '68','Drop procedure',
  1642. '69','Drop procedure',
  1643. '70','Alter resource cost',
  1644. '71','Create snapshot log',
  1645. '72','Alter snapshot log',
  1646. '73','Drop snapshot log',
  1647. '74','Create snapshot',
  1648. '75','Alter snapshot',
  1649. '76','Drop snapshot',
  1650. '79','Alter role',
  1651. '85','Truncate table',
  1652. '86','Truncate cluster',
  1653. '88','Alter view',
  1654. '91','Create function',
  1655. '92','Alter function',
  1656. '93','Drop function',
  1657. '94','Create package',
  1658. '95','Alter package',
  1659. '96','Drop package',
  1660. '97','Create package body',
  1661. '98','Alter package body',
  1662. '99','Drop package body'),
  1663.    TO_CHAR(S.LOGON_TIME,'Day MM/DD/YY HH24:MI'),
  1664.    T.ADDRESS,
  1665.    T.HASH_VALUE,
  1666.    MAX(Q.ROWS_PROCESSED)
  1667. FROM V$SESSION S, V$SQLTEXT T, V$SQL Q
  1668.    WHERE S.USERNAME IS NOT NULL 
  1669.    AND S.USERNAME LIKE '$user'
  1670.    AND S.SQL_ADDRESS = T.ADDRESS(+) 
  1671.    AND S.SQL_ADDRESS = Q.ADDRESS(+)
  1672.    AND S.SQL_HASH_VALUE = T.HASH_VALUE(+)
  1673.    AND S.SQL_HASH_VALUE = Q.HASH_VALUE(+)
  1674.    AND S.SID != $mysid
  1675.    $moresql
  1676. GROUP BY S.USERNAME, S.OSUSER, S.SID, S.SERIAL#, S.STATUS, S.PROCESS, S.PROGRAM, S.COMMAND, S.LOGON_TIME, T.ADDRESS, T.HASH_VALUE
  1677. ORDER BY S.STATUS
  1678. ";
  1679.    $cursor = $dbh->prepare($sql);
  1680.    print $DBI::errstr unless ($cursor);
  1681.    $cursor->execute;
  1682.    $numfields = $cursor->{NUM_OF_FIELDS};
  1683.    $counter1=0;
  1684.    while (@row = $cursor->fetchrow_array) {
  1685.       $sessions++;
  1686.       $username[$counter1] = $row[0] or $username[$counter1] = "&nbspc;";
  1687.       $osuser[$counter1] = $row[1] or $osuser[$counter1] = "Unknown";
  1688.       $sid[$counter1] = $row[2] or $sid[$counter1] = "&nbsp;";
  1689.       $serial[$counter1] = $row[3] or $serial[$counter1] = "&nbsp;";
  1690.       $status[$counter1] = $row[4] or $status[$counter1] = "&nbsp;";
  1691.       $process[$counter1] = $row[5] or $process[$counter1] = "Unknown";
  1692.       $program[$counter1] = $row[6] or $program[$counter1] = "Unknown";
  1693.       $command[$counter1] = $row[7] or $command[$counter1] = "Unknown";
  1694.       $logon_time[$counter1] = $row[8] or $logon_time[$counter1] = "Unknown"; 
  1695.       $address[$counter1] = $row[9] or $address[$counter1] = "&nbsp;";
  1696.       $hash_value[$counter1] = $row[10] or $hash_value[$counter1] = "&nbsp;";
  1697.       $rows_processed[$counter1] = $row[11] or $rows_processed[$counter1] = "None";
  1698.       $counter1++;
  1699.    }
  1700.    $cursor->finish;
  1701.    $counter2 = 0;
  1702.    foreach (@address) {
  1703.       $sql = "$copyright
  1704. SELECT 
  1705.    SQL_TEXT, 
  1706.    PIECE 
  1707. FROM V$SQLTEXT 
  1708.    WHERE ADDRESS = '$address[$counter2]' 
  1709.    ORDER BY PIECE
  1710. ";
  1711.    $cursor = $dbh->prepare($sql);
  1712.    $cursor->execute;
  1713.    while (@row = $cursor->fetchrow_array) {
  1714.       $sqltext[$counter2] = "$sqltext[$counter2]$row[0]";
  1715.     }
  1716.    $cursor->finish;
  1717. # Check for processes with a ':' in them. These would be remote connections.
  1718. # Resolve the bad process ID's 
  1719.    if ($process[$counter2] =~ /:/) {
  1720.       $sql = "$copyright
  1721. SELECT PADDR FROM V$SESSION 
  1722.    WHERE SID = $sid[$counter2]
  1723.    AND SERIAL# = $serial[$counter2]
  1724. ";
  1725.       $cursor=$dbh->prepare($sql);
  1726.       $cursor->execute;
  1727.       $paddr = $cursor->fetchrow_array;
  1728.       $cursor->finish;
  1729.             $sql = "$copyright
  1730. SELECT SPID FROM V$PROCESS
  1731.    WHERE ADDR = '$paddr'
  1732. ";
  1733.       $cursor=$dbh->prepare($sql);
  1734.       $cursor->execute;
  1735.       $process[$counter2] = $cursor->fetchrow_array;
  1736.       $cursor->finish;
  1737.    }
  1738. # Fix the SQL so it displays in HTML format correctly
  1739.    $sqltext[$counter2] =~ s/"/&quot;/g;
  1740.    $sqltext[$counter2] =~ s/>/&gt;/g;
  1741.    $sqltext[$counter2] =~ s/</&lt;/g;
  1742.    print << "EOF";
  1743. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  1744.   <TR>
  1745.     <TD WIDTH=100%>
  1746.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  1747.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Ora user</TH>
  1748.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>OS user</TH>
  1749.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>SID</TH>
  1750.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Serial#</TH>
  1751.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Status</TH>
  1752.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Process</TH>
  1753.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Program</TH>
  1754.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Command</TH>
  1755.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Rows</TH>
  1756.         <TH BGCOLOR='$headingcolor' ALIGN=LEFT><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Logon time</TH>
  1757.         <TR>
  1758.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$username[$counter2]</TD>
  1759.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$osuser[$counter2]</TD>
  1760.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$sid[$counter2]</TD>
  1761.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$serial[$counter2]</TD>
  1762.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$status[$counter2]</TD>
  1763.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$process[$counter2]</TD>
  1764.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$program[$counter2]</TD>
  1765.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$command[$counter2]</TD>
  1766.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$rows_processed[$counter2]</TD>
  1767.           <TD BGCOLOR='$headingcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$logon_time[$counter2]</TD>
  1768.         </TR>
  1769. EOF
  1770.    if ($sqltext[$counter2]) {
  1771.       print <<"EOF";
  1772.         <TR>
  1773.           <TD BGCOLOR='$cellcolor' COLSPAN=10><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$sqltext[$counter2]<P>
  1774.             <TABLE>
  1775.               <TR>
  1776. EOF
  1777.    } else {
  1778.       print <<"EOF";
  1779.         <TR>
  1780.           <TD BGCOLOR='$cellcolor' COLSPAN=10><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>No SQL<P>
  1781.             <TABLE>
  1782.               <TR>
  1783. EOF
  1784.    }
  1785.    print <<"EOF";
  1786.                 <TD>
  1787.                   <FORM METHOD=POST ACTION="$scriptname">
  1788.                     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1789.                     <INPUT TYPE=HIDDEN NAME="object_type" VALUE="SESSIONSTATS">
  1790.                     <INPUT TYPE=HIDDEN NAME="database" VALUE="$database">
  1791.                     <INPUT TYPE=HIDDEN NAME="schema" VALUE="$sid[$counter2]">
  1792.                     <INPUT TYPE=SUBMIT VALUE="Session stats">
  1793.                   </FORM>
  1794.                 </TD>
  1795. EOF
  1796.    if ($sqltext[$counter2]) {
  1797.       print <<"EOF";
  1798.                 <TD>
  1799.                   <FORM METHOD=POST ACTION="$scriptname">
  1800.                     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1801.                     <INPUT TYPE=HIDDEN NAME="object_type" VALUE="EXPLAIN">
  1802.                     <INPUT TYPE=HIDDEN NAME="database" VALUE="$database">
  1803.                     <INPUT TYPE=HIDDEN NAME="schema" VALUE="$sid[$counter2]">
  1804.                     <INPUT TYPE=HIDDEN NAME="explainschema" VALUE="$username[$counter2]">
  1805.                     <INPUT TYPE=HIDDEN NAME="arg" VALUE="$sqltext[$counter2]">
  1806.                     <INPUT TYPE=SUBMIT VALUE="Explain plan">
  1807.                   </FORM>
  1808.                 </TD>
  1809. EOF
  1810.    }
  1811.    if (($altersystem) && ($status[$counter2] ne "KILLED")) {
  1812.       print <<"EOF";
  1813.                 <TD>
  1814.                   <FORM METHOD=POST ACTION="$scriptname">
  1815.                      <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  1816.                      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  1817.                      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  1818.                      <INPUT TYPE=HIDDEN NAME="object_type" VALUE="KILLSESSION">
  1819.                      <INPUT TYPE=HIDDEN NAME="database" VALUE="$database">
  1820.                      <INPUT TYPE=HIDDEN NAME="arg" VALUE="$sid[$counter2]">
  1821.                      <INPUT TYPE=HIDDEN NAME="schema" VALUE="$serial[$counter2]">
  1822.                      <INPUT TYPE=SUBMIT VALUE="Kill session">
  1823.                   </FORM>
  1824.                 </TD>
  1825. EOF
  1826.    }
  1827.    print <<"EOF";
  1828.               </TR>
  1829.             </TABLE>
  1830.           </TD>
  1831.         </TR>
  1832.       </TABLE>
  1833.     </TD>
  1834.   </TR>
  1835. </TABLE>
  1836. <HR WIDTH="5%" ALIGN=LEFT>
  1837. EOF
  1838.    $counter2++;
  1839.    }
  1840.    print "<CENTER>n";
  1841.    message("No sessions to display.") unless ($sessions);
  1842.    refreshButton("10");
  1843.    logit("Exit subroutine showSessions");
  1844. }
  1845. sub GetTNS {
  1846.    logit("Enter subroutine GetTNS");
  1847. # Usage: @tns_entries = GetTNS();
  1848. # If you have ever wondered why Russia was first in space, check out the hacks below!
  1849. # Many thanks to Dima Dorofeev.
  1850. # Returns the database connection strings defined in the tnsnames.ora.
  1851. # Also removes duplicates and sorts alphabetically. Duplicates can show
  1852. # up because the DBI->data_sources checks both the tnsnames.ora file
  1853. # and the oratab file. There are several possibilities here, I'm waiting
  1854. # to see if there are any complaints before I remove the others.
  1855. # 1  my %hash =  map { (split(':'))[-1] , undef } DBI->data_sources('Oracle');
  1856. # 2  my %hash = map { /:(w[w-]*)(?:.world){0,1}$/i , undef } DBI->data_sources('Oracle');
  1857. #   delete($hash{""});
  1858. # 3  my %hash = map { /:([.w]+)(?:.world){0,1}$/i , undef } DBI->data_sources('Oracle');
  1859.    my %hash = map { (split(/.world/i,(split(':'))[-1]))[0] , undef } DBI->data_sources('Oracle');
  1860.    return sort keys %hash;
  1861.    logit("Exit subroutine GetTNS");
  1862. }
  1863. sub ObjectTable {
  1864.    logit("Enter subroutine ObjectTable");
  1865. # Usage: ObjectTable ($dbh,$sql,$text,$infotext);
  1866. # This sub is specifically for displaying a table with
  1867. # database object name, type, and owner.
  1868. # It will make each entry a hyperlink to obtain additional
  1869. # information about the object.
  1870.    my $sql = shift;
  1871.    my $text = shift;
  1872.    my $infotext = shift;
  1873.    my ($cursor,@row,$object_name,$object_type,$schema,$count,$numfields,$field,$name);
  1874.    $infotext = "<FONT COLOR="$infocolor">$infotext</FONT>";
  1875.    $cursor = $dbh->prepare($sql) or ErrorPage ("$DBI::errstr");
  1876.    $cursor->execute or ErrorPage ("$DBI::errstr");
  1877.    $count = 0;
  1878.    while (@row = $cursor->fetchrow_array) {
  1879.       $count++;
  1880.    }
  1881.    $cursor->finish or ErrorPage ("$DBI::errstr");
  1882.    if ($count != 0) {
  1883.       $cursor = $dbh->prepare($sql) or ErrorPage ("$DBI::errstr");
  1884.       $cursor->execute or ErrorPage ("$DBI::errstr");
  1885.       print "<P><B>$text</B></P>n" if defined $text;
  1886.       print "<TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>n";
  1887.       print "  <TR>n";
  1888.       print "    <TD WIDTH=100%>n";
  1889.       print "      <TABLE BORDER=0 cellpadding=2 cellspacing=1>n";
  1890.       $cursor = $dbh->prepare($sql) or ErrorPage ("$DBI::errstr");
  1891.       $cursor->execute or ErrorPage ("$DBI::errstr");
  1892.       $numfields = $cursor->{NUM_OF_FIELDS};
  1893.       for ($field=0; $field < $numfields; $field++) {
  1894.          $name = $cursor->{NAME}->[$field];
  1895.          print "      <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>$name</TH>";
  1896.       }
  1897.       while (@row = $cursor->fetchrow_array) {
  1898.          $object_name =$row[0];
  1899.          $object_type =$row[1];
  1900.          $schema =$row[2];
  1901.          print "      <TR ALIGN=LEFT>";
  1902.          $_ = $row[0];
  1903.          s/ /+/;
  1904.          $object_name = $_;
  1905.          $_ = $row[1];
  1906.          s/ /+/;
  1907.          $object_type = $_;
  1908.          for ($field=0; $field < $numfields; $field++) {
  1909.             print "        <TD BGCOLOR='$cellcolor'";
  1910.             print " ALIGN=RIGHT" if ($row[$field] =~ /^s*.?d/);
  1911.             if ($field == 0) {
  1912.                print "><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$scriptname?database=$database&arg=$object_name&object_type=$object_type&schema=$schema>$row[$field]</A></TD>n";
  1913.             } else {
  1914.                print "><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$row[$field]</TD>n";
  1915.             }
  1916.          }
  1917.       print "        </TR>n";
  1918.       }
  1919.       print "      </TABLE>n";
  1920.       print "    </TD>n";
  1921.       print "  </TR>n";
  1922.       print "</TABLE>n";
  1923.       $cursor->finish or ErrorPage ("$DBI::errstr");
  1924.    } else {
  1925.       print "<P><B>$infotext</B></P>n" if ( defined $infotext );
  1926.    }
  1927.    logit("Exit subroutine ObjectTable");
  1928.    if ($DBI::errstr) {
  1929.       return($DBI::errstr);
  1930.    } else {
  1931.       return($count);
  1932.    }
  1933. }
  1934. sub DisplayColTable {
  1935.    logit("Enter subroutine DisplayColTable");
  1936. # Usage: DisplayColTable ($sql,$text,$link,$infotext,$cols);
  1937. # This sub is for displaying a table of 'n' columns
  1938. # wide from a query that returns a single column of
  1939. # data. 
  1940. # The first arg is the SQL you want to execute.
  1941. # The second arg (text) is for optionally putting a text description
  1942. # of the outputted data above the table.
  1943. # The third argument is to optionally make the table output
  1944. # a hyperlink. the hyperlink will use the data in the first column
  1945. # as an argument to whatever the link is pointing to.
  1946. # The fourth argument is the text that you want to display if
  1947. # no rows are returned from the query.
  1948. # The fifth argument is the number of columns wide you want the table
  1949. # to be.
  1950. # The sixth argument is if you want a checkbox beside each entry
  1951. # The seventh argument is the target (read by Director()) to go to.
  1952. # The eight (Geez!) argument is to set a value to the hidden param "command"
  1953.    my $sql = shift;
  1954.    my $text = shift;
  1955.    my $link = shift;
  1956.    my $infotext = shift;
  1957.    my $cols = shift;
  1958.    my $checkbox = shift;
  1959.    my $target = shift;
  1960.    my $submittext = shift;
  1961.    my $command = shift;
  1962.    my $counter = 0;
  1963.    my ($cursor,$row,$i,@row,$count,$skip,$arg);
  1964.    $dbh->{LongReadLen} = 2048;
  1965.    $infotext = "<FONT COLOR="$infocolor">$infotext</FONT>";
  1966.    $cursor = $dbh->prepare($sql);
  1967.    $cursor->execute;
  1968.    $count = 0;
  1969.    while (@row = $cursor->fetchrow_array) {
  1970.       $count++;
  1971.    }
  1972.    if ($count <= $cols) {
  1973.       $cols = $count;
  1974.    }
  1975.    $cursor->finish; 
  1976.    if ($count != 0) {
  1977.       print "<P><B>$text</B></P>n" if defined $text;
  1978.       print "<TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>n";
  1979.       if ($checkbox) {
  1980.          print <<"EOF";
  1981.   <FORM METHOD=POST ACTION=$scriptname>
  1982.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  1983.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="$target">
  1984.     <INPUT TYPE="HIDDEN" NAME="command" VALUE="$command">
  1985. EOF
  1986.       }
  1987.       print "  <TR>n";
  1988.       print "    <TD WIDTH=100%>n";
  1989.       print "      <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>n";
  1990.       $cursor = $dbh->prepare($sql) or return($DBI::errstr);
  1991.       $cursor->execute or return($DBI::errstr);
  1992.       while ($row = $cursor->fetchrow_array) {
  1993.          $arg = $row;
  1994.          $arg =~ s/ /+/;
  1995.          print "        <TR ALIGN=CENTER>" if $counter == 0;
  1996.          if ($link) {
  1997.             print "          <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$link&arg=$arg>$row</A></TD>n";
  1998.          } else {
  1999.             if ($checkbox) {
  2000.                print "          <TD ALIGN=LEFT BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=checked~$row>&nbsp;$row</TD>n";
  2001.             } else {
  2002.                print "          <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$row</TD>n";
  2003.             }
  2004.          }
  2005.          $counter++;
  2006.          print "        </TR>" if $counter == 0;
  2007.          $skip = "";
  2008.          if ($counter == $cols) {
  2009.             $counter = 0;
  2010.             $skip = "Y";
  2011.          }
  2012.       }
  2013.       if ((! $skip) && ($counter < $cols)) {
  2014.          for ($i = $counter; $i < $cols; $i++) {
  2015.             print "          <TD BGCOLOR='$cellcolor'>&nbsp;</TD>n";
  2016.          }
  2017.       }
  2018.       print "      </TABLE>n";
  2019.       print "    </TD>n";
  2020.       print "  </TR>n";
  2021.       if ($checkbox) {
  2022.       print <<"EOF";
  2023. <INPUT TYPE=SUBMIT VALUE="$submittext">
  2024. </FORM>
  2025. EOF
  2026.       }
  2027.       print "</TABLE>n";
  2028.       $cursor->finish;
  2029.    } else {
  2030.       print "<P><B>$infotext</B></P>n" if ( defined $infotext );
  2031.    }
  2032.    logit("Exit subroutine DisplayColTable");
  2033.    if ($DBI::errstr) {
  2034.       return($DBI::errstr);
  2035.    } else {
  2036.       return($count);
  2037.    }
  2038. }
  2039.    
  2040. sub DisplayTable {
  2041.    logit("Enter subroutine DisplayTable");
  2042. # Usage:  DisplayTable ($sql,$text,$link,$infotext);
  2043. # This sub is for formatting the output of a SQL query. The
  2044. # output will have the column headings in bold with the data
  2045. # in a HTML table.
  2046. # The first arg is the SQL you want to execute.
  2047. # The second arg (text) is for optionally putting a text description
  2048. # of the outputted data above the table.
  2049. # The third argument is to optionally make the table output
  2050. # a hyperlink. the hyperlink will use the data in the first column
  2051. # as an argument to whatever the link is pointing to.
  2052. # The fourth argument is the text that you want to display if
  2053. # no rows are returned from the query.
  2054. # The fifth argument is for optionally specifying a set number of
  2055. # rows to return.
  2056.    my $sql = shift || "";
  2057.    my $text = shift || "";
  2058.    my $link = shift || "";
  2059.    my $infotext = shift || "";
  2060.    my $rows = shift || "";
  2061.    my $count = 0;
  2062.    logit("   Link passed = $link") if $link;
  2063. # Change spaces to +'s on links passed.
  2064.    $link =~ s/ /+/g if $link;
  2065.    $dbh->{LongReadLen} = 2048;
  2066.    $dbh->{LongTruncOk} = 1;
  2067.    $infotext = "<FONT COLOR="$infocolor">$infotext</FONT>" if $infotext;
  2068.    my ($cursor,@row,$numfields,$field,$name,$arg);
  2069.    if ( $link eq "" ) {
  2070.       undef $link;
  2071.    } else {
  2072.       $link =~ tr/ /+/;
  2073.    }
  2074.    $cursor = $dbh->prepare($sql) or return($DBI::errstr);
  2075.    $cursor->execute or return($DBI::errstr);
  2076.    while (@row = $cursor->fetchrow_array) {
  2077.       $count++;
  2078.    }
  2079.    logit("   Rows returned: $count");
  2080.    $cursor->finish or return("$DBI::errstr");
  2081.    if ($count != 0) {
  2082.       $count = 0;
  2083.       print "<P><B>$text</B></P>n" if defined $text;
  2084.       print "<TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>n";
  2085.       print "<TR><TD WIDTH=100%>n";
  2086.       print "<TABLE BORDER=0 cellpadding=2 cellspacing=1>n";
  2087.       $cursor = $dbh->prepare($sql) or return($DBI::errstr);
  2088.       $cursor->execute or return($DBI::errstr);
  2089.       $numfields = $cursor->{NUM_OF_FIELDS};
  2090.       for ($field=0; $field < $numfields; $field++) {
  2091.          $name = $cursor->{NAME}->[$field];
  2092.          print "<TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>$name</TH>";
  2093.       }
  2094.       print "n";
  2095.       while (@row = $cursor->fetchrow_array) {
  2096.          $count++;
  2097.          print "<TR ALIGN=LEFT>";
  2098.          for (my $field=0; $field < $numfields; $field++) {
  2099.             if ($field == 0) {
  2100. # Change spaces to +'s, and escape all unsafe characters
  2101.                $_ = $row[$field];
  2102.                s/ /+/g;
  2103.                s/#/%23/g;
  2104.                s/</%3C/g;
  2105.                s/>/%3E/g;
  2106.                s/{/%7B/g;
  2107.                s/|/%7C/g;
  2108.                s/}/%7D/g;
  2109.                s/\/%5C/g;
  2110.                s/^/%5E/g;
  2111.                $arg = $_;
  2112.             }
  2113.             print "<TD VALIGN=TOP BGCOLOR='$cellcolor'";
  2114.             if ($row[$field] ne "") {
  2115.                print " ALIGN=RIGHT" if ($row[$field] =~ /^s*.?d/);
  2116. # Change spaces to real HTML spaces and fix HTML characters.
  2117.                $row[$field] =~ s/s/&nbsp;/g;
  2118. #               $row[$field] =~s/&/&amp;/g;
  2119.                $row[$field] =~s/"/&quot;/g;
  2120.                $row[$field] =~s/>/&gt;/g;
  2121.                $row[$field] =~s/</&lt;/g;
  2122.                if (($link) && ($field == 0)) {
  2123.                   print "><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><A href=$link&arg=$arg>$row[$field]</A></TD>n";
  2124.                } else {
  2125.                   print "><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$row[$field]</TD>n";
  2126.                }
  2127.             } else {
  2128.                print ">&nbsp;</TD>n";
  2129.             }
  2130.          }
  2131.          print "</TR>n";
  2132.          if ($rows) {
  2133.             last if ($count > $rows); 
  2134.          }
  2135.       }
  2136.       print "</TABLE></TD></TR>n";
  2137.       print "</TABLE>n";
  2138.       $cursor->finish or return("$DBI::errstr");
  2139.    } else {
  2140.       print "<P><B>$infotext</B></P>n" if ( defined $infotext );
  2141.    }
  2142.    logit("Exit subroutine DisplayTable");
  2143.    return($count);
  2144. }
  2145. sub DisplayPiecedData {
  2146.    logit("Enter subroutine DisplayPiecedData");
  2147. # Usage:   DisplayPiecedData ($sql,$text,$link)
  2148. # This is for formatting the output of a SQL query. The
  2149. # output will have the column headings in bold with the data
  2150. # in a HTML table. This sub should be used for data retrieved
  2151. # from tables which have the data in pieces such as dba_source,
  2152. # and v$sql.
  2153. # The first arg is the SQL you want to execute.
  2154. # The second arg (text) is for optionally putting a text description
  2155. # of the outputted data above the table.
  2156. # The third argument is to optionally make the table output
  2157. # a hyperlink. the hyperlink will use the data in the first column
  2158. # as an argument to whatever the link is pointing to.
  2159.    my $sql = shift || "";
  2160.    my $text = shift || "";
  2161.    my $link = shift || "";
  2162.    my $numbers = shift || "";
  2163.    my $count = 0;
  2164.    my ($cursor,@row,$field,$name,$arg,$row,$data);
  2165.    my (@lines,$line,$linecounter);
  2166.    if ( $link eq "" ) {
  2167.       undef $link;
  2168.    } else {
  2169.       $link =~ tr/ /+/;
  2170.    }
  2171.    $dbh->{LongReadLen} = 10240;
  2172.    $dbh->{LongTruncOk} = 1;
  2173.    $data= "";
  2174.    $cursor = $dbh->prepare($sql) or ErrorPage ("$DBI::errstr");
  2175.    $cursor->execute or ErrorPage ("$DBI::errstr");
  2176.    while (@row = $cursor->fetchrow_array) {
  2177.       $count++;
  2178.    }
  2179.    $cursor->finish or ErrorPage ("$DBI::errstr");
  2180.    if ($count != 0) {
  2181.       $cursor = $dbh->prepare($sql) or ErrorPage ("$DBI::errstr");
  2182.       $cursor->execute or ErrorPage ("$DBI::errstr");
  2183.       while ($_ = $cursor->fetchrow_array) {
  2184.             s/</&lt;/g;
  2185.             s/>/&gt;/g;
  2186.             $row = $_;
  2187.             $data = "$data$row";
  2188.       }
  2189.       print "<P><B>$text</B></P>n" if defined $text;
  2190.       print "<TABLE BORDER=0>n";
  2191.       print "  <TR>n";
  2192.       print "    <TD>n";
  2193.       print "      <TABLE BORDER=0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>n";
  2194.       print "        <TR>n";
  2195.       print "          <TD WIDTH=100%>n";
  2196.       print "            <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>n";
  2197.       print "              <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Recreate text</TH>n";
  2198.       print "              <TH BGCOLOR='$headingcolor'><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Debug text</TH>n";
  2199.       print "              <TR>n";
  2200.       print "                <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><PRE>$data</PRE></TD>" if ! defined $link;
  2201.       print "                <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><PRE><A href=$link&arg=$arg>$data</A></PRE></TD>" if defined $link;
  2202.       @lines = split /n/, $data;
  2203.       $linecounter = 0;
  2204.       print "                <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><PRE>nn";
  2205.       foreach $line (@lines) {
  2206.          $linecounter++;
  2207.          print "<FONT COLOR=$linkcolor><$linecounter></FONT>  $line<BR>" if ! defined $link;
  2208.          print "<A href=$link&arg=$arg><FONT COLOR=$linkcolor><$linecounter></FONT> $line</A><BR>" if defined $link;
  2209.       }
  2210.       print "                </PRE>n";
  2211.       print "                </TD>n";
  2212.       print "              </TR>";
  2213.       print "            </TABLE>n";
  2214.       print "          </TD>n";
  2215.       print "        </TR>n";
  2216.       print "      </TABLE>n";
  2217.       print "    </TD>n";
  2218.       print "  </TR>n";
  2219.       print "</TABLE>n";
  2220.       $cursor->finish or ErrorPage ("$DBI::errstr");
  2221.    }
  2222.    logit("Exit subroutine DisplayPiecedData");
  2223. }
  2224. sub Header {
  2225. # Usage: Header ($title,$heading,$font,$fontsize,$fontcolor,$bgcolor);
  2226.    logit("Enter subroutine Header");
  2227.    my ($title,$heading,$font,$fontsize,$fontcolor,$bgcolor,$headertype);
  2228.    my ($refreshrate,$url,$arg,$sortfield,$bgline);
  2229. # Creates a HTML header with title
  2230.    $title      = shift || "";
  2231.    $heading    = shift || "";
  2232.    $font       = shift || "";
  2233.    $fontsize   = shift || "";
  2234.    $fontcolor  = shift || "";
  2235.    $bgcolor    = shift || "";
  2236.    $headertype = $query->param('headertype') || "";
  2237.    $refreshrate = $query->param('refreshrate') || "";
  2238.    $sortfield = $query->param('sortfield') || "";
  2239.    $url  = $scriptname;
  2240.    $url .= "?database=$database" if $database;
  2241.    $url .= "&user=$user" if $user;
  2242.    $url .= "&schema=$schema" if $schema;
  2243.    $url .= "&object_type=$object_type" if $object_type;
  2244.    $url .= "&arg=$arg" if $arg;
  2245.    $url .= "&refreshrate=$refreshrate" if $refreshrate;
  2246.    $url .= "&sortfield=$sortfield" if $sortfield;
  2247.    if ($headertype eq "octet") {
  2248.       binmode(STDOUT);
  2249.       print header(-type => 'Oracletool');
  2250. #      print header(-type => 'application/octet-stream');
  2251.    } else {
  2252.       print header(-type => 'text/html');
  2253.    }
  2254.       $bgline = "<BODY BGCOLOR=$bgcolor LINK=$linkcolor ALINK=$linkcolor VLINK=$linkcolor>n";
  2255.       if ($bgimage) {
  2256.          if ((-e "$ENV{'DOCUMENT_ROOT'}/$bgimage") && (-r "$ENV{'DOCUMENT_ROOT'}/$bgimage")) {
  2257.             logit("   Background image is $ENV{'DOCUMENT_ROOT'}/$bgimage and is readable");
  2258.             $bgline = "<BODY BACKGROUND=$bgimage LINK=$linkcolor ALINK=$linkcolor VLINK=$linkcolor>n";
  2259.          }
  2260.       }
  2261.    unless ($headertype eq "octet") {
  2262.       print << "EOF";
  2263. <HTML>
  2264. <HEAD>
  2265. EOF
  2266. # Set a refresh rate for the page if desired
  2267.       if ($refreshrate) {
  2268.          logit("   Refresh rate of $refreshrate set. URL = $url");
  2269.          print "<META HTTP-EQUIV="Refresh" Content="$refreshrate;URL=$url">n";
  2270.       }
  2271.       print << "EOF";
  2272. <META HTTP-EQUIV="pragma" CONTENT="nocache">
  2273. <TITLE>$title</TITLE>
  2274. </HEAD>
  2275. $bgline
  2276. EOF
  2277. print << "EOF";
  2278. <FONT FACE="$font" SIZE="$fontsize" COLOR="$fontcolor">
  2279. <BR><BR>
  2280. <CENTER>
  2281. EOF
  2282. # The following was added to send a message to people I noticed were 
  2283. #  trying to break into my demo database.
  2284. #      my (@forbidden,$forbidden_message,$forbidden_ip);
  2285. #      @forbidden = ("");
  2286. #      $forbidden_message = "Hello, $ENV{'REMOTE_ADDR'}. This demo has been placed here at the expense of the author to distribute useful software for free. It was not put here for you to exercise your cracking skills. Please go away.";
  2287. #
  2288. #      foreach $forbidden_ip(@forbidden) {
  2289. #         if ($ENV{'REMOTE_ADDR'} eq $forbidden_ip) {
  2290. #            message($forbidden_message);
  2291. #            exit;
  2292. #         }
  2293. #      }
  2294. #      if ( $heading ne "" ) {
  2295.          print "$heading";
  2296. #      }
  2297.    }
  2298.    logit("Exit subroutine Header");
  2299. }
  2300. sub framePage {
  2301.    logit("Enter subroutine framePage");
  2302. # Usage: framePage ($title,$heading,$font,$fontsize,$fontcolor,$bgcolor);
  2303. # Creates a HTML header with title
  2304.    my $title      = shift;
  2305.    my $heading    = shift;
  2306.    my $font       = shift;
  2307.    my $fontsize   = shift;
  2308.    my $fontcolor  = shift;
  2309.    my $bgcolor    = shift;
  2310.    my $schema   = uc($username);
  2311. print << "EOF";
  2312. Content-type: Text/htmlnn
  2313. <HTML>
  2314. <HEAD>
  2315.   <TITLE>$database: Oracletool v$VERSION connected as $schema</TITLE>
  2316. </HEAD>
  2317. <FRAMESET COLS="150,*" BORDER="0">
  2318. <FRAME NAME="menu" SRC="$scriptname?database=$database&object_type=MENU">
  2319. <FRAME NAME="body" SRC="$scriptname?database=$database&schema=$schema&object_type=LISTUSERS">
  2320. </FRAMESET>
  2321. </HTML>
  2322. EOF
  2323.    logit("Exit subroutine framePage");
  2324. exit;
  2325. }
  2326. sub statsPackMenu {
  2327.    logit("Enter subroutine statsPackMenu");
  2328.    my ($sql,$cursor,$snap_count,$min_snap,$max_snap,$db_bounces);
  2329.    $sql = "
  2330. SELECT * FROM 
  2331.    (SELECT TO_CHAR(COUNT(SNAP_ID ),'999,999,999,999')
  2332. FROM PERFSTAT.STATS$SNAPSHOT),
  2333.    (SELECT TO_CHAR(MIN(SNAP_TIME),'Day, Month DD YYYY @ HH24:MI:SS')
  2334. FROM PERFSTAT.STATS$SNAPSHOT),
  2335.    (SELECT TO_CHAR(MAX(SNAP_TIME),'Day, Month DD YYYY @ HH24:MI:SS')
  2336. FROM PERFSTAT.STATS$SNAPSHOT),
  2337.    (SELECT TO_CHAR(COUNT(DISTINCT(STARTUP_TIME)),'999,999,999,999')
  2338. FROM PERFSTAT.STATS$SNAPSHOT)
  2339. ";
  2340.    $cursor = $dbh->prepare($sql);
  2341.    $cursor->execute;
  2342.    ($snap_count,$min_snap,$max_snap,$db_bounces) = $cursor->fetchrow_array;
  2343.    $cursor->finish;
  2344.    logit("   #Snap records = $snap_count");
  2345.    text("You have $snap_count snapshots available for analyzation spanning $db_bounces database startups.<BR>Oldest snapshot is $min_snap: Most recent is $max_snap.");
  2346.    text("Oracle Statspack functions.");
  2347.    Button("$scriptname?database=$database&object_type=STATSPACKADMIN&command=snapshot TARGET=body","Execute a snapshot","$headingcolor","CENTER","200");
  2348.    Button("$scriptname?database=$database&object_type=STATSPACKADMIN&command=statsgroups TARGET=body","Snapshot analyzation / admin","$headingcolor","CENTER","200");
  2349.    logit("Exit subroutine statsPackMenu");
  2350. }
  2351. sub rollbackMenu {
  2352.    logit("Enter subroutine rollbackMenu");
  2353.    Button("$scriptname?database=$database&object_type=SHOWROLLBACKS&command=recentbackup TARGET=body","Rollback segment information","$headingcolor","CENTER","200");
  2354.    Button("$scriptname?database=$database&object_type=SHOWTRANSACTIONS&command=recentbackup TARGET=body","Transaction information","$headingcolor","CENTER","200");
  2355.    logit("Exit subroutine rollbackMenu");
  2356. }
  2357. sub backupMenu {
  2358.    logit("Enter subroutine backupMenu");
  2359.    if (backupsFound() && rmanCatalogExists()) {
  2360.       logit("   This database is backed up by RMAN and has a RMAN catalog.");
  2361.       Button("$scriptname?database=$database&object_type=RMANBACKUPS&command=recentbackup TARGET=body","RMAN info via controlfiles","$headingcolor","CENTER","200");
  2362.       Button("$scriptname?database=$database&object_type=RMANCATALOGQUERY TARGET=body","RMAN info via catalog","$headingcolor","CENTER","200");
  2363.       return(0);
  2364.    } elsif (backupsFound()) {
  2365.       logit("   This database is backed up by RMAN, but has no RMAN catalog(s).");
  2366.       rmanBackups("menu");
  2367.    } elsif (rmanCatalogExists()) {
  2368.       logit("   This database is not backed up by RMAN, but has a RMAN catalog.");
  2369.       rmanCatalogQuery();
  2370.    } else {
  2371.       logit("   This database is not backed up by RMAN, nor does it have any RMAN catalogs.");
  2372.       message("This database is not backed up using RMAN.");
  2373.       message("This database contains no RMAN backup catalogs.");
  2374.    }
  2375.    logit("Exit subroutine backupMenu");
  2376. }
  2377. sub perfMenu {
  2378.    logit("Enter subroutine perfMenu");
  2379.    print "</CENTER></FONT>n";
  2380.    Button("$scriptname?database=$database&object_type=PERFORMANCE TARGET=body","Memory allocation & resources","$headingcolor","CENTER","200");
  2381.    Button("$scriptname?database=$database&object_type=SQLAREALIST TARGET=body","Shared SQL area","$headingcolor","CENTER","200");
  2382.    logit("Exit subroutine perfMenu");
  2383. }
  2384. sub sessionMenu {
  2385.    logit("Enter subroutine sessionMenu");
  2386.    print "</CENTER></FONT>n";
  2387.    Button("$scriptname?database=$database&object_type=SESSIONS TARGET=body","Detailed session listing","$headingcolor","CENTER","200");
  2388.    Button("$scriptname?database=$database&object_type=TOPSESSIONS TARGET=body","Top sessions","$headingcolor","CENTER","200");
  2389.    logit("Exit subroutine sessionMenu");
  2390. }
  2391. sub auditMenu {
  2392.    logit("Enter subroutine auditMenu");
  2393.    print "</CENTER></FONT>n";
  2394.    Button("$scriptname?database=$database&object_type=AUDITADMIN&command=schemaobjects TARGET=body","Schema object auditing","$headingcolor","CENTER","200");
  2395.    Button("$scriptname?database=$database&object_type=ENTERAUDITS&command=statementobjects TARGET=body","SQL statement auditing","$headingcolor","CENTER","200");
  2396.    Button("$scriptname?database=$database&object_type=ENTERAUDITS&command=systemobjects TARGET=body","System privilege auditing","$headingcolor","CENTER","200");
  2397.    Button("$scriptname?database=$database&object_type=AUDITLIST TARGET=body","Remove audits","$headingcolor","CENTER","200");
  2398.    Button("$scriptname?database=$database&object_type=AUDITING TARGET=body","Display auditing records","$headingcolor","CENTER","200");
  2399.    logit("Exit subroutine auditMenu");
  2400. }
  2401. sub prefMenu {
  2402.    logit("Enter subroutine prefMenu");
  2403.    print "</FONT>n";
  2404.    Button("$scriptname?database=$database&object_type=SHOWPROPS TARGET=body","Fonts etc.","$headingcolor","CENTER","200");
  2405.    Button("$scriptname?database=$database&object_type=SHOWTHEMES TARGET=body","Themes","$headingcolor","CENTER","200");
  2406.    logit("Exit subroutine prefMenu");
  2407. }
  2408. sub taskMenu {
  2409.    logit("Enter subroutine taskMenu");
  2410.    my $count;
  2411.    print "</FONT>n";
  2412.    text("Database administration");
  2413.    if (checkPriv("CREATE USER")) {
  2414.       Button("$scriptname?database=$database&object_type=ENTERCREATEUSER TARGET=body","User administration","$headingcolor","CENTER","200");
  2415.    } else {
  2416.       Button("","User administration","$headingcolor","CENTER","200");
  2417.       $count++;
  2418.    }
  2419.    
  2420.    if (checkPriv("ALTER SYSTEM")) {
  2421.       Button("$scriptname?database=$database&object_type=SESSIONLIST TARGET=body","Session administration","$headingcolor","CENTER","200");
  2422.    } else {
  2423.       Button("","Session administration","$headingcolor","CENTER","200");
  2424.       $count++;
  2425.    }
  2426.    if ( Auditing()) {
  2427.       if (checkPriv("AUDIT ANY")) {
  2428.          Button("$scriptname?database=$database&object_type=AUDITMENU TARGET=body","Auditing administration","$headingcolor","CENTER","200");
  2429.       } else {
  2430.          Button("","Auditing administration","$headingcolor","CENTER","200");
  2431.          $count++;
  2432.       }
  2433.    }
  2434.    if (checkPriv("ALTER ROLLBACK SEGMENT")) {
  2435.       Button("$scriptname?database=$database&object_type=RBSLIST TARGET=body","Rollback segment administration","$headingcolor","CENTER","200");
  2436.    } else {
  2437.       Button("","Rollback segment administration","$headingcolor","CENTER","200");
  2438.       $count++;
  2439.    }
  2440.    Button("$scriptname?database=$database&object_type=ENTERDDLTABLES TARGET=body","Generate table DDL","$headingcolor","CENTER","200");
  2441. #   Button("$scriptname?database=$database&object_type=ENTERDEPENDENCYOBJECT TARGET=body","List dependencies for an object","$headingcolor","CENTER","200");
  2442.    if (checkPriv("ALTER ANY PROCEDURE")) {
  2443.       Button("$scriptname?database=$database&object_type=OBJECTADMIN TARGET=body","Invalid object administration","$headingcolor","CENTER","200");
  2444.    } else {
  2445.       Button("","Object administration","$headingcolor","CENTER","200");
  2446.       $count++;
  2447.    }
  2448. #   if (checkPriv("CREATE TABLESPACE")) {
  2449. #      Button("$scriptname?database=$database&object_type=CREATETABLESPACE TARGET=body","Create tablespace","$headingcolor","CENTER","200");
  2450. #   }
  2451.    text("Database reports");
  2452.    Button("$scriptname?database=$database&object_type=USERSPACEREPORT TARGET=body","Space report by user","$headingcolor","CENTER","200");
  2453.    Button("$scriptname?database=$database&object_type=TSSPACEREPORT TARGET=body","Space report by tablespace / user","$headingcolor","CENTER","200");
  2454.    Button("$scriptname?database=$database&object_type=FILEFRAGREPORT TARGET=body","Datafile fragmentation report","$headingcolor","CENTER","200");
  2455.    Button("$scriptname?database=$database&object_type=ENTEREXTENTREPORT TARGET=body","Object extent report","$headingcolor","CENTER","200");
  2456.    $username = uc($username);
  2457.    message("<CENTER>You ($username) do not have authority to enter one or more of the DBA areas.") if $count;
  2458.    logit("Exit subroutine taskMenu");
  2459. }
  2460. sub objectAdmin {
  2461.    logit("Enter subroutine objectAdmin");
  2462.    invalidObjectList();
  2463.    logit("Exit subroutine objectAdmin");
  2464. }
  2465. sub auditAdmin {
  2466.    my $command = $query->param('command');
  2467.    logit("Enter subroutine auditAdmin");
  2468.    my ($sql,$text,$link,$infotext,$cols,$checkbox,$target,$submittext);
  2469.    $sql         = "SELECT USERNAME FROM DBA_USERS ORDER BY USERNAME";
  2470.    $text        = "Schema object auditing: Select one or more users to set auditing options.";
  2471.    $link        = "";
  2472.    $infotext    = "";
  2473.    $cols        = $schema_cols;
  2474.    $checkbox    = "Yep";
  2475.    $target      = "ENTERAUDITS";
  2476.    $submittext  = "Choose audit options";
  2477.    $command     = "$command";
  2478.    DisplayColTable($sql,$text,$link,$infotext,$cols,$checkbox,$target,$submittext,$command);
  2479.    logit("Exit subroutine auditAdmin");
  2480. }
  2481. sub enterAudits {
  2482.    logit("Enter subroutine enterAudits");
  2483.    my ($sql,$cursor,$privilege,@statement_options,@system_privs);
  2484.    my ($foo,@users,@sqlusers,$username,@params,$param,$count);
  2485.    my ($tables,$views,$sequences,$procedures,$functions,$packages);
  2486.    my ($libraries,$directories,$owner,$object_name,$command);
  2487.    my ($statement_option);
  2488.    $command = $query->param('command');
  2489.    # Get a list of the usernames passed
  2490.    @params = $query->param;
  2491.    if ($command eq "systemobjects") {
  2492.       message("System privilege auditing.<BR>Multiple statements and users may be selected by holding down the &lt;CTRL&gt; key. The statement options you choose will be set for all users that you have highlighted.");
  2493.          print <<"EOF";
  2494. </CENTER>
  2495. <FORM METHOD=POST ACTION=$scriptname>
  2496.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2497.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2498.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2499.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2500.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="dostatementaudits">
  2501.   <B>AUDIT&nbsp;
  2502.   <SELECT SIZE=5 NAME=privilege MULTIPLE>
  2503. EOF
  2504.       $sql = "$copyright
  2505. SELECT 
  2506.    DISTINCT PRIVILEGE
  2507. FROM DBA_SYS_PRIVS
  2508.    WHERE PRIVILEGE NOT LIKE '% ANY %'
  2509. ORDER BY PRIVILEGE
  2510. ";
  2511.       $cursor = $dbh->prepare($sql);
  2512.       $cursor->execute;
  2513.       while ($privilege = $cursor->fetchrow_array) {
  2514.          print "<OPTION>$privilegen";
  2515.       }
  2516.       $cursor->finish;
  2517.       print "</SELECT>nBY&nbsp;<SELECT SIZE=5 NAME=users MULTIPLE>";
  2518.       $sql = "$copyright
  2519. SELECT 
  2520.    USERNAME
  2521. FROM DBA_USERS
  2522.    ORDER BY USERNAME
  2523. ";
  2524.       $cursor = $dbh->prepare($sql);
  2525.       $cursor->execute;
  2526.       while ($username = $cursor->fetchrow_array) {
  2527.          print "<OPTION>$usernamen";
  2528.       }
  2529.       $cursor->finish;
  2530.       print <<"EOF";
  2531.   </SELECT>
  2532.   <BR>
  2533.   BY&nbsp;
  2534.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2535.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2536.   <BR>
  2537.   WHENEVER&nbsp;
  2538.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2539.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2540.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2541. </FORM>
  2542. EOF
  2543.    }
  2544.    if ($command eq "statementobjects") {
  2545.          @statement_options = (
  2546. "CLUSTER",
  2547. "DATABASE LINK",
  2548. "DIRECTORY",
  2549. "INDEX",
  2550. "NOT EXISTS",
  2551. "PROCEDURE",
  2552. "PROFILE",
  2553. "PUBLIC DATABASE LINK",
  2554. "PUBLIC SYNONYM",
  2555. "ROLE",
  2556. "ROLLBACK SEGMENT",
  2557. "SEQUENCE",
  2558. "SESSION",
  2559. "SYNONYM",
  2560. "SYSTEM AUDIT",
  2561. "SYSTEM GRANT",
  2562. "TABLE",
  2563. "TABLESPACE",
  2564. "TRIGGER",
  2565. "USER",
  2566. "VIEW",
  2567. "ALTER SEQUENCE",
  2568. "ALTER TABLE",
  2569. "COMMENT TABLE",
  2570. "DELETE TABLE",
  2571. "EXECUTE PROCEDURE",
  2572. "GRANT DIRECTORY",
  2573. "GRANT PROCEDURE",
  2574. "GRANT SEQUENCE",
  2575. "GRANT TABLE",
  2576. "INSERT TABLE",
  2577. "LOCK TABLE",
  2578. "SELECT SEQUENCE",
  2579. "SELECT TABLE",
  2580. "UPDATE TABLE"
  2581.    );
  2582.       message("SQL statement auditing.<BR>Multiple statements and users may be selected by holding down the &lt;CTRL&gt; key. The statement options you choose will be set for all users that you have highlighted.");
  2583.          print <<"EOF";
  2584. </CENTER>
  2585. <FORM METHOD=POST ACTION=$scriptname>
  2586.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2587.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2588.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2589.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2590.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="dostatementaudits">
  2591.   <B>AUDIT&nbsp;
  2592.   <SELECT SIZE=5 NAME=privilege MULTIPLE>
  2593. EOF
  2594.       foreach $statement_option (@statement_options) {
  2595.          print "<OPTION>$statement_optionn";
  2596.       }
  2597.       print "</SELECT>nBY&nbsp;<SELECT SIZE=5 NAME=users MULTIPLE>";
  2598.       $sql = "$copyright
  2599. SELECT 
  2600.    USERNAME FROM DBA_USERS
  2601. ORDER BY USERNAME
  2602. ";
  2603.       $cursor = $dbh->prepare($sql);
  2604.       $cursor->execute;
  2605.       while ($username = $cursor->fetchrow_array) {
  2606.          print "<OPTION>$usernamen";
  2607.       }
  2608.       $cursor->finish;
  2609.       print <<"EOF";
  2610.   </SELECT>
  2611.   <BR>
  2612.   BY&nbsp;
  2613.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2614.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2615.   <BR>
  2616.   WHENEVER&nbsp;
  2617.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2618.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2619.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2620. </FORM>
  2621. EOF
  2622.    }
  2623.    if ($command eq "schemaobjects") {
  2624.       foreach $param(@params) {
  2625.          if ($param =~ /checked~/) {
  2626.             $count++;
  2627.             ($foo,$username) = split("~", $param);
  2628.             push @users, $username;
  2629.             push @sqlusers, "'$username'";
  2630.             logit("   Username = $username");
  2631.          }
  2632.       }
  2633.       logit("   Number of users passed: $count");
  2634.       unless ($count) {
  2635.          message("You must select at least one user!");
  2636.          footer();
  2637.       }
  2638.       # Join the usernames to be suitable for a "IN"
  2639.       # clause.
  2640.       @sqlusers = join(",", @sqlusers);
  2641.       logit("   Users     = @users");
  2642.       logit("   SQL Users = @sqlusers");
  2643.       message("Schema object auditing.<BR>Multiple object names may be selected by holding down the &lt;CTRL&gt; key. The auditing options you choose will be set for all objects that you have highlighted.");
  2644.       # Find out how many of each auditable object
  2645.       # We have to work with. Snapshots are not
  2646.       # included here, as they don't seem to have
  2647.       # an object type# associated with them. 
  2648.          $sql = "$copyright
  2649. SELECT
  2650.    COUNT(DECODE(TYPE, 2, OBJ#, '')) "Table",
  2651.    COUNT(DECODE(TYPE, 4, OBJ#, '')) "View`",
  2652.    COUNT(DECODE(TYPE, 6, OBJ#, '')) "Sequence",
  2653.    COUNT(DECODE(TYPE, 7, OBJ#, '')) "Procedure",
  2654.    COUNT(DECODE(TYPE, 8, OBJ#, '')) "Function",
  2655.    COUNT(DECODE(TYPE, 9, OBJ#, '')) "Package",
  2656.    COUNT(DECODE(TYPE, 22, OBJ#, '')) "Library",
  2657.    COUNT(DECODE(TYPE, 23, OBJ#, '')) "Directory"
  2658. FROM SYS.OBJ$
  2659.    WHERE OWNER# IN
  2660. (
  2661. SELECT USER_ID
  2662.    FROM DBA_USERS
  2663. WHERE USERNAME IN (@sqlusers)
  2664. )
  2665. " if $oracle7;
  2666.          $sql = "$copyright
  2667. SELECT
  2668.    COUNT(DECODE(TYPE#, 2, OBJ#, '')) "Table",
  2669.    COUNT(DECODE(TYPE#, 4, OBJ#, '')) "View`",
  2670.    COUNT(DECODE(TYPE#, 6, OBJ#, '')) "Sequence",
  2671.    COUNT(DECODE(TYPE#, 7, OBJ#, '')) "Procedure",
  2672.    COUNT(DECODE(TYPE#, 8, OBJ#, '')) "Function",
  2673.    COUNT(DECODE(TYPE#, 9, OBJ#, '')) "Package",
  2674.    COUNT(DECODE(TYPE#, 22, OBJ#, '')) "Library",
  2675.    COUNT(DECODE(TYPE#, 23, OBJ#, '')) "Directory"
  2676. FROM SYS.OBJ$
  2677.    WHERE OWNER# IN
  2678. (
  2679. SELECT USER_ID
  2680.    FROM DBA_USERS
  2681. WHERE USERNAME IN (@sqlusers)
  2682. )
  2683. " if $oracle8;
  2684.       $cursor=$dbh->prepare($sql);
  2685.       $cursor->execute;
  2686.       ($tables,$views,$sequences,$procedures,$functions,$packages,$libraries,$directories) = $cursor->fetchrow_array;
  2687.       $cursor->finish;
  2688.       logit("   Tables - $tables: Views - $views: Sequences - $sequences: Procedures - $procedures: Functions - $functions: Packages - $packages: Libraries - $libraries: Directories - $directories");
  2689.       # Start cycling through the object types, displaying them
  2690.       # if any exist for any of the selected schemas.
  2691.       if ($tables) {
  2692.          text("Audit table objects.");
  2693.          $sql = "$copyright
  2694. SELECT 
  2695.    OWNER,
  2696.    TABLE_NAME
  2697. FROM DBA_TABLES
  2698.    WHERE OWNER IN (@sqlusers)
  2699. ORDER BY OWNER, TABLE_NAME
  2700. ";
  2701.          print <<"EOF";
  2702. </CENTER>
  2703. <FORM METHOD=POST ACTION=$scriptname>
  2704.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2705.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2706.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2707.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2708.   <B>AUDIT&nbsp;
  2709.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2710.   <INPUT TYPE="CHECKBOX" NAME="audit~ALTER">Alter,
  2711.   <INPUT TYPE="CHECKBOX" NAME="audit~AUDIT">Audit,
  2712.   <INPUT TYPE="CHECKBOX" NAME="audit~COMMENT">Comment,
  2713.   <INPUT TYPE="CHECKBOX" NAME="audit~DELETE">Delete,
  2714.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant,
  2715.   <INPUT TYPE="CHECKBOX" NAME="audit~INDEX">Index,
  2716.   <INPUT TYPE="CHECKBOX" NAME="audit~INSERT">Insert,
  2717.   <INPUT TYPE="CHECKBOX" NAME="audit~LOCK">Lock,
  2718.   <INPUT TYPE="CHECKBOX" NAME="audit~RENAME">Rename,
  2719.   <INPUT TYPE="CHECKBOX" NAME="audit~SELECT">Select,
  2720.   <INPUT TYPE="CHECKBOX" NAME="audit~UPDATE">Update
  2721.   <BR>
  2722.   ON&nbsp
  2723.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2724. EOF
  2725.          $cursor = $dbh->prepare($sql);
  2726.          $cursor->execute;
  2727.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2728.             print "<OPTION>$owner.$object_namen";
  2729.          }
  2730.          print <<"EOF";
  2731.   </SELECT>
  2732.   <BR>
  2733.   BY&nbsp;
  2734.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2735.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2736.   <BR>
  2737.   WHENEVER&nbsp;
  2738.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2739.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2740.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2741. </FORM>
  2742. <CENTER>
  2743. <P><HR WIDTH=90%><P>
  2744. EOF
  2745.       }
  2746.       if ($views) {
  2747.          text("Audit view objects.");
  2748.          $sql = "$copyright
  2749. SELECT
  2750.    OWNER,
  2751.    VIEW_NAME
  2752. FROM DBA_VIEWS
  2753.    WHERE OWNER IN (@sqlusers)
  2754. ORDER BY OWNER, VIEW_NAME
  2755. ";
  2756.          print <<"EOF";
  2757. </CENTER>
  2758. <FORM METHOD=POST ACTION=$scriptname>
  2759.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2760.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2761.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2762.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2763.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2764.   <B>AUDIT&nbsp;
  2765.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2766.   <INPUT TYPE="CHECKBOX" NAME="audit~AUDIT">Audit,
  2767.   <INPUT TYPE="CHECKBOX" NAME="audit~COMMENT">Comment,
  2768.   <INPUT TYPE="CHECKBOX" NAME="audit~DELETE">Delete,
  2769.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant,
  2770.   <INPUT TYPE="CHECKBOX" NAME="audit~INSERT">Insert,
  2771.   <INPUT TYPE="CHECKBOX" NAME="audit~LOCK">Lock,
  2772.   <INPUT TYPE="CHECKBOX" NAME="audit~RENAME">Rename,
  2773.   <INPUT TYPE="CHECKBOX" NAME="audit~SELECT">Select,
  2774.   <INPUT TYPE="CHECKBOX" NAME="audit~UPDATE">Update
  2775.   <BR>
  2776.   ON&nbsp
  2777.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2778. EOF
  2779.          $cursor = $dbh->prepare($sql);
  2780.          $cursor->execute;
  2781.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2782.             print "<OPTION>$owner.$object_namen";
  2783.          }
  2784.          print <<"EOF";
  2785.   </SELECT>
  2786.   <BR>
  2787.   BY&nbsp;
  2788.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2789.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2790.   <BR>
  2791.   WHENEVER&nbsp;
  2792.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2793.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2794.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2795. </FORM>
  2796. <CENTER>
  2797. <P><HR WIDTH=90%><P>
  2798. EOF
  2799.       }
  2800.       if ($sequences) {
  2801.          text("Audit sequence objects.");
  2802.          $sql = "$copyright
  2803. SELECT
  2804.    SEQUENCE_OWNER,
  2805.    SEQUENCE_NAME
  2806. FROM DBA_SEQUENCES
  2807.    WHERE SEQUENCE_OWNER IN (@sqlusers)
  2808. ORDER BY SEQUENCE_OWNER, SEQUENCE_NAME
  2809. ";
  2810.          print <<"EOF";
  2811. </CENTER>
  2812. <FORM METHOD=POST ACTION=$scriptname>
  2813.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2814.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2815.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2816.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2817.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2818.   <B>AUDIT&nbsp;
  2819.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2820.   <INPUT TYPE="CHECKBOX" NAME="audit~ALTER">Alter,
  2821.   <INPUT TYPE="CHECKBOX" NAME="audit~AUDIT">Audit,
  2822.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant,
  2823.   <INPUT TYPE="CHECKBOX" NAME="audit~RENAME">Rename
  2824.   <BR>
  2825.   ON&nbsp
  2826.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2827. EOF
  2828.          $cursor = $dbh->prepare($sql);
  2829.          $cursor->execute;
  2830.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2831.             print "<OPTION>$owner.$object_namen";
  2832.          }
  2833.          print <<"EOF";
  2834.   </SELECT>
  2835.   <BR>
  2836.   BY&nbsp;
  2837.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2838.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2839.   <BR>
  2840.   WHENEVER&nbsp;
  2841.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2842.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2843.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2844. </FORM>
  2845. <CENTER>
  2846. <P><HR WIDTH=90%><P>
  2847. EOF
  2848.       }
  2849.       if ($procedures || $packages || $functions) {
  2850.          text("Audit source objects.");
  2851.          $sql = "$copyright
  2852. SELECT
  2853.    OWNER,
  2854.    OBJECT_NAME
  2855. FROM DBA_OBJECTS
  2856.    WHERE OWNER IN (@sqlusers)
  2857.    AND OBJECT_TYPE IN ('PACKAGE','PROCEDURE','FUNCTION')
  2858. ORDER BY OWNER, OBJECT_NAME
  2859. ";
  2860.          print <<"EOF";
  2861. </CENTER>
  2862. <FORM METHOD=POST ACTION=$scriptname>
  2863.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2864.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2865.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2866.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2867.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2868.   <B>AUDIT&nbsp;
  2869.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2870.   <INPUT TYPE="CHECKBOX" NAME="audit~AUDIT">Audit,
  2871.   <INPUT TYPE="CHECKBOX" NAME="audit~EXECUTE">Execute,
  2872.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant,
  2873.   <INPUT TYPE="CHECKBOX" NAME="audit~RENAME">Rename
  2874.   <BR>
  2875.   ON&nbsp
  2876.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2877. EOF
  2878.          $cursor = $dbh->prepare($sql);
  2879.          $cursor->execute;
  2880.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2881.             print "<OPTION>$owner.$object_namen";
  2882.          }
  2883.          print <<"EOF";
  2884.   </SELECT>
  2885.   <BR>
  2886.   BY&nbsp;
  2887.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2888.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2889.   <BR>
  2890.   WHENEVER&nbsp;
  2891.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2892.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2893.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2894. </FORM>
  2895. <CENTER>
  2896. <P><HR WIDTH=90%><P>
  2897. EOF
  2898.       }
  2899.       if ($libraries) {
  2900.          text("Audit library objects.");
  2901.          $sql = "$copyright
  2902. SELECT 
  2903.    OWNER,
  2904.    LIBRARY_NAME
  2905. FROM DBA_LIBRARIES
  2906.    WHERE OWNER IN (@sqlusers)
  2907. ORDER BY OWNER, LIBRARY_NAME
  2908. ";
  2909.       print <<"EOF";
  2910. </CENTER>
  2911. <FORM METHOD=POST ACTION=$scriptname>
  2912.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2913.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2914.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2915.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2916.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2917.   <B>AUDIT&nbsp;
  2918.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2919.   <INPUT TYPE="CHECKBOX" NAME="audit~EXECUTE">Execute,
  2920.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant
  2921.   <BR>
  2922.   ON&nbsp
  2923.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2924. EOF
  2925.          $cursor = $dbh->prepare($sql);
  2926.          $cursor->execute;
  2927.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2928.             print "<OPTION>$owner.$object_namen";
  2929.          }
  2930.          print <<"EOF";
  2931.   </SELECT>
  2932.   <BR>
  2933.   BY&nbsp;
  2934.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2935.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2936.   <BR>
  2937.   WHENEVER&nbsp;
  2938.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2939.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2940.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2941. </FORM>
  2942. <CENTER>
  2943. <P><HR WIDTH=90%><P>
  2944. EOF
  2945.       }
  2946.       if ($directories) {
  2947.          text("Audit directory objects.");
  2948.          $sql = "$copyright
  2949. SELECT 
  2950.    OWNER,
  2951.    DIRECTORY_NAME
  2952. FROM DBA_DIRECTORIES
  2953.    WHERE OWNER IN (@sqlusers)
  2954. ORDER BY OWNER, DIRECTORY_NAME
  2955. ";
  2956.          print <<"EOF";
  2957. </CENTER>
  2958. <FORM METHOD=POST ACTION=$scriptname>
  2959.   <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  2960.   <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  2961.   <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  2962.   <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  2963.   <INPUT TYPE="HIDDEN" NAME="arg" VALUE="doschemaaudits">
  2964.   <B>AUDIT&nbsp;
  2965.   <INPUT TYPE="CHECKBOX" NAME="audit~ALL">All&nbsp;&nbsp;--
  2966.   <INPUT TYPE="CHECKBOX" NAME="audit~AUDIT">Audit,
  2967.   <INPUT TYPE="CHECKBOX" NAME="audit~GRANT">Grant,
  2968.   <INPUT TYPE="CHECKBOX" NAME="audit~READ">Read
  2969.   <BR>
  2970.   ON&nbsp
  2971.   <SELECT SIZE=5 NAME=object MULTIPLE>
  2972. EOF
  2973.          $cursor = $dbh->prepare($sql);
  2974.          $cursor->execute;
  2975.          while (($owner,$object_name) = $cursor->fetchrow_array) {
  2976.             print "<OPTION>$owner.$object_namen";
  2977.          }
  2978.          print <<"EOF";
  2979.   </SELECT>
  2980.   <BR>
  2981.   BY&nbsp;
  2982.   <INPUT TYPE="RADIO" NAME="by" VALUE="SESSION" CHECKED>session
  2983.   <INPUT TYPE="RADIO" NAME="by" VALUE="ACCESS">access
  2984.   <BR>
  2985.   WHENEVER&nbsp;
  2986.   <INPUT TYPE="CHECKBOX" NAME="whenever~SUCCESSFUL" CHECKED>successful
  2987.   <INPUT TYPE="CHECKBOX" NAME="whenever~NOTSUCCESSFUL" CHECKED>not successful
  2988.   <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Submit change">
  2989. </FORM>
  2990. <CENTER>
  2991. <P><HR WIDTH=90%><P>
  2992. EOF
  2993.       }
  2994.    }
  2995.    logit("Exit subroutine enterAudits");
  2996. }
  2997. sub schemaTableDDL {
  2998.    logit("Enter subroutine schemaTableDDL");
  2999.    my ($username,$sql,$cursor,$table_name);
  3000.    $username = $query->param('username');
  3001.    text("Select the tables you would like to reverse engineer: Schema $username");
  3002.    print <<"EOF";
  3003. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  3004.   <FORM METHOD=POST ACTION=$scriptname>
  3005.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  3006.     <INPUT TYPE="CHECKBOX" NAME="headertype" VALUE="octet"><B>Send DDL to your workstation<BR><BR>
  3007.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Generate DDL for marked tables"><BR><BR>
  3008.     <P>
  3009.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  3010.     <INPUT TYPE="HIDDEN" NAME="schema" VALUE="$schema">
  3011.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="TABLEDDL">
  3012.     <INPUT TYPE="HIDDEN" NAME="username" VALUE="$username">
  3013.   <TR>
  3014.     <TD WIDTH=100%>
  3015.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  3016.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  3017.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Table name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TH> 
  3018. EOF
  3019.    $sql = "$copyright
  3020. SELECT
  3021.    TABLE_NAME
  3022. FROM DBA_TABLES
  3023.    WHERE OWNER = '$username'
  3024. ";
  3025.    $cursor = $dbh->prepare($sql);
  3026.    $cursor->execute;
  3027.    while ($table_name = $cursor->fetchrow) {
  3028.       print <<"EOF";
  3029.         <TR>
  3030.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=reverse~$table_name></TD>
  3031.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$table_name</TD>
  3032.         </TR>
  3033. EOF
  3034.       }
  3035.    $cursor->finish;
  3036.    print <<"EOF";
  3037.       </TABLE>
  3038.     </TD>
  3039.   </TR>
  3040.   </FORM>
  3041. </TABLE>
  3042. EOF
  3043.    logit("Exit subroutine schemaTableDDL");
  3044. }
  3045. sub invalidObjectList {
  3046.    logit("Enter subroutine invalidObjectList");
  3047.    my ($username,$sql,$cursor,$owner,$object_type,$object_name,$object_id);
  3048.    my ($count);
  3049.    $username = shift;
  3050.    $sql = "$copyright
  3051. SELECT COUNT(*)
  3052.    FROM DBA_OBJECTS
  3053. WHERE STATUS = 'INVALID'
  3054. ";
  3055.    $sql = "$copyright
  3056. SELECT COUNT(*)
  3057.    FROM DBA_OBJECTS
  3058. WHERE OWNER = '$username'
  3059. AND STATUS = 'INVALID'
  3060. " if ($username);
  3061.    $cursor = $dbh->prepare($sql);
  3062.    $cursor->execute;
  3063.    $count = $cursor->fetchrow_array;
  3064.    $cursor->finish;
  3065.    unless ($count) {
  3066.       message("There are no invalid objects to compile");
  3067.       footer();
  3068.    }
  3069.    text("Select the objects you would like to compile.n");
  3070.    $sql = "$copyright
  3071. SELECT
  3072.    OWNER,
  3073.    OBJECT_TYPE,
  3074.    OBJECT_NAME,
  3075.    A.OBJECT_ID
  3076. FROM
  3077.    DBA_OBJECTS A,
  3078.    SYS.ORDER_OBJECT_BY_DEPENDENCY B
  3079. WHERE
  3080.    A.OBJECT_ID = B.OBJECT_ID(+) AND
  3081. ";
  3082.    $sql .= "   OWNER = '$username' ANDn" if $username;
  3083.    $sql .= "
  3084.     STATUS = 'INVALID'
  3085.     ORDER BY
  3086.     DLEVEL DESC,
  3087.     OBJECT_TYPE,
  3088.     OBJECT_NAME
  3089. ";
  3090.    logit("   invalidObjectList SQL:n$sql");
  3091.    # Print the heading
  3092.    print <<"EOF";
  3093. <TABLE BORDER =0 BGCOLOR='$bordercolor' CELLPADDING=1 CELLSPACING=0>
  3094.   <FORM METHOD=POST ACTION=$scriptname>
  3095.     <FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>
  3096.     <INPUT TYPE="SUBMIT" NAME="foobar" VALUE="Compile marked objects">
  3097.     <P>
  3098.     <INPUT TYPE="HIDDEN" NAME="database" VALUE="$database">
  3099.     <INPUT TYPE="HIDDEN" NAME="object_type" VALUE="DBADMIN">
  3100.     <INPUT TYPE="HIDDEN" NAME="arg" VALUE="compile">
  3101.   <TR>
  3102.     <TD WIDTH=100%>
  3103.       <TABLE BORDER=0 CELLPADDING=2 CELLSPACING=1>
  3104.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Mark</TH>
  3105.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Owner</TH>
  3106.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Object type</TH>
  3107.         <TH BGCOLOR='$headingcolor' ALIGN=CENTER><FONT COLOR='$headingfontcolor' SIZE='$fontsize' FACE='$headingfont'>Name</TH>
  3108. EOF
  3109.    $cursor = $dbh->prepare($sql);
  3110.    $cursor->execute;
  3111.    while (($owner,$object_type,$object_name,$object_id) = $cursor->fetchrow) {
  3112.       print <<"EOF";
  3113.         <TR>
  3114.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'><INPUT TYPE=CHECKBOX NAME=compile_$object_id></TD>
  3115.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$owner</TD>
  3116.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$object_type</TD>
  3117.           <TD BGCOLOR='$cellcolor'><FONT COLOR='$fontcolor' SIZE='$fontsize' FACE='$font'>$object_name</TD>
  3118.         </TR>
  3119. EOF
  3120.       }
  3121.    $cursor->finish;
  3122.    print <<"EOF";
  3123.       </TABLE>
  3124.     </TD>
  3125.   </TR>
  3126.   </FORM>
  3127. </TABLE>
  3128. EOF
  3129.    logit("Exit subroutine invalidObjectList");
  3130. }
  3131. sub rbsList {
  3132.    logit("Enter subroutine rbsList");
  3133.    my ($sql,$cursor,$sql1,$cursor1,$id);
  3134.    my ($rbs,$owner,$tsname,$bytes,$init,$next,$extents,$max,$optimal,$status,$writes,$waits,$xacts);
  3135.    text("Rollbacks will shrink to OPTIMAL unless other value is specified.");
  3136.    $sql = "$copyright
  3137. SELECT
  3138.    A.SEGMENT_NAME,
  3139.    B.SEGMENT_ID,
  3140.    A.OWNER,
  3141.    A.TABLESPACE_NAME,
  3142.    B.STATUS,
  3143.    TO_CHAR(A.BYTES,'999,999,999,999'),
  3144.    TO_CHAR(A.INITIAL_EXTENT,'999,999,999,999'),
  3145.    TO_CHAR(A.NEXT_EXTENT,'999,999,999,999'),
  3146.    TO_CHAR(A.EXTENTS,'999,999,999,999'),
  3147.    TO_CHAR(A.MAX_EXTENTS,'999,999,999,999')
  3148. FROM DBA_SEGMENTS A, DBA_ROLLBACK_SEGS B
  3149.    WHERE A.SEGMENT_TYPE = 'ROLLBACK'
  3150.    AND A.SEGMENT_NAME = B.SEGMENT_NAME
  3151.    AND ( B.INSTANCE_NUM =
  3152.       ( SELECT VALUE FROM V$PARAMETER
  3153.            WHERE NAME = 'instance_number' )
  3154.          OR B.INSTANCE_NUM IS NULL )
  3155. ORDER BY A.SEGMENT_NAME, A.TABLESPACE_NAME