我们公司里的开发者要求访问数据库,但是我不想让他们访问。相反,我用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中国
我们公司里的开发者要求访问数据库,但是我不想让他们访问。相反,我用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用户以及存储大量的行更难修改。
翻译
相关推荐
-
Azure数据湖分析从U-SQL中获得提升
大数据的发展已经让许多精通SQL的数据专业人员不知所措。微软的U-SQL编程语言试图让这些人回归数据查询游戏。
-
TT百科:SQL(结构化查询语言)
一般来说,SQL-on-Hadoop仍是一项新兴技术,但随着各个公司寻求获得拥有大数据应用程序编程SQL技能的开发和分析人员,它们正逐渐成为Hadoop部署的固定组件。
-
SQL和NoSQL数据库设计之争
企业收集了很多大规模增长的松散结构化数据,Hadoop,Spark以及其他新技术处理这些数据非常有助于改善商业智能分析效率。
-
如何通过格式良好的SQL提高效率和准确性
格式良好的SQL并不会比乱七八糟的SQL运行效果更好。数据库其实不怎么关心SQL语句中你把逗号放到了字段名的前面还是后面。