数据库视图(oracle)
使用数据库视图通常出于以下两个目的:1。降低操作复杂度;视图是预编译的查询操作,一次定义,之后可快速调用;2。提高系统安全。视图作为数据库对象,可以将其权限独立出来赋给用户,可避免用户对基表的盲目危险操作,同时也可屏蔽一部分私密的属性列。
定义语句:
CREATE
[OR REPLACE
]
[FORCE
|NOFORCE
] VIEW
YOUR_VIEW_NAME
(COLNAME1,COLNAME2,COLNAME3,...,COLNAMEn)
AS
[YOUR_QUERY_STATEMENTS WILL WRITE HERE !]
[WITH CHECK OPTION
[CONSTRAINTNAME
constraint_name]]
[WITH READ ONLY
]
对视图的查询操作实际是运行建立视图的sql语句。所以当用户自己修改基表信息时,主表改变,查询视图时也同时输出最新的信息,这样做可以尽可能减少对数据库空间的占用,并且不需要同步操作。
视图也可进行DML操作,但是在操作时要注意以下原则:
条件一:在连接视图中不能有Order by排序语句。
这主要是因为采用了Order by排序语句后,记录的物理存储顺序发生了改变。此时,若在视图上进行了数据更新,则其对应的基础表找不到具体更改的物理位置。所以,会以失败告终。
类似的,也不能够在SQL语句中含有Group by、connetc
by等语句。若有这些语句的话,则数据库都不允许对数据进行数据更新操作。
条件二:基础表中所有的NOT NULL列都必须在这个视图中。
若想在视图上进行数据更新操作的话,则必须要求对应基础表中的所有不允许空的字段都在当前的视图中。其实这很好理解,若每个字段不允许为空,则又不在当前的视图中,则新增加记录的时候,这个字段就没有被赋值,故在保存时就会被基础表所拒绝。
另外,需要注意的是,无论是更新还是删除语句,若基础表中的某个非空列不在这个视图中,都无法进行更改。也许有人会问,如果用户不是增加记录,而只是更新
数据。那难道也要求在视图中包含所有的非空字段呢?答案是肯定的。因为数据库系统在提交更新事务之前就会对这个条件进行判断。
条件三:需要更新的列不是虚拟列。
在视图中,可能有些列的结果是通过列表达式定义的,在基础表中并不存在。我们
相关文档:
在Linux下安装Oracle Database 9i
2009年05月11日 星期一 20:49
http://www0.ccidnet.com/tech/guide/2001/11/20/58_3761.html
Oracle9i 2000年10月在Oracle Open World上发布,为 Oracle 数据库、应用服务器和开发工具引进了许多新功能。Oracle9i是业界第一个完整、简单的用于互联网的新一代智能化的、协作各种应用的软 ......
查看被锁的表
select p.spid,a.serial#,
c.object_name,b.session_id,b.oracle_username,b.os_user_name from
v$process p,v$session a, v$locked_object b,all_objects c
where p.addr=a.p ......
1 问题描述
oracle数据库在服务器上运行正常,但是不能通过网络连接(即使用客户端不能连接数据库,在服务器端正常,诊断的初步原因为监听器问题)。在服务器端使用以下命令:
bash-3.1$ cd $ORACLE_HOME/bin
bash-3.1$ ./lsnrctl
LSNRCTL> status
结果出现:
CONNECT (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=E ......
ORACLE触发CHECKPOINT的条件
1.当发生日志组切换的时候
2.当符合LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINT_INTERVAL,fast_start_io_target,fast_start_mttr_target参数设置的时候
3.当运行ALTER SYSTEM SWITCH LOGFILE的时候
4.当运行ALTER SYSTEM CHECKPOINT的时候
5.当运行alter tablespace XXX begin backup,e ......
因开发要求,需要对oracle里的数据与数据文件作比较。如采用客户端连接oracle的方式则显得小题大做,且工作量大,不易维护。直接采用存储过程,调用UTL_FILE包的公共过程,显得方便得多。
首先,需要把数据文件所在的目录注册到oracle中,用create directory。。。语句,然后把此目 ......