友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第45部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
决这个问题你需要将 DBA 规则应用于 JSMITH 当然这必须要得到 DBA 的许可
数据库用户信息
USER_USER 与 ALL_USER 视图将会给你最少的关于用户的信息 DBA 视图被称为
DBA_USERS 它为 SYS 所拥有 所有的关于所有用户的信息 前提是你有 DBA 规则或
SELECT_ANY_TABLE 权限 如下例如示
INPUT
SQL》 SELECT * FROM SYS。DBA_USERS;
OUTPUT
USERNAME USER_ID PASSWORD DEFAULT_TABLESPACE
SYS 0 4012DA490794C16B SYSTEM
JSMITH 5 A4A94B17405C10B7 USERS
实际为一个表格 这里由于排版需要改为两个
USERNAME TEMPORARY_TABLESPACE CREATED PROFILE
SYS TEMP 06…JUN…96 DEFAULT
JSMITH TEMP 06…JUN…96 DEFAULT
分析
当你选择了 DBA_USERS 视图中的所有内容 你会看到对于每个用户来说至为重要的
信息 注意这里的 PASSWORD 是经过加密处理的 这个视图是 DBA 管理其它用户的重要
339
…………………………………………………………Page 340……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
视图
数据库安全
在数据字典中有三个基本的视图与数据库安全相关的 尽管想得到完整的信息你必须
还要查阅其它相关的信息 这三个视图与数据库的规则 规则对用户的授权以及系统权限
对用户的授权相关 这三个视图会在 DBA_ROLES DBA_ROLE_PRIVS 和DBA_SYS_PRIVS
这三个部分中介绍 下边的查询显示了如何去获得相关的数据库安全信息
INPUT
SQL》 SELECT * FROM SYS。DBA_ROLES;
OUTPUT
ROLE PASSWORD
CONNECT NO
RESOURCE NO
DBA NO
EXP_FULL_DATABASE NO
IMP_FULL_DATABASE NO
END_USER_ROLE NO
分析
视图 DBA_ROLES 给出了所有在数据库中创建的规则的信息 它给出的规则的名字以
及规则是否存在密码
INPUT
SQL》 SELECT *
2 FROM SYS。DBA_ROLE_PRIVS
3 WHERE GRANTEE = 'RJENNINGS'
GRANTEE GRANTED_ROLE ADM DEF
RJENNINGS CONNECT NO YES
RJENNINGS DBA NO YES
RJENNINGS RESOURCE NO YES
分析
DBA_ROLE_PRIVS 给出的关于赋给用户的数据库规则的信息 第一列为被授权人
第二列显示了被授予的规则 注意 对用户所授予的每一个规则都会占用表中的一个记录
340
…………………………………………………………Page 341……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
ADM 通过后边的 ADM 选项来确定这个规则是否是允许的 也就是说该用户是否有权将该
规则授予其它的用户 最后一列为默认 表明这个规则是否是用户的默认规则
分析
DBA_SYS_PRIVS 给了所有授予用户的系统权限 这个视图与 DBA_ROLE_PRIVS 视
图类似 你可以通过把系统权限授予规则来把这些系统权限包括在规则中 就像你是一个
用户一样
数据库对象
数据库对象是 DBA 所关心了又一个重要内容 在数据字典中有几个视图提供了有关
数据库对象如表和索引的信息 通常这些视图你可以获得常用的信息或详细的信息
INPUT
SQL》 SELECT *
2 FROM SYS。DBA_CATALOG
3 WHERE ROWNUM 《 5;
OUTPUT
OWNER TABLE_NAME TABLE_TYPE
SYS CDEF TABLE
SYS TAB TABLE
SYS IND TABLE
SYS CLU TABLE
分析
DBA_CATALOG 所做的事与 USER_CATALOG 是一样的 只显示了所有者的表 与
之相对比 USER_CATALOG 则用于显示当前用户的表 用 DBA_CATALOG 视图 DBA 可
以快速地查看所有的表
下边的查询给出了对于特定的数据库都存在哪种类型的对象
技巧 出于测试的目的你可以使用 ROWNUM 来限制查询返回特定数目的行 它与 ROWID
一样可以在任何数据库表和视图中使用
INPUT/OUTPUT
SQL》 SELECT DISTINCT(OBJECT_TYPE)
2 FROM SYS。DBA_OBJECTS;
341
…………………………………………………………Page 342……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
OBJECT_TYPE OBJECT_TYPE
CLUSTER PROCEDURE
DATABASE LINK SEQUENCE
FUNCTION SYNONYM
INDEX TABLE
PACKAGE TRIGGER
PACKAGE BODY VIEW
分析
在上边的查询中 DISTINCT 功能可以让存在于数据库中的对象只出现一次 在数据库
的设计和开发时使用这个查询来发现数据库中都有哪些对象是非常好的
DBA_TABLES 视图给出了关于数据库表和大多数与存储有关的数据库对象的信息
INPUT/OUTPUT
SQL》 SELECT SUBSTR(OWNER;1;8) OWNER;
2 SUBSTR(TABLE_NAME;1;25) TABLE_NAME;
3 SUBSTR(TABLESPACE_NAME;1;30) TABLESPACE_NAME
4 FROM SYS。DBA_TABLES
5 WHERE OWNER = 'JSMITH';
OWNER TABLE_NAME TABLESPACE_NAME
JSMITH MAGAZINE_TBL USERS
JSMITH HOBBY_TBL USERS
JSMITH ADDRESS_TBL SYSTEM
JSMITH CUSTOMER_TBL USERS
分析
除了 ADDRESS_TBL 以外 所有的表都在 USER 表空间中 ADDRESS_TBL 是在系
统表空间中的 因为这是唯一的一个你可能存储于系统表空间中的表 作为 DBA 需要知
道这件事 这个查询对你的帮助不小
JSMITH 应该马上把这个表移到其它符合条件的表空间中去
DBA_SYNONYMS 给出了所有存在于数据库中的同义字的清单 DBA_SYNONYMS
给出了所有数据库用户的同义字清单 与 USER_SYNONYMS 不同 — — 它只是给出了当前
用户私有的同义字
INPUT/OUTPUT
SQL》 SELECT SYNONYM_NAME;
342
…………………………………………………………Page 343……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
2 SUBSTR(TABLE_OWNER;1;10) TAB_OWNER;
3 SUBSTR(TABLE_NAME;1;30) TABLE_NAME
4 FROM SYS。DBA_SYNONYMS
5 WHERE OWNER = 'JSMITH';
SYNONYM_NAME TAB_OWNER TABLE_NAME
TRIVIA_SYN VJOHNSON TRIVIA_TBL
分析
下边的例子表时 JSMITH 有对 VJOHNSON 所有的 TRIVIA_TBL 表有一个名字叫
TRIVIA_SYN 的同义字
现在假设你想得到所有的 JSMITH 的表和索引的清单 你也许会写出像下边这样的查
询 它使用了 DBA_INDEXS
INPUT/OUTPUT
SQL》 SELECT SUBSTR(TABLE_OWNER;1;10) TBL_OWNER;
2 SUBSTR(TABLE_NAME;1;30) TABLE_NAME;
3 SUBSTR(INDEX_NAME;1;30) INDEX_NAME
4 FROM SYS。DBA_INDEXES
5 WHERE OWNER = 'JSMITH'
6 AND ROWNUM 《 5
7 ORDER BY TABLE_NAME;
TBL_OWNER TABLE_NAME INDEX_NAME
JSMITH ADDRESS_TBL ADDR_INX
JSMITH CUSTOMER_TBL CUST_INX
JSMITH HOBBY_TBL HOBBY_PK
JSMITH MAGAZINE_TBL MAGAZINE_INX
分析
像上边这样一个很容易的查询可以给出一个计划 工程 和与之相中所使用的表
INPUT/OUTPUT
SQL》 SELECT SUBSTR(TABLE_NAME;1;15) TABLE_NAME;
2 SUBSTR(INDEX_NAME;1;30) INDEX_NAME;
3 SUBSTR(COLUMN_NAME;1;15) COLUMN_NAME;
4 COLUMN_POSITION
343
…………………………………………………………Page 344……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
5 FROM SYS。DBA_IND_COLUMNS
6 WHERE TABLE_OWNER = 'JSMITH'
7 AND ROWNUM 《 10
8 ORDER BY 1;2;3
TABLE_NAME INDEX_NAME COLUMN_NAME COLUMN_POSITION
ADDRESS_TBL ADDR_INX PERS_ID 1
ADDRESS_TBL ADDR_INX NAME 2
ADDRESS_TBL ADDR_INX CITY 3
CUSTOMER_TBL CUST_INX CUST_ID 1
CUSTOMER_TBL CUST_INX CUST_NAME 2
CUSTOMER_TBL CUST_INX CUST_ZIP 3
HOBBY_TBL HOBBY_PK SAKEY 1
MAGAZINE_TBL MAGAZINE_INX ISSUE_NUM 1
MAGAZINE_TBL MAGAZINE_INX EDITOR 2
现在你已经选择一在每一个表中的索引过的列并根据索引出现的次序进行了排序 你
已经学习了表 但是如何才能更好地把握表呢 表空间比表和索引之类的对象更高级 表
空间是 ORACLE 为数据库分配空间的机制 要分配空间 你必须知道当前有多少空间可供
使用 你可以对 DBA_TABLESPACES 视图执行一个查询来查看所有的表空间以及它们的
状态 如下例所示
INPUT/OUTPUT
SQL》 SELECT TABLESPACE_NAME; STATUS
2 FROM SYS。DBA_TABLESPACES
TABLESPACE_NAME STATUS
SYSTEM ONLINE
RBS ONLINE
TEMP ONLINE
TOOLS ONLINE
USERS ONLINE
DATA_TS ONLINE
INDEX_TS ONLINE
分析
上边的例子告诉了你当前有多少表空间处于在线状态 也就是说它对于你来说是可用
的 如果它是离线状态 那么在它之中的数据库对象 也就是表 将是不可访问的
344
…………………………………………………………Page 345……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
那么对于 JSMITH 来说有多少配额可供他访问呢 也就是说 对于 JSMITH 来说他可
以使用多少空间来存储数据库对象呢
INPUT/OUTPUT
SQL》 SELECT TABLESPACE_NAME;
2 BYTES;
3 MAX_BYTES
4 FROM SYS。DBA_TS_QUOTAS
5 WHERE USERNAME = 'JSMITH'
TABLESPACE_NAME BYTES MAX_BYTES
DATA_TS 134111232 …1
INDEX_TS 474390528 …1
分析
JSMITH 对于可供他访问和使用的表空间是没有限制的 在这种情况下空间的使用是
本着先入为主的原则进行的 举例来说 如果 JSMITH 在 DATA_TS 中使用了所有的表空
间 那么其它的用户就不能在这里创建对象了
数据库的生长
在这一部分有两个视图可以对管理数据库的生长情况进行控制 它 们 是
DBA_SEGMENTS 和 DBA_EXTENTS DBA_SEGMENTS 提供了关于每一段或数据对象
如存储分配 空间使用和扩展的信息 每次当表和索引的增长超过了预先的指定就会开始
下一次的扩展 采用这种方法增长的表通常会有碎片的产生 DBA_EXTENTS 则给出的段
每次扩展的信息
INPUT
SQL》 SELECT SUBSTR(SEGMENT_NAME;1;30) SEGMENT_NAME;
2 SUBSTR(SEGMENT_TYPE;1;12) SEGMENT_TYPE;
3 BYTES;
4 EXTENTS;
5 FROM SYS。DBA_SEGMENTS
6 WHERE OWNER = 'TWILLIAMS'
7 AND ROWNUM 《 5
345
…………………………………………………………Page 346……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
OUTPUT
SEGMENT_NAME SEGMENT_TYPE BYTES EXTENTS
INVOICE_TBL TABLE 163840 10
PLAINT_TBL TABLE 4763783 3
HISTORY_TBL TABLE 547474996 27
HISTORY_INX INDEX 787244534 31
分析
看一下从 DBA_SEGMENTS 的输出 你可以很容易地通常 EXTENTS 的数字来确定增
长最多的表的情况 在本例子 HISTORY_TBL 和 HISTORY_INX 的增长要比另外的两个表
快得多
现在你可以看一下表每次增长的情况 我们以 INVOICE_TBL 为例
INPUT/OUTPUT
SQL》 SELECT SUBSTR(OWNER;1;10) OWNER;
2 SUBSTR(SEGMENT_NAME;1;30) SEGMENT_NAME;
3 EXTENT_ID;
4 BYTES
5 FROM SYS。DBA_EXTENTS
6 WHERE OWNER = 'TWILLIAMS'
7 AND SEGMENT_NAME = 'INVOICE_TBL'
8 ORDER BY EXTENT_ID
OWNER SEGMENT_NAME EXTENT_ID BYTES
TWILLIAMS INVOICE_TBL 0 16384
TWILLIAMS INVOICE_TBL 1 16384
TWILLIAMS INVOICE_TBL 2 16384
TWILLIAMS INVOICE_TBL 3 16384
TWILLIAMS INVOICE_TBL 4 16384
TWILLIAMS INVOICE_TBL 5 16384
TWILLIAMS INVOICE_TBL 6 16384
TWILLIAMS INVOICE_TBL 7 16384
TWILLIAMS INVOICE_TBL 8 16384
TWILLIAMS INVOICE_TBL 9 16384
分析
这个例子显求了该表每次的增长 EXTEND_ID 和每次增长的字节大小情况 这里每
346
…………………………………………………………Page 347……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
次的增长只有 16K 而且已经增长了 10 次了 你也许应该重建数据库并重新生成表并增加
initial_extent
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!