• SQL应用中级指南 Part4:(数据字典)


    (一)用视图从数据字典中获得信息

    数据字典简介
           每一种数据库都有它自己的数据字典(或系统目录)(在今天的介绍中这两个词我们都会使用)数据字典是在数据库环境中的一个系统区域,它包含着关于数据库成份的信息,数据字典中包括的信息如数据库设计、存储的SQL 代码、用户统计、数据库过程、数据库的增长情况和对数据库性能的统计。
           数据字典中包括有数据库设计信息的表,它们是由数据库设计语言(DDL) 如CREATETABLE 所创建的,这一部分的系统目录存储着基于表列和属性的信息、表的大小、表的权限和表的增长情况信息,其它的对象也存储在了数据字典中,如索引、触发机制、过程、包和视图。
           使用统计表可以给出对于特定的用户的数据库库联接和权限信息,权限主要可以分成两个部分:系统级权限和对象级权限。具有创建其它用户的权限是系统权限,但是访问表的权限属于对象权限,在数据库中也强制性地使用了任务来确保安全性,这些信息也都在数据字典中存储着。
           数据字典是数据库中众多有用工具之一,它是一种保证数据库组织的方法,而且特别像库存零售中的明细账,它是一种确保数据库完整性的机制。例如,当你创建表的时候,数据库是如何知道你所创建的表在数据库中是否有已经存在相同名字的呢?当你在创建一个查询从表中选择数据的时候,数据库又是如何知道你是否有访问这个表的权限的呢?数据字典是数据库的心脏,所以你应该知道如何去使用它。

    用户的数据字典
           最终用户,系统工程师和数据库管理员都在使用数据字典,那么他们是否对它了解呢?他们的访问是直接的还是间接的呢?
           最终用户,通常是为了他们而创建数据库的客户,是间接地访问系统的目录的。当一个用户尝试去登录数据库的时候,数据字典将会将该用户的名字密码和权限做为联接数据库的参考,数据库也会通过它来确定是否用户具有访问特定数据的权限,最终用户最常用的访问数据库的方法是通过前端应用程序。现在已经开发出了许多的图形用户界面工具可以允许让用户非常容易地构建SQL 语句,当登录到数据库中,前端应用程序会立即执行对数据字典的查询以定义用户可以访问的表,然后前端应用程序可能其于从数据字典中获得的数据来创建一个本地化的系统目录,用户则可以用这个本地化的目录来从他或想要查询的表中获得数据。
           系统工程师,是有着创建和设计数据库的模块,应用程序的开发以及应用程序的管理任务的用户。在一些公司中会使用另外一种称呼,如程序员,程序分析员,数据模块师来称呼他们的系统工程师。系统工程师是直接地使用数据字典来管理和开发过程的,当访问一个已经存在的工程的时候,访问也可以通过数据库前端应用程序,开发工具以及计算机工程帮助工具来获得,对于这些用户来说,常用的系统目录是查询处于他的计划组中的模块,查询应用任务及权限和查询模块开发情况的统计,在特定的计划中系统工程师也可以将数据字典应用于系统工程师的专用对象上。
           数据库管理员(DBAS)是数据字典中所定义的具有最大权限的用户。与其它的两组用户偶而也会使用系统目录不同,DBAS 将使用数据字典作为他们的日常工作,访问通常是通过查询的,但也可以通过数据库管理工具如ORACLE 的SERVER MANGER DBA。 使用数据字典中的信息来管理用户和资源以达到数据库优化运行的目的。
           如你所见,所有的数据库用户都需要使用数据字典,更为重要的是,关系型数据库系统没有数据字典就无法存在了。

    数据字典中的内容
           这一部分使用两种关系型数据库系统的系统目录:Oracle 和 Sybase 。尽管这两种数据库系统都有着他自己的特点,但是他们提供的功能是相同的。不要关心它们在名字上的不同,你只要明白数据字典的概念和它的内容就行了。
    Oracle 的数据字典
           由于每一个表都必须有一个所有者,系统目录在数据字典中的所有者是:SYS 。Oracle 的数据字典可以分为三个基本类:用户访问视图、DBA 视图、以及动态执行表,它也会以视图的形式出现。视图可以查询用户在数据字典中的用户账号信息,如权限和目录表的创建。DBA 可以帮助数据库管理员完成日常的工作,它允许DBA 来管理用户和数据库中的其它对象。在ORALCE 中的动态执行表也可以为DBA 所使用,并提供了对数据库的更深层的监视,这些视图提供了储如对过程的执行、对ROLLBACK 段的动态使用、内存的使用等储如此类的统计信息,动态执行表都以V$为前缀。
    Sybase 的数据字典
           与ORACLE 一样,Sybase 中系统表的所有者也是:SYS。该表可以被分为两个部分:系统表和数据库表。系统表只能为数据库所有者所拥有,这些表定义的对象,如表和索引为多个数据库所共有,另一部分表在Sybase SQL Server 中称为数据库表,这些表只与每个特定的数据库相关联。

    ORACLE 数据字典的内部结构
           这一部分的例子会告诉你如何从数据字典中获得信息以及如何将它应用于广大关系型数据库的用户,也就是:最终用户、系统工程师、和DBA。 ORACLE 数据字典中有大量的关于所有类型的数据库用户的表和视图,这是为什么我们要进一步研究ORACLE 数据字典的原因。
    用户视图
           用户视图是在数据字典中的可以为全部用户所拥有的视图,一个用户对其它的用户只有CREATE SESSION 的权限,所有的用户都是这样。
    你是谁?
           在进行对数据库的无穷尽的知识的探险之前,你应该确切地知道你是谁(在数据库中的字眼)和你能做什么。下边的两个例子中,给出两个表中的SELECT 语句,其中一个会告诉你你是谁,而另一个会告诉你可以使用哪些数据库。

    SELECT * FROM USER_USERS
    -- USERNAME USER_ID DEFAULT_TABLESPACE TEMPORARY TABLESPACE CREATED
    -- JSMITH   29      USERS              TEMP      14-MAR-97
    -- USER_USERS 视图可以告诉你你在 ORACLE 中的 ID 是如何设置的
    -- 它也可以显示其它用户的详细情况,以及对用户的统计.
    -- 默认的表大小,和临时表的大小也可以被显示
    -- 默认的 USER 的表的大小是指由该用户所创建的表的大小
    -- 临时表大小是对 JSMITH 所指定的进行排序和分组空间的大小
     
    SELECT * FROM ALL_USERS;
    -- USERNAME USER_ID CREATED
    -- SYS       0      01-JAN-97
    -- SYSTEM    5      01-JAN-97
    -- SCOTT     8      01-JAN-97
    -- JSMITH   10      14-MAR-97
    -- TJONES   11      15-MAR-97
    -- VJOHNSON 12      15-MAR-97
    -- 正如你在上边的查询结果中所看到的那样,你可以使用 ALL_USERS 视图
    -- 你可以看到所有存在于数据库中的用户,但是它不会给出像上边的那个视图那么详细的信息
    -- 因为,对于这一级用户来说是没有必要的,只有对于系统级用户才会需要更详细的信息

    你有哪些权限?
           现在你已经知道你是谁了,如果你可以知道你能做什么就太好了,有好几个视图都可以为你提供这样的信息。USER_SYS_PRIVS 视图和USER_ROLE_PRIVS 视图可以给你最为权威的信息。
           你可以使用USER_SYS_PRIVS 来查看系统的权限。切记,系统权限是指你对于特定数据库的整体权限,这些权限并不针对任何一个对象或对象集。

    SELECT * FROM USER_SYS_PRIVS;
    -- USERNAME PRIVILEGE ADM
    -- JSMITH   UNLIMITED TABLESPACE NO
    -- JSMITH   CREATE    SESSION NO
    -- JSMITH 已经被赋予了两种系统级权限除了获准的任务以外.
    -- 请注意第二部分创建会话(CREATE SESSION) 它包括 ORACLE 的标准任务CONNECT

           你可以使用USER_ROLE_PRIVS 视图来查看你在数据库中被允许的任务信息。数据库任务与系统任务非常相似,当任务为权限所许可之后可以将任务许可给该用户,切记,在任务中可能会有对象级权限。

    SELECT * FROM USER_ROLE_PRIVS;
    -- USERNAME GRANTED_ROLE ADM DEF OS_
    -- JSMITH   CONNECT      NO  YES NO
    -- JSMITH   RESOURCE     NO  YES NO
    -- USER_ROLE_PRIVS 视图可以让你查看允许你执行的任务
    -- 在早些时候曾经说过 CONNECT 包含在系统权限 CREATE SESSION 
    -- 与其它的权限一样,RESOURCE 也有为数不多的权限
    -- 你可以查看一下给予用户的缺省任务,用户不能将这些任务再给予其它的用户
    -- 这对于 ADM 来说非常重要,而且该任务也不能为操作系统所允许

    你可以访问哪些东西?
    现在你也许会问,我可以访问哪些内容呢?我已经知道了我是谁,我也知道了我的权限,但是我在哪里可以找到我的数据?你可以通常查看在数据字典中的不同的可用用户视图来回答这个问题。这一部分的内容对于一些视图来说很有帮助。
    也许最为基本的用户视图就是USER_CATALOG 了,它是一个表、视图、同义字、和当前所有的次序的简明目录。

    -- 这个例子中给出了为你所有的所有表和相关对象的清单
    SELECT * FROM USER_CATALOG;
     
    -- 出于简明的目的你也可以使用U SER_CATALOG 中的公共同义字
    SELECT * FROM CAT;
     
    -- 另外一个有用的视图是ALL_CATALOG 它可以让你看到其他人拥有的表
    SELECT * FROM ALL_CATALOG;
     
    -- 你可以使用 USER_OBJECTS 视图来获得关于用户所拥有对象的通用信息
    -- 如名字,类型数据的创建,数据的更新,以及对象的状态
    -- 在上一个查询中我们对每一个数据对象的创建进行了确认
    SELECT SUBSTR(OBJECT_TYPE,1,15) OBJECT_TYPE,SUBSTR(OBJECT_NAME,1,30) OBJECT_NAME,
    CREATED,STATUS FROM USER_OBJECTS  ORDER BY 1;
     
    -- 从 USER_TABLES 中可以选择非常多的有用信息,就看你想要知道什么,大部分的数据都是由存储信息组成
    SELECT TABLE_NAME, INITIAL_EXTENT, NEXT_EXTENT FROM USER_TABLES;
     
    -- 你又一次选择了只是你想得到的信息,在 ALL_TABLES 的许多附加列中也包含着有用的信息
    SELECT SUBSTR(OWNER,1,15) OWNER,SUBSTR(TABLE_NAME,1,25) TABLE_NAME,SUBSTR(TABLESPACE_NAME,1,13) TABLESPACE
    FROM ALL_TABLES;
     
    -- 作为一个数据库用户你可以通过查询 USER_SEGMENTS 视图来监视你的表和索引的增长情况
    -- 如同它的名字一样,USER_SEGMENTS 给你了关于每个段的信息,如存储信息等等
    -- 一个段可能会由一个表索引,ROLLBACK,簇,临时表,或缓存组成
    SELECT SUBSTR(SEGMENT_NAME,1,30) SEGMENT_NAME,SUBSTR(SEGMENT_TYPE,1,8) SEG_TYPE,
    SUBSTR(TABLESPACE_NAME,1,25) TABLESPACE_NAME,BYTES, EXTENTS 
    FROM USER_SEGMENTS ORDER BY EXTENTS DESC;
     
    -- 现在你已经知道了都有哪些表是你可以访问的,你也许会想知道对于每个表你都可以做什么
    -- 你的查询是否受限,或你有权限更新表的内容吗? 
    -- ALL_TAB_PRIVS 视图可以告诉你作为一个数据库用户你在每一个可以使用的表中的权限
    SELECT SUBSTR(TABLE_SCHEMA,1,10) OWNER,SUBSTR(TABLE_NAME,1,25) TABLE_NAME,PRIVILEGE
    FROM ALL_TAB_PRIVS;
     
    -- 当你创建一个对象的时候,如果你不想把它存于默认的地点,你通常需要知道你可以把它存放于何处
    -- ORACLE 的表空间是分散的,它们中的每一个都可以存储对象,每一个表空间都被分配了一定数据的磁盘空间
    -- 这要根据你的系统的可用性而定,磁盘空间通常是从数据管理员处获得的
    -- 下面的查询会给出你访问的表空间分配对象的初始大小和它们的下一个大小以及它们的状态
    SELECT SUBSTR(TABLESPACE_NAME,1,30) TABLESPACE_NAME,INITIAL_EXTENT,NEXT_EXTENT,PCT_INCREASE,STATUS
    FROM USER_TABLESPACES;
     
    -- 有些时候你需要对你访问的表空间知道得更多,那就是在底层生成一个表的时候
    -- 例如你需要知道你在表空间方面所受的限制,以使你可以更好地创建和组合你的对象
    SELECT SUBSTR(TABLESPACE_NAME,1,30) TABLESPACE_NAME,BYTES,MAX_BYTES FROM USER_TS_QUOTAS;

           所有的这些例子,给出的常规的用户如何从数据字典中取得有用的信息,这些视图只是存在于ORACLE 数据字典中的很少的一部分。

    数据库用户信息
           USER_USER 与 ALL_USER 视图将会给你最少的关于用户的信息。DBA 视图被称为DBA_USERS (它为SYS 所拥有)所有的关于所有用户的信息,前提是你有 DBA 规则或 SELECT_ANY_TABLE 权限。

    SELECT * FROM SYS.DBA_USERS;
    -- 当你选择了DBA_USERS 视图中的所有内容,你会看到对于每个用户来说至为重要的信息
    -- 这里的 PASSWORD 是经过加密处理的
    -- 这个视图是 DBA 管理其它用户的重要视图

    数据库安全
           在数据字典中有三个基本的视图与数据库安全相关,尽管想得到完整的信息你必须还要查阅其它相关的信息。这三个视图与数据库的规则、规则对用户的授权、以及系统权限对用户的授权相关。

    SELECT * FROM SYS.DBA_ROLES;
    -- 视图 DBA_ROLES 给出了所有在数据库中创建的规则的信息
    -- 它给出的规则的名字以及规则是否存在密码
     
    SELECT * FROM SYS.DBA_ROLE_PRIVS WHERE GRANTEE = 'newdoc';
    -- DBA_ROLE_PRIVS 给出的关于赋给用户的数据库规则的信息
    -- 第一列为被授权人,第二列显示了被授予的规则(对用户所授予的每一个规则都会占用表中的一个记录)
    -- ADM 列确定这个规则是否是允许的,也就是说该用户是否有权将该规则授予其它的用户
    -- 最后一列为默认,表明这个规则是否是用户的默认规则

    数据库对象
           数据库对象是DBA 所关心的又一个重要内容。在数据字典中有几个视图提供了有关数据库对象,如表和索引的信息,通过这些视图你可以获得常用的信息或详细的信息。

    SELECT * FROM SYS.DBA_CATALOG WHERE ROWNUM < 5;
    -- DBA_CATALOG 所做的事与 USER_CATALOG 是一样的只显示了所有者的表
    -- 与之相对比,USER_CATALOG 则用于显示当前用户的表
    -- 用 DBA_CATALOG 视图 DBA 可以快速地查看所有的表
     
    SELECT DISTINCT(OBJECT_TYPE) FROM SYS.DBA_OBJECTS;
    -- 在数据库的设计和开发时使用这个查询来发现数据库中都有哪些对象是非常好的
     
    SELECT SUBSTR(OWNER,1,8) OWNER,SUBSTR(TABLE_NAME,1,25) TABLE_NAME,
    SUBSTR(TABLESPACE_NAME,1,30) TABLESPACE_NAME
    FROM SYS.DBA_TABLES WHERE OWNER = 'NEWDOC';
    -- DBA_TABLES 视图给出了关于数据库表和大多数与存储有关的数据库对象的信息
     
    SELECT SUBSTR(TABLE_NAME,1,15) TABLE_NAME,SUBSTR(INDEX_NAME,1,30) INDEX_NAME,
    SUBSTR(COLUMN_NAME,1,15) COLUMN_NAME,COLUMN_POSITION
    FROM SYS.DBA_IND_COLUMNS
    WHERE TABLE_OWNER = 'NEWDOC' AND ROWNUM < 10 ORDER BY 1,2,3;
    -- 现在你已经选择在每一个表中的索引过的列并根据索引出现的次序进行了排序
     
    SELECT TABLESPACE_NAME, STATUS FROM SYS.DBA_TABLESPACES
    -- 上边的例子告诉了你当前有多少表空间处于在线状态也就是说它对于你来说是可用的
    -- 如果它是离线状态那么在它之中的数据库对象也就是表将是不可访问的

    数据库的生长
           有两个视图可以对管理数据库的生长情况进行控制。它们是 DBA_SEGMENTS 和 DBA_EXTENTS。

           DBA_SEGMENTS 提供了关于每一段或数据对象,如存储分配空间使用和扩展的信息,每次当表和索引的增长超过了预先的指定就会开始
    下一次的扩展,采用这种方法增长的表通常会有碎片的产生。

           DBA_EXTENTS 则给出每次扩展的信息。

    SELECT SUBSTR(SEGMENT_NAME,1,30) SEGMENT_NAME,SUBSTR(SEGMENT_TYPE,1,12) SEGMENT_TYPE,
    BYTES,EXTENTS FROM SYS.DBA_SEGMENTS WHERE OWNER = 'NEWDOC' AND ROWNUM < 5;
    -- 看一下从 DBA_SEGMENTS 的输出你可以很容易地通过 EXTENTS 的数字来确定增长最多的表的情况
     
    SELECT SUBSTR(OWNER,1,10) OWNER,SUBSTR(SEGMENT_NAME,1,30) SEGMENT_NAME,EXTENT_ID,BYTES
    FROM SYS.DBA_EXTENTS WHERE OWNER = 'NEWDOC' AND SEGMENT_NAME = 'T_QUALITY_TEXT' ORDER BY EXTENT_ID;
    -- 这个例子显示了该表每次的增长的 EXTEND_ID 和每次增长的字节大小情况
    -- 这里每次的增长只有64K 而且已经增长了24 次了
    -- 你也许应该重建数据库,并重新生成表,并增加 initial_extent 的大小以优化空间的使用

    空间分配
           ORACLE 是使用数据文件来分配数据库的空间的。空间在逻辑上以表空间的形式存在,但是它是以数据文件的物理形式存在于磁盘上的。在许多的解释器中在数据文件中也可直接包括数据,尽管这些文件以能会以其它的名字来引用。视图 DBA_DATA_FILES 可以让你看到表空间的实际分配。

    SELECT SUBSTR(TABLESPACE_NAME,1,25) TABLESPACE_NAME,SUBSTR(FILE_NAME,1,40) FILE_NAME,BYTES
    FROM SYS.DBA_DATA_FILES;
    -- 你现在可以看到在数据库中存在的每个表空间实际上被分配了多大的空间
    -- 注意数据库文件的名称与它所属的表空间是一一对应的

    可用空间
           DBA_FREE_SPACE 视图可以告诉你在每个表空间中还有多少自由的空间可以使用。

    SELECT TABLESPACE_NAME, SUM(BYTES) FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
    -- 上边的例子给出每个表空间的自由空间
    -- 如果你只是使用 SELECT 语句而没有使用 SUM 函数的话,你也会看到每一段的自由空间情况

    ROLLBACK 段
           为事务所预留的 ROLLBACK 区域对数据库的性能影响是非常大的,你需要知道有多少的 ROLLBACK 段是可用的。

    SELECT OWNER,SEGMENT_NAME FROM SYS.DBA_ROLLBACK_SEGS;
    -- 这个例子中通过运行一个简单的查询列出的所有ROLLBACK 段的名字,其实它还有更多的对你有用的数据

    动态执行视图
           ORACLE 的数据库管理经常会访问动态执行视图,因为它对提供了比其它的数据字典视图更为详细的对内部性能的量度。在DBA 视图中也包括了一些相同的信息,
    这些视图涉及到了相当多的细节,这里给出在数据字典中包括的大体上的信息。
    会话信息

    SELECT USERNAME, COMMAND, STATUS FROM V$SESSION WHERE USERNAME IS NOT NULL;
    -- NEWDOC 已经登录到了数据库中,并且对数据进行了选择命令,这可以从他执行了命令 3 看出来

    运行统计
           也可以对用户的会话进行执行统计。它比今天讨论的其它视图更加依赖于具体的解释器,执行的统计包括如数据库读写速率、对表的成功命中、系统全局区域的使用、内存缓冲的使用、ROLLBACK 的详细信息、事务、历史记录的详细信息、表的锁定、等待情况等,这几乎全是底层知识。

  • 相关阅读:
    uni-app 轮播图
    uni-app 头部及底部导航
    Eapp 创建项目及简单应用
    nodeJS学习笔记 express获得GET和POST请求参数
    Promise 之基础详细介绍
    动态代理个人理解
    springboot实现日志记录
    调节 alert confirm prompt 的位置
    打印日志文件
    Java正则速成秘籍(三)之见招拆招篇
  • 原文地址:https://www.cnblogs.com/SkySoot/p/2439644.html
Copyright © 2020-2023  润新知