SQL HTML

日期: 2008-07-22 作者:Vasan Srinivasan翻译:April 来源:TechTarget中国 英文

我们公司里的开发者要求访问数据库,但是我不想让他们访问。相反,我用SQL*Plus HTML的生成功能为开发人员生成Web页面,并且调出了他们所需要的信息。我认为这种方法很好。 一般来说,在开始生成脚本时用Set Markup HTML ON,结束时用Set Markup HTML OFF,介于这两者之间的脚本就是标准的SQL脚本,包括具体的COLUMN的宽度和含有COLUMN语句的标题、COMPUTE SUM总计的数量等等。

set markup html on仅提供HTML表,并将SQL语句的输出文本置入表格格式中。虽然output输出功能看不见,你还是能用update功能。当然,……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

我们公司里的开发者要求访问数据库,但是我不想让他们访问。相反,我用SQL*Plus HTML的生成功能为开发人员生成Web页面,并且调出了他们所需要的信息。我认为这种方法很好。

一般来说,在开始生成脚本时用Set Markup HTML ON,结束时用Set Markup HTML OFF,介于这两者之间的脚本就是标准的SQL脚本,包括具体的COLUMN的宽度和含有COLUMN语句的标题、COMPUTE SUM总计的数量等等。set markup html on仅提供HTML表,并将SQL语句的输出文本置入表格格式中。虽然output输出功能看不见,你还是能用update功能。当然,你需要避免用到FEEDBACK, VERIFY和其他一些类似的语句,因为这些语句会扰乱HTML output功能。

我曾经举过一个例子,摘选的这个例子包括了大量有用的功能,但是我觉得它和带有Oracle 8.1.7.4的Unix环境没有什么不同。该应用程序是用来显示数据库在某一特定日期的检查结果,显示出来的一系列的数据通过CRON在数据库服务器上聚集。我将下列三个文件也算在内: HTML文件在Apache 里脱离Shell脚本,Shell脚本反过来又运行SQL脚本。许多SQL脚本都暴露在外,似乎是刚从各种动态视图中挑选出来的。通过在Shell脚本里生成SQL脚本, SQL脚本就变成了动态的。这些都是你无法想象到的。例如生成一个包括所有数据库的列表,所以用户能够选择他/她想检查的数据库!一个非常简单的例子:

HTML文件: healthcheck.html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

<HTML> <HEAD>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">

<META http-equiv="expires" content="Mon, 01 Jan 1970 00:00:00 GMT">

<META NAME="Author" CONTENT="Vasan">

<TITLE>Online Database Statistics</TITLE>

</HEAD>

 
  <BODY BGCOLOR="#ffffff"></body>

 
  <H2> Online Database Statistics </H2>

<TABLE BORDER=10>
  <TR>
  <TD>
  <form method=GET action="http://host/cgi-bin/hcheck.cgi" TARGET="_blank">
  <input type=submit value="Database Statistics">
  <TD>
  <selectname="DBNAME" ALIGN=LEFT>
  <option selected value=dbstring0" > Database zero
  <option value="dbstring1" > Database one
  <option value="dbstring2" > Database two
  </select>
  </TD>
  </form>
  </TD>
  </TR>
  </TABLE>
  </HTML> 

Shell脚本:hcheck.cgi

#!/bin/ksh

#

#ident "@(#)$Source$ $Revision$"

# The line below is a sample URL that will be generated by the HTML file

# http://<server-name>/cgi-bin/healthcheck.cgi?DBNAME=dbstring1

# The next four lines are actually in a central file which I include in each shell script

ORAENV_ASK=NO;export ORAENV_ASK

ORACLE_HOME=/opt/9ias/infrastructure;export ORACLE_HOME

PATH=PATH:/usr/local/bin:${ORACLE_HOME}/bin;export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib; export LD_LIBRARY_PATH


  TWO_TASK=$(echo ${QUERY_STRING} | sed "s/&DAY.*$//" | sed "s/DBNAME=//")

export TWO_TASK


  if [ "${TWO_TASK}" = "dbstring0" -o "${TWO_TASK}" = "dbstring1"  ]

then

   uid="/"

else

   exit 1

fi   # Do not allow the script to proceed if this is dbstring2

echo Content-type: text/plain

echo


  TMP_FILE="/tmp/$$.out"

 
  rm -f ${TMP_FILE}

 
  sqlplus ${uid} @healthcheck.sql ${TMP_FILE} > /dev/null

 
  if [ -f ${TMP_FILE} ]

then

   cat ${TMP_FILE}

   rm -f ${TMP_FILE}

else

   echo "No Records selected"

fi

rm -f ${TMP_FILE}

exit 0


  SQL script: healthcheck.sql
  set markup html on

set feedback off

spool &1


  set linesize 200

set pagesize 10000

set heading on

ttitle "Statistics on Buffer Hit Ratio"

select trunc((1-(sum(decode(name,’physical reads’,value,0))/ 

             (sum(decode(name,’db block gets’, value,0))+

    (sum(decode(name,’consistent gets’,value,0))))) 

              )* 100) "Buffer Hit Ratio" 

 from v$sysstat;   

column "logical_reads" format 99,999,999,999 

column "phys_reads" format 999,999,99999999 

column "phy_writes" format 999,999,999 

select a.value + b.value "logical_reads", 

                c.value   "phys_reads", 

                d.value   "phy_writes", 

               round(100 * ((a.value+b.value)-c.value) / (a.value+b.value)) 

from v$sysstat a, v$sysstat b, v$sysstat c, v$sysstat d 

where a.name = ’db block gets’ 

and   b.name = ’consistent gets’ 

and   c.name = ’physical reads’

and   d.name = ’physical writes’;  

ttitle "Statistics on Data Dictionary Hit Ratio"

 
  column "Data Dict. Gets"   format 999,999,999 

column "Data Dict. cache misses" format 999,999,999 

select sum(gets) "Data Dict. Gets", 

      sum(getmisses) "Data Dict. cache misses", 

      trunc((1-(sum(getmisses)/sum(gets)))*100) 

      "DATA DICT CACHE HIT RATIO" 

from v$rowcache; 
 

ttitle "Statistics on Library Cache Miss Ratio"

column "LIBRARY CACHE MISS RATIO" format 99.9999 

column "executions" format 999,999,999 

column "Cache misses while executing" format 999,999,999 

select sum(pins) "executions", sum(reloads) "Cache misses while executing", 

                (((sum(reloads)/sum(pins)))) "LIBRARY CACHE MISS RATIO" 

from v$librarycache;   

ttitle "Statistics on Library Cache"

 
  column "reloads" format 999,999,999 

select namespace, trunc(gethitratio * 100) "Hit ratio", 

trunc(pinhitratio * 100) "pin hit ratio", reloads "reloads" 

from v$librarycache;  

 
  spool off

set markup html off

exit

读者反馈:

Mohammed A: Vasan先生,你这种做似乎是官僚作风。我相信你没有任何理由不让开发人员使用数据库。如果你关心安全和性能,那你就想别的办法吧。1、你的这种想法将扰乱开发人员的工作。放手让他们干吧!2、你的这种政策也只会让他们知道密码而不是他们告诉你。IT管理的最好的办法之一就是——让专业人员来管理。

Raj P.:这一做法很矛盾:“我们的开发人员需要登录数据库,然而,我不喜欢让他们这样做。”这就像是鱼自由自在地在水里游,开发人员要登录数据库不受任何约束。

Dennis D.:我感觉我必须要防范Vasan。不懂数据库登录原则的开发人员能将你的数据库弄得一团糟。开发人员需要登录,我们应该给他们登录的帐号、登录密码和重要帐号而不是给DBA。你不能限制这些帐号,他们能创建临时表并且在短时间内即使不需要也会保留这个表。于是几年之后每个人都害怕弄丢这些彪,因为一些应用程序也许能在某些地方用到。开发人员能够创建反规范化表、没有primary key约束表(业务规则暗示要用primary keys约束)。他们能够创建带有存储参数的表。书写错误代码一件事,密码能够修改。创建有害的schema用户以及存储大量的行更难修改。

翻译

April
April

相关推荐