获取MSSQLServer,Oracel,Access数据字典信息
1: 数据字典记录了数据库的系统信息,是只读表和视图的集合,数据字典的所有者为sys用户,并且存放在system表空间中。
数据字典基表存放基本信息,普通用户不能访问,只能通过访问数据字典视图取得系统信息,数据字典包含三种类型:
USER_XXX: 所有数据库对象
ALL_XXX: 当前用户可以存放的所有对象
DBA_XXX: 当前用户所拥有的对象
2: 数据字典内容
A:对象定义
当执行create命令创建对象时,Oracle会将对象存放到数据字典中,可以使用DBMS_METADATA可以获取对象定义语句,:
SQL>SET LONG 4000
SQL>SELECT dbms_metadata.get_ddl('TABLE','EMP') ddl FROM DUAL;
B:对象占用的空间
建立表,索引和族时,Oralce会给表,索引和族分配相应的空间,以存放这些对象的数据,通过数据字典,可以取得所占用的空间
查询表占用的空间,可以查看其同名段的大小,如下:
SQL> SELECT bytes FROM user_segments WHERE segment_name='EMP';
如果要查看剩余空间和已用空间时,要做一下步骤:
SQL> analyze table emp compute statistics;
SQL> select empty_blocks,blocks from user_tables where table_name='EMP';
C: 列信息
SQL> select from user_tab_columns where table_name="DEPT";
D: 用户名,权限和角色
DBA_USERS: 所有数据库用户的详细信息
DBA_SYS_PRIVS: 用户或角色所具有的系统权限
DBA_TAB_PRIV: 显示用户或角色所具有的对象权限
DBA_COL_PRIVS: 用户或角色所具有的列权限
DBA_ROLE_PRIVS: 显示用户或角色具有的其他的角色。
3:常用的数据字典:
1 DICT: 显示当前用户可以访问的所有的数据字典视图
2 DICT_COLUMNS: 用户显示数据字典视图每个列的作用,
SQL> SELECT column_name,comments FROM dict_columns WHERE table_name='DICT';
3 DUAL: 用于取得函数的返回值
SQL> SELECT user FROM dual;
4 GLOBAL_NAME: 用于显示当前数据库的全名
SQL> SELECT * FROM GLOBAL_NAME
5 IND:用于显示当前用于所拥有的索引
6 OBJ: 用于显示当前用户所拥有的所有对象
7 SEG:用于显示当前用户所拥有的序列
8 SYN:用于显示当前用户所拥有的同义词和同义词对应的数据库对象名
9 TAB:用于显示当前用户所拥有的表,视图和序列
4:动态性能视图记录当前例程的活动信息,启动时从SGA和控制文件中取得的,例程停止时,删除这些表 数据字典时从数据文件中获取的
5:常用的动态性能视图表:
1:V$FIXED_TABLE - 列出所有可用的动态性能视图和动态性能表
2:V$INSTANCE - 取得当前例程的详细信息
3:V$SGA - 用于显示SGA主要组成部分
4:V$SGAINFO - 取得SGA更详细的信息
5:V$PARAMETER - 取得初始化参数的详细信息
6:V$VERSION - 取得ORACLE版本的详细信息
7:V$OPTION - 该动态性能视图用于显示已经安装的Oralce选项
8:V$SESSION - 用于显示会话的详细信息
9:V$PROCESS - 显示Oracel所有进程的信息(包括后台进程和服务器进程)
10:V$BGPROCESS - 用于显示后台进程的详细信息
11 :V$DATABASE - 用于显示当前数据的详细信息
12: V$CONTROLFILE - 显示所有控制文件的信息
13 :V$DATAFILE - 数据文件的详细信息
14 :V$DBFILE - 显示数据文件编号及名称
15 :V$LOGFILE - 用于显示重做日志成员的信息
16: V$LOG - 显示日志组的详细信息
17 :V$THEAD - 取得重做线程的详细信息
18 :V$LOCK - 用于显示锁的信息,通过与V$SESSION进行连接查询,可以显示占有锁的会话,以及等待锁的会话
SQL>select a.username,a.mechine,b.lmode,b.request from v$session a,v$lock b
where a.sid=b.sid and a.type='USER';
19: V$LOCKED_OBJECT 显示被加锁的数据库对象,通过与DBA_OBJECT进行连接查询,可以显示具体的对象名及执行加锁操作的
ORACLE用户名
SQL> select a.oracle_username,b.owner||'.'||b.object_name object
from V$LOCKED_OBJECT a,DBA_OBJECT b
where a.object_id = b.object_id
20 :V$TABLESPACE - 显示表空间的信息
21 :V$TEMPFILE - 显示数据库所包含的临时文件
--------------- MS SQLServer -----------------
--表说明
SELECT dbo.sysobjects.name AS TableName,
dbo.sysproperties.[value] AS TableDesc
FROM dbo.sysproperties INNER JOIN
dbo.sysobjects ON dbo.sysproperties.id = dbo.sysobjects.id
WHERE (dbo.sysproperties.smallid = 0)
ORDER BY dbo.sysobjects.name
--字段说明
SELECT dbo.sysobjects.name AS TableName, dbo.syscolumns.colid,
dbo.syscolumns.name AS ColName, dbo.sysproperties.[value] AS ColDesc
FROM dbo.sysproperties INNER JOIN
dbo.sysobjects ON dbo.sysproperties.id = dbo.sysobjects.id INNER JOIN
dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id AND
dbo.sysproperties.smallid = dbo.syscolumns.colid
ORDER BY dbo.sysobjects.name, dbo.syscolumns.colid
--主键、外键信息(简化)
select
c_obj.name as CONSTRAINT_NAME
,t_obj.name as TABLE_NAME
,col.name as COLUMN_NAME
,case col.colid
when ref.fkey1 then 1
when ref.fkey2 then 2
when ref.fkey3 then 3
when ref.fkey4 then 4
when ref.fkey5 then 5
when ref.fkey6 then 6
when ref.fkey7 then 7
when ref.fkey8 then 8
when ref.fkey9 then 9
when ref.fkey10 then 10
when ref.fkey11 then 11
when ref.fkey12 then 12
when ref.fkey13 then 13
when ref.fkey14 then 14
when ref.fkey15 then 15
when ref.fkey16 then 16
end as ORDINAL_POSITION
from
sysobjects c_obj
,sysobjects t_obj
,syscolumns col
,sysreferences ref
where
permissions(t_obj.id) != 0
and c_obj.xtype in (@#F @#)
and t_obj.id = c_obj.parent_obj
and t_obj.id = col.id
and col.colid in
(ref.fkey1,ref.fkey2,ref.fkey3,ref.fkey4,ref.fkey5,ref.fkey6,
ref.fkey7,ref.fkey8,ref.fkey9,ref.fkey10,ref.fkey11,ref.fkey12,
ref.fkey13,ref.fkey14,ref.fkey15,ref.fkey16)
and c_obj.id = ref.constid
union
select
i.name as CONSTRAINT_NAME
,t_obj.name as TABLE_NAME
,col.name as COLUMN_NAME
,v.number as ORDINAL_POSITION
from
sysobjects c_obj
,sysobjects t_obj
,syscolumns col
,master.dbo.spt_values v
,sysindexes i
where
permissions(t_obj.id) != 0
and c_obj.xtype in (@#UQ@# ,@#PK@#)
and t_obj.id = c_obj.parent_obj
and t_obj.xtype = @#U@#
and t_obj.id = col.id
and col.name = index_col(t_obj.name,i.indid,v.number)
and t_obj.id = i.id
and c_obj.name = i.name
and v.number > 0
and v.number <= i.keycnt
and v.type = @#P@#
order by CONSTRAINT_NAME, ORDINAL_POSITION
--主键、外键对照(简化)
select
fc_obj.name as CONSTRAINT_NAME
,i.name as UNIQUE_CONSTRAINT_NAME
from
sysobjects fc_obj
,sysreferences r
,sysindexes i
,sysobjects pc_obj
where
permissions(fc_obj.parent_obj) != 0
and fc_obj.xtype = @#F@#
and r.constid = fc_obj.id
and r.rkeyid = i.id
and r.rkeyindid = i.indid
and r.rkeyid = pc_obj.id
------------------- ORACLE -------------------
--表信息
select * from all_tab_comments t
where owner=@#DBO@#
--列信息
select * from all_col_comments t
where owner=@#DBO@#
--主键、外键对照
select OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
from all_constraints
where owner=@#DBO@# and (Constraint_Type=@#P@# or Constraint_Type=@#R@#)
--主键、外键信息
select *
from all_cons_columns
where owner=@#DBO@#
order by Constraint_Name, Position
------------------- Access -------------------
//Access中的系统表MSysobjects存储属性的字段是二进制格式,不能直接分析
//可以采用ADO自带的OpenSchema方法获得相关信息
//use ADOInt.pas
//po: TableName
//DBCon:TADOConnection
/ds:TADODataSet
--表信息
DBCon.OpenSchema(siTables, VarArrayOf([Null, Null, @#Table@#]), EmptyParam, ds);
--列信息
DBCon.OpenSchema(siColumns, VarArrayOf([Null, Null, @#po@#]), EmptyParam, ds);
--主键
DBCon.OpenSchema(siPrimaryKeys, EmptyParam, EmptyParam, ds);
--主键、外键对照
DBCon.OpenSchema(siForeignKeys, EmptyParam, EmptyParam, ds);
本文来自: 中国自学编程网(www.zxbc.cn) 详细出处参考:http://www.zxbc.cn/html/20070419/2483.html