白沙沙水

导航

获得数据库对象的方法探讨(2)

角色
存储角色的表/视图有:

DBA_ROLES

描述数据库中所有角色。


取得角色方法:

SELECT ROLE FROM SYS.DBA_ROLES;

表空间
SELECT TABLESPACE_NAME FROM SYS.DBA_TABLESPACES;

数据文件
SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME FROM SYS.DBA_DATA_FILES;

数据库连接
存储数据库连接的系统表/视图主要有:

DBA_LINKS
描述数据库中所有的连接的属性。
ALL_LINKS
描述数据库中所有的用户可访问的连接的属性。
USER_LINKS

描述数据库中当前用户的连接属性。


因此,可以从DBA_DB_LINKS中取得连接:
SELECT * FROM SYS.DBA_DB_LINKS;


同义词
SELECT * FROM SYS.ALL_SYNONYMS WHERE TABLE_OWNER = 'DBAUDIT';

程序包
取得程序包可以用:

SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE';

取得隶属于某个用户的程序包可以用:

SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE' AND OWNER = 'DBAUDIT';


取得程序包内容可以用:

SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = 'XXX' AND TYPE = 'PACKAGE';

程序包体
取得程序包体可以用:

SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE BODY';

取得隶属于某个用户的程序包可以用:

SELECT OBJECT_NAME FROM SYS.ALL_OBJECTS WHERE OBJECT_TYPE = 'PACKAGE BODY ' AND OWNER = 'DBAUDIT';


取得程序包内容可以用:

SELECT TEXT FROM SYS.ALL_SOURCE WHERE NAME = 'XXX' AND TYPE = 'PACKAGE BODY ';


暂不扫描。

高级队列
暂不扫描。

序列
暂不扫描。

数组类型
暂不扫描。


暂不扫描。

Java源
暂不扫描。

对象类型
暂不扫描。

刷新组
暂不扫描。

概要文件
暂不扫描。

Sybase
取得数据库名的方法
系统存储过程sp_helpdb

或者

USE master

SELECT d.name dbname, u.name owner FROM sysdatabases d, sysusers u WHERE d.suid = u.suid


取得表的方法
系统存储过程

USE xxx

EXEC sp_help

或者

获取指定数据库的用户表:

USE DBAudit
SELECT sysobjects.name AS tname, sysusers.name AS owner FROM sysobjects, sysusers WHERE sysobjects.uid = sysusers.uid AND type = 'U'

获取指定数据库的系统表:

USE DBAudit
SELECT sysobjects.name AS tname, sysusers.name AS owner FROM sysobjects, sysusers WHERE sysobjects.uid = sysusers.uid AND type = 'S'

或者统一使用:

USE DBAudit

SELECT sysobjects.name AS tname, sysusers.name AS owner FROM sysobjects, sysusers WHERE sysobjects.uid = sysusers.uid AND (type = 'U' OR type = 'S')

注:

sysobjects中type字段类型解释:

C = CHECK 约束

D = 默认值或 DEFAULT 约束

F = FOREIGN KEY 约束

L = 日志

FN = 标量函数

IF = 内嵌表函数

P = 存储过程

PK = PRIMARY KEY 约束(类型是 K)

RF = 复制筛选存储过程

S = 系统表

TF = 表函数

TR = 触发器

U = 用户表

UQ = UNIQUE 约束(类型是 K)

V = 视图

X = 扩展存储过程

取得列的方法
系统存储过程

USE xxxDatabase

EXEC sp_help xxxTable

取得视图的方法
系统存储过程

USE xxx

EXEC sp_help

或者

获取指定数据库的视图:

USE xxx

SELECT sysobjects.name AS name, sysusers.name AS owner FROM sysobjects, sysusers WHERE sysobjects.uid = sysusers.uid AND type = 'V'

获取指定数据库的视图的内容:

EXEC sp_helptext xxxObject

取得存储过程的方法
系统存储过程

USE xxx

EXEC sp_help

或者

获取指定数据库的存储过程或者扩展存储过程:

USE xxx

SELECT sysobjects.name name, sysusers.name owner FROM sysobjects, sysusers WHERE sysobjects.uid = sysusers.uid AND (type = 'P' OR type = 'X')

获取指定数据库的存储过程或者扩展存储过程的内容:

EXEC sp_helptext xxxObject

无法获取加密的存储过程。扩展存储过程只能得到dll程序名。

取得函数的方法
Sybase不支持用户定义函数。

取得触发器的方法
获取指定数据库的表的触发器:


取得索引的方法
系统存储过程

USE xxx

EXEC sp_helpindex xxxTable

用户
系统存储过程

USE xxx

EXEC sp_helpuser

角色
DB2
特殊
Ø         DB2只能连接特定数据库,不能自动扫描数据库对象。

Ø         DB2表必须用用户来区别,否则表可能重名。

Ø         DB2不能区别系统表或者是用户表,因此只能由管理员选择扫描某些特定用户的表。

取得数据库名的方法
只能由用户指定数据库,不能自动扫描到特定数据库服务器上的所有数据库

取得表的方法
SELECT NAME, CREATOR FROM SYSIBM.SYSTABLES WHERE TYPE = 'T'

或者

SELECT TABNAME, TABSCHEMA FROM SYSCAT.TABLES WHERE TYPE = 'T'

取得列的方法
SELECT NAME, COLTYPE FROM SYSIBM.SYSCOLUMNS WHERE TBNAME = 'SYSTABLES' AND TBCREATOR = 'SYSIBM'

或者

SELECT COLNAME, TYPENAME FROM SYSCAT.COLUMNS WHERE TABNAME = 'SYSTABLES' AND TABSCHEMA = 'SYSIBM'

取得视图的方法
SELECT NAME, CREATOR FROM SYSIBM.SYSTABLES WHERE TYPE = 'V'

或者

SELECT NAME, CREATOR FROM SYSIBM.SYSVIEWS
或者
SELECT TABNAME, TABSCHEMA FROM SYSCAT.TABLES WHERE TYPE = 'V'
或者
SELECT VIEWNAME, VIEWSCHEMA FROM SYSCAT.VIEWS
取得内容的方法
SELECT TEXT FROM SYSCAT.VIEWS WHERE VIEWNAME = 'VIEWS' AND VIEWSCHEMA = 'SYSCAT'

取得存储过程的方法
SELECT PROCNAME, PROCSCHEMA FROM SYSIBM.SYSPROCEDURES

取得存储过程内容的方法

SELECT TEXT FROM SYSIBM.SYSPROCEDURES WHERE PROCNAME = 'XXX' AND PROCSCHEMA = 'YYY'

取得函数的方法
SELECT NAME, SCHEMA FROM SYSIBM.SYSFUNCTIONS

取得函数内容可以用:


取得触发器的方法
SELECT NAME, SCHEMA FROM SYSIBM.SYSTRIGGERS WHERE TBNAME = 'SYSTABLES' AND TBCREATOR = 'SYSIBM'
或者
SELECT TRIGNAME, TRIGSCHEMA FROM SYSCAT.TRIGGERS WHERE TABNAME = 'SYSTABLES' AND TABSCHEMA = 'SYSIBM'

取得触发器内容的方法:

SELECT TEXT FROM SYSIBM.SYSTRIGGERS WHERE NAME = 'XXX' AND SCHEMA = 'YYY '

取得索引的方法
SELECT NAME, CREATOR, COLNAMES FROM SYSIBM.SYSINDEXES WHERE TBNAME = 'SYSTABLES' AND TBCREATOR = 'SYSIBM'

或者

SELECT INDNAME, INDSCHEMA, COLNAMES FROM SYSCAT.INDEXES WHERE TABNAME = 'SYSTABLES' AND TABSCHEMA = 'SYSIBM'

用户
SELECT GRANTEE FROM SYSIBM.SYSDBAUTH WHERE GRANTEETYPE = 'U'
或者
SELECT GRANTEE FROM SYSCAT.DBAUTH WHERE GRANTEETYPE = 'U'

角色
DB2只有用户组的概念。

SELECT GRANTEE FROM SYSIBM.SYSDBAUTH WHERE GRANTEETYPE = 'G'
或者
SELECT GRANTEE FROM SYSCAT.DBAUTH WHERE GRANTEETYPE = 'G'

表空间
SELECT TBSPACE FROM SYSCAT.TABLESPACES

数据库连接

同义词

Informix
取得数据库名的方法
DATABASE sysmaster

SELECT name, owner FROM sysdatabases

取得表的方法
获取指定数据库的表:

DATABASE xxx
SELECT tabname, owner, tabid FROM systables WHERE tabtype = 'T'

注:

tabid 为0-24为系统表,100-xxx为用户表。

tabtype字段类型解释:

T = 用户表

V = 视图

P = 私有同义词

S = 同义词

取得列的方法
DATABASE xxxDatabase
SELECT c.colname, c.coltype FROM syscolumns c, systables t WHERE c.tabid = t.tabid AND t.tabname = 'xxxTable'
可以取得包括视图的列。
注:
coltype 字段意义:
0 = CHAR                    8 = MONEY
1 = SMALLINT            10 = DATETIME
2 = INTEGER               11 = BYTE
3 = FLOAT                   12 = TEXT
4 = SMALLFLOAT 13 = VARCHAR
5 = DECIMAL              14 = INTERVAL
6 = SERIAL                  15 = NCHAR
7 = DATE                     16 = NVARCHAR


取得视图的方法
获取指定数据库的视图:

DATABASE xxx
SELECT tabname, owner FROM systables WHERE tabtype = 'V'

取得视图内容:

SELECT v.viewtext FROM sysviews v, systables t WHERE v.tabid = t.tabid AND t.tabname = 'xxxTable'

取得存储过程的方法
获取指定数据库的存储过程:

DATABASE xxx
SELECT procname, owner FROM sysprocedures
获取指定数据库的存储过程的内容:
SELECT b.data FROM sysprocbody b, sysprocedures p WHERE b.procid = p.procid AND p.procname = 'systdist' AND datakey = 'T'

取得函数的方法
Informix不支持用户定义函数?

取得触发器的方法
获取指定数据库的表的触发器:

SELECT g.trigname, g.owner, g.event FROM systriggers g, systables t WHERE g.tabid = t.tabid AND t.tabname = 'xxxTable'

取得触发器内容:

SELECT b.data FROM systrigbody b, systriggers g WHERE b.trigid = g.trigid AND g.trigname = '%s' AND datakey = 'D'

取得索引的方法
获取指定数据库的表的触发器:

SELECT i.idxname FROM sysindexes i, systables t WHERE i.tabid = t.tabid AND t.tabname = 'xxxTable'

posted on 2007-01-14 14:50  白沙沙水  阅读(237)  评论(0编辑  收藏  举报