77范文网 - 专业文章范例文档资料分享平台

资料 SQL语言(6)

来源:网络收集 时间:2018-12-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

用户只能删除自己建立的索引,但不能删除由另一个用户建立的索引。

需要指出的是:索引与视图一样不能修改,如果用户要修改它,则只能先删除它,然后再重新建立。

4、索引的自动引用

如果一个索引能适用于一个SQL命令,用户不必明显地标识出将使用什么索引以及为何使用,SQL*Plus将自动使用它。所以,用户甚至都不必记住索引是否存在?有什么样的索引。 只有当索引列在WHERE子句中出现,并且该列不被一个函数或一个表达式所修饰时,索引才可能被使用。ORACLE优化程序将确定一个SQL命令是否适于使用索引。 在以下情况下,ORACLE将不使用索引。 (1)不存在有WHERE子句;

(2)索引列被函数引用或出现在表达式中; (3)谓词中含有is null或is not null;

例如:下列的WHERE子句不可能使用索引: WHERE salary*12>1800

WHERE substr(peopname,1,2)='张' WHERE ''||peopname='沈晓华'

WHERE to_char(birthday,'Month dd,yyyy')='Janurary 14,1958' WHERE award is not null

而下列的WHERE子句有可能使用上索引: WHERE salary>150

WHERE peopname='沈晓华' WHERE peopname like '张%'

WHERE birthday=to_date(January 14,1956','Month dd,yyyy') WHERE award>=0

只要有可能,数据库也将使用多个索引,一般最多可达五个索引。 例如:如果在peopname列和deptcode列上分别建立了索引,则下面的WHERE 子句将使用两个索引:

WHERE peopname like '张%' AND deptcode='P20' 另外值得引起注意的是:如果用户所检索的行不多于总行数的百分之二十五时,使用索引可能会合算。所以如果确信所要检索的行比例较大, 则应该抑制索引的使用。抑制索引使用的最常用的方法是把数字加上零,把字符与空值相连接。 例如: peopcode+0=200 和 ''||peopname='沈晓华'等。

五、数据控制(DCL)

数据控制功能主要包括两个方面:一是控制用户对数据的存取权力(即数据的共享与安全保密性);二是控制数据的一致性和完整性。

(一) 数据的共享与安全

数据的共享指的是各用户之间相互使用数据,而数据安全性是指保护数据以防止不合法的使用,共享与安全构成了一对矛盾,但它们又是相互依存,数据库系统在数据共享与安全方面的处理是成功的。

1、数据库用户

只有合法的用户才能使用数据库,每个用户都有其唯一的用户名和口令,它们被存放在数据字典中,每当用户注册该用户名和口令时,数据库都要根据数据字典对其进行合法性检验。 创建用户的工作总是由数据库管理员(DBA)来做的。当DBA在创建一个新的数据库用户时,

可使用操作系统的用户名来创建一个自动注册的数据库用户,当该用户一旦向操作系统注册就能自动地向数据库注册,而无需再打入数据库用户名及口令。撤销用户也是由DBA用户来完成的。

尽管一个用户可能已被从数据字典中撤销,但该用户所建立的表、,视图、索引等仍然继续存在于数据库中,此时DBA及其它被授权的用户仍可继续访问这些表。如果该用户以后被重新创建,则他将重新拥有这些表。 数据库用户口令是可以改变的,如果由于某种理由用户需要改变口令,也可利用命令来完成。 2、用户数据访问的授权

数据库中,数据是按表的形式组织的,任何存取数据的操作都必须规定存取的是那些表、视图。一般来说,任何一个表、视图是由某个用户建立的,数据库能自动防止其它用户存取该用户拥有的表、视图,如果用户要使其它用户共享自己的表、视图或同义词,就必须对他们授予相应的存取权限。所以,在数据库中,所有数据是按用户划分的,各个用户一般不能存取别的用户的数据,如果要使各用户之间相互共享数据,他们就必须相互授予适当的权力。 为使其它用户能存取数据,用户可用GRANT命令给需要存取数据的用户授权, 该命令的形式如下:

GRANT 权限 ON 目标 TO 用户; 在这里,用户名是需要存取本用户数据的其它数据库用户的名字,目标是给予该用户存取的表名、视图名或同义词名。 权限是授予该用户对这些目标所能施加的操作。在数据库中,权限有以下几种:

* SELECT 该权限表示对表或视图中的数据有查询权力。 * INSERT 该权限表示对表或视图可以插入行。

* UPDATE 该权限表示对表或视图中的数据可以修改。 * DELETE 该权限表示对表或视图可以删除行 * ALTER 该权力表示对表中的列的定义可以改变 * INDEX 该权力表示对表可以建立索引 最简单的授权是对单个用户授予单个权力。

例7:给用户ZSY授予people表的selsct权力, GRANT select ON people To ZSY;

为了同时授予几种权限,可把各种权限用逗号分开。

例8:给用户GYL授予在department表中select、insert和update的权力,输入: GRANT select,insert,update ON department To GYL; 类似地,对多个用户授权也可以输入用逗号分隔的用户名。

例9:给数据库用户ZG和LXN授予在表people上的select和insert特权。 GRANT select,insert ON people TO ZG,LXN;

如果授予使用表的所有权力,不必列出所有权力,而只要使用all,保留字即可。 例10:给数据库用户ZG授予表people上的所有权力,输入: GRANT all NO people To ZG;

同理若对数据库中所有用户授权,也不必列出所有用户,而只要使用另一个保留字public即可,

当授予存取特权时,接受权力的用户,通常不具有把权力传递授予其它用户的权力。若要给予用户有传递授权,则需要使用WITH GRANT OPTION子句。

例:给数据库用户LXN授予对people表的select权力,并使他具有给其他用户授予相同权力的权力,

GRANT select ON people TO LXN WITH GRANT OPTION;

3、收回数据存取权力

有时,由于情况的变化,用户可能要收回一些已授给其他用户的权限,使用REVOKE命令就可以做到。该命令的形式如下:

REVOKE 权限 ON 目标 FROM 用户名; 当使用该命令时,就从指定的用户撤消了在指定表或视图上的指定权限,并且通过该用户传递授权的其它用户也被撤销权限。

例:从用户LXN收回对people表的所有权限,输入: REVOK all ON people FROM LXN;

注意:有时从某个用户收回某种权限后,该用户可能仍然拥有该种权限,这是因为已经授予了PUBCIC特权。如上例,虽然已从数据库用户LXN收回了对people 表的所有权力,但由于已授予public在people表上的select权力,所以,数据库用户LXN还会有select权限。 4、数据共享与保密的进一步讨论 大家已经看到,授权都是对表进行的。但是可能常常要授予其他用户只存取表中的某些行和某些列的权力。例如,可能要授予所有用户对people的大部份列具有select权力,但他们不应有salary列和award列的select权力。对于这个问题,可以用视图来解决。建立一个视图, 该视图包含要授权的那些行和列,然后对视图授权,而不是对表授权。

例:建立一个people的视图pub_peop,该视图不包含salary列和awary列,并给所有用户授予对该视图的select权力,输入: CREAT VIEW pub_peop as

SELECT peopcode,peopname,sex,birthday,workdate,job,deptcode FROM people;

GRANT select ON pub_peop To public;

由于可以对视图进行授权,所以实际上可以对任何行、任何列、甚至任何字段进行授权。 (二) 数据的一致性和完整性

1、逻辑工作单元──事务(transaction)

一个逻辑工作单元是被数据库当作单个实体来处理的SQL语句序列,逻辑工作单元也被称之为“事务”。数据库以逻辑工作单元为单位保证数据一致性。对每个逻辑工作单元,数据库保证其所有的操作全部完成(在数据库中完成改动) 或是没有任何操作发生。当一个事务正在处理中,若出现系统或用户程序失败,则数据库 在检测出错误后数据库被自动恢复到该事务开始之前的状态(有些错误可能要在数据库 关闭或重启动时恢复数据)。 例如,如果有笔款正从一个帐户扣除转加到另一个帐户上去,那么这两个更新操作就应该作为一个事务处理, 这样可保证这两个更新或是同时成功或是同时失败。假如将扣款当作一个事务,而加款看作另一个事务分别对它们进行处理,就有可能导致一个失败另一个成功,从而产生数据库数据的不一致。

一个事务可包含对数据库进行多种操作的一个完整的程序,也可以是只包含一个SQL更新语句。实际上,可以把一个用户程序的多个操作划分为多个事务,在这样的程序中,COMMIT命令和ROLLBACK用来结束一个事务并开始另一个事务。

每个事务开始于第一个可执行的SQL语句。当出现以下情况之一时,则撤消或结束一个事务:

* 调用COMMIT或ROLLBACK命令;

* 发生DDL命令(CREATE、DROP、ALTER等); * 发生错误或故障; * 从数据库退出; * 异常结束;

2、事务提交

COMMIT语句以明显方式提交当前事务中的所有操作,使之生效并结束当前事务。该语句的形式如下: COMMIT;

当以明显方式提交一个事务时,会引起以下操作:

(1)本事务在系统全局区的前映象缓冲区中尚未写入BI文件的块都被从缓冲区中强迫逐出。 (2)将系统全局区的数据缓冲区中最近修改过的块写进数据库。 (3)把该事务加上已完成标记

(4)如果不存在要求读一致性的用户(进程),则把BI文件中由本事务所用的块都加上可为其它事务重新使用的标记。 (5)释放表及行封锁。

在事务提交之前,本事务对数据库所作改变,用户自己可以在查询中看到,但其它用户在查询数据库时,却不能看到,如果用户改变了主意,要取消刚才的改变或须改正错误时,可将事务回退。

3、事务回退

所有程序的异常结束,都会撤销当前事务的所有操作,当用户要取消刚才所作的数据库改变时,也可以用明显的方式(ROLLBACK语句)回退,以便恢复数据库。该语句的形式如下: ROLLBACK;

4、隐式(自动)提交或回退

在大多数数据库产品中用户必须用COMMIT或ROLLBACK语句显式地提交或回退事务。某些SQL语句(DDL语句),会马上导致提交。如果你刚打入几个DML语句,又马上打入一个DDL语句,则该DDL 语句在其本身被执行之前就导致一次提交,从而结束当前事务。然后如果此DDL语句执行成功,则再次被提交。 在发生下列情况时事务被自动回退:

* 句中的某些错误(例如企图插入不正确记录)

* 执行时发现的错误(例如:向唯一索引的表中插入重复值,往数值列中插入非法数) * 发现死锁或异常终止时

注意:SQL语句中的语法错误并不会引起事务的回退。

5、数据库的锁。

所谓数据锁是指:当某个用户在对某些数据进行操作时,给这些数据加上锁,以限制其它用户对这些数据的存取。数据封锁是实现数据共享、控制并行处理、保证数据一致性的必要手段。

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库资料 SQL语言(6)在线全文阅读。

资料 SQL语言(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/369843.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: