獲取數據庫元數據

關鍵字 數據庫 對象
原作者姓名 Fang

SQL SERVER
取得數據庫名的方法
系統存儲過程sp_helpdb

或者

USE master

SELECT sysdb.name AS dbname, xlogin.name AS owner FROM sysdatabases AS sysdb LEFT JOIN sysxlogins AS xlogin ON sysdb.sid = xlogin.sid


sp_helpdb獲得的內容更準確:第二種方式無法獲取Windows NT登陸用戶。

取得表的方法
系統存儲過程

USE xxx

EXEC sp_help

或者

獲取指定數據庫的用戶表:

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

獲取指定數據庫的系統表:

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

或者統一使用:

USE DBAudit

SELECT sysobjects.name AS name, sysusers.name AS owner, type, sysobjects.id AS id FROM sysobjects LEFT JOIN sysusers ON sysobjects.uid = sysusers.uid WHERE 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 xxxDatabase

SELECT syscolumns.name AS name, systypes.name AS type FROM syscolumns LEFT JOIN systypes ON syscolumns.xtype = systypes.xtype WHERE syscolumns.id = xxxTableId

這兩種方法都可以取得包括視圖的列。

取得視圖的方法
系統存儲過程

USE xxx

EXEC sp_help

或者

獲取指定數據庫的視圖:

USE DBAudit

SELECT sysobjects.name AS name, sysusers.name AS owner FROM sysobjects LEFT JOIN sysusers ON sysobjects.uid = sysusers.uid WHERE type = 'V'

獲取指定數據庫的視圖的內容:

EXEC sp_helptext xxxObject

取得存儲過程的方法
系統存儲過程

USE xxx

EXEC sp_help

或者

獲取指定數據庫的存儲過程或者擴展存儲過程:

USE DBAudit

SELECT sysobjects.name AS name, sysusers.name AS owner, type FROM sysobjects LEFT JOIN sysusers ON sysobjects.uid = sysusers.uid WHERE type = 'P' OR type = 'X'

獲取指定數據庫的存儲過程或者擴展存儲過程的內容:

EXEC sp_helptext xxxObject

無法獲取加密的存儲過程。擴展存儲過程只能得到dll程序名。

取得函數的方法
系統存儲過程

USE xxx

EXEC sp_help

或者

獲取指定數據庫的各種函數(內嵌函數等):

USE DBAudit

SELECT sysobjects.name AS name, sysusers.name AS owner, type FROM sysobjects LEFT JOIN sysusers ON sysobjects.uid = sysusers.uid WHERE type = 'FN' OR type = 'IF' OR type = ‘TF'

獲取指定數據庫的函數的內容:

EXEC sp_helptext xxxObject

只能獲取用戶定義的函數內容。

取得觸發器的方法
系統存儲過程

USE xxx

EXEC sp_helptrigger xxxTable

或者

獲取指定數據庫的表的觸發器:

SELECT sysobj1.name AS name, sysusers.name AS owner FROM sysobjects AS sysobj1 LEFT JOIN sysobjects AS sysobj2 ON sysobj1.parent_obj = sysobj2.id LEFT JOIN sysusers ON sysobj1.uid = sysusers.uid WHERE sysobj1.type = 'TR'AND sysobj2.name = 'xxxTable'

取得索引的方法
系統存儲過程

USE xxx

EXEC sp_helpindex xxxTable

用戶
系統存儲過程

USE xxx

EXEC sp_helpuser

角色
系統存儲過程

USE xxx
EXEC sp_helprole

 

ORACLE
特殊
Ø ORACLE只能連接特定數據庫,不能自動掃描數據庫對象。

Ø ORACLE表必須用用戶來區別,否則表可能重名。

Ø ORACLE不能區別系統表或者是用戶表,因此只能由管理員選擇掃描某些特定用戶的表。

取得數據庫名的方法
只能由用戶指定數據庫,不能自動掃描到特定數據庫服務器上的所有數據庫。

取得表的方法
存儲數據庫表的系統表/視圖主要有:

DBA_ALL_TABLES

描述數據庫中所有的對象以及相關的表。

ALL_ALL_TABLES

描述數據庫中所有的用戶可以訪問的對象以及相關的表。

USER_ALL_TABLES

描述數據庫中當前用戶擁有的對象以及相關的表。


DBA_ TABLES

描述數據庫中所有相關的表。

ALL_ TABLES

描述數據庫中所有的用戶可以訪問的相關的表。

USER_ TABLES

描述數據庫中當前用戶擁有的相關的表。


因此,可以從ALL_TABLES中取得隸屬於指定用戶的表:

SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE OWNER = 'DBAUDIT';

取得隸屬於指定表空間的表:

SELECT TABLE_NAME FROM SYS.ALL_TABLES WHERE TABLESPACE_NAME = 'DBAUDIT';


也可以不指定用戶名,從而取得所有的表。

SELECT TABLE_NAME FROM SYS.ALL_TABLES;

取得列的方法
存儲數據庫表的列屬性的系統表/視圖主要有:

DBA_TAB_COLUMNS
描述數據庫中所有的表的列屬性。
ALL_TAB_COLUMNS
描述數據庫中所有的用戶可以訪問的表的列屬性。
USER_TAB_COLUMNS
描述數據庫中當前用戶擁有的表的列屬性。
ALL_TAB_COLS

描述數據庫中所有的用戶可以訪問的表的列屬性。


因此,可以從ALL_TAB_COLUMNS中取得隸屬於指定用戶的表:
SELECT COLUMN_NAME FROM SYS.ALL_TAB_COLUMNS WHERE TABLE_NAME = 'TASK' AND OWNER = 'DBAUDIT';

取得視圖的方法
存儲數據庫視圖的系統表/視圖主要有:

DBA_VIEWS
描述數據庫中所有的視圖的屬性。
ALL_VIEWS
描述數據庫中所有的用戶可以訪問的視圖的屬性。
USER_VIEWS

描述數據庫中所有的當前用戶擁有視圖的屬性。


因此,可以從ALL_VIEWS中取得隸屬於指定用戶的視圖:
SELECT VIEW_NAME FROM SYS.ALL_VIEWS WHERE OWNER = 'DBAUDIT';

取得存儲過程的方法
存儲系統對象的系統表/視圖有:

DBA_OBJECTS

描述數據庫中所有的對象。

ALL_OBJECTS
描述數據庫中所有的可以訪問的對象。
USER_OBJECTS

描述數據庫中所有的當前用戶擁有的對象。

SYS_OBJECTS

描述數據庫中所有的系統對象。?


對象類型有:

CONSUMER GROUP

CONTEXT

DIRECTORY

FUNCTION

INDEX

INDEX PARTITION

INDEXTYPE

JAVA CLASS

JAVA DATA

JAVA RESOURCE

JAVA SOURCE

LIBRARY

LOB

MATERIALIZED VIEW

OPERATOR

PACKAGE

PACKAGE BODY

PROCEDURE

QUEUE

SEQUENCE

SYNONYM

TABLE

TABLE PARTITION

TRIGGER

TYPE

TYPE BODY

VIEW


因此,取得存儲過程可以用:

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

取得隸屬於某個用戶的存儲過程可以用:

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


同樣,取得其他的對象也可以用這個方法,包括表,視圖等。

取得存儲過程內容的方法
對象類型爲類型、類型體、過程、函數、包、包體,JAVA源代碼的所有對象的源代碼都存儲在幾個系統表/視圖中:

DBA_SOURCE

存儲所有數據庫對象的源代碼。

ALL_SOURCE
存儲所有可以訪問的數據庫對象的源代碼。
USER_SOURCE

存儲所有當前用戶擁有的數據庫對象的源代碼。


因此,取得存儲過程源代碼的方法:

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

取得函數的方法
同上,取得函數可以用:

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

取得隸屬於某個用戶的函數可以用:

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


取得函數內容可以用:

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

取得觸發器的方法
存儲數據庫觸發器的系統表/視圖主要有:

DBA_TRIGGERS
描述數據庫中所有的觸發器的屬性。
ALL_ TRIGGERS
描述數據庫中所有的用戶可以訪問的觸發器的屬性。
USER_ TRIGGERS

描述數據庫中所有的當前用戶擁有觸發器的屬性。


因此,可以從ALL_ TRIGGERS中取得隸屬於指定用戶的觸發器:
SELECT TRIGGER_NAME FROM SYS.ALL_TRIGGERS WHERE OWNER = 'DBAUDIT';


取得觸發器內容的方法:

SELECT TRIGGER_BODY FROM SYS.ALL_TRIGGERS WHERE TRIGGER_NAME = 'XXX';

取得索引的方法
存儲數據庫索引的系統表/視圖主要有:

DBA_INDEXES
描述數據庫中所有的索引的屬性。
ALL_ INDEXES
描述數據庫中所有的用戶可以訪問的索引的屬性。
USER_ INDEXES

描述數據庫中所有的當前用戶擁有索引的屬性。


因此,可以從ALL_ INDEXES中取得隸屬於指定用戶的索引:
SELECT INDEX_NAME,TABLE_NAME FROM SYS.ALL_INDEXES WHERE OWNER = 'DBAUDIT';


取得索引相關的列的方法:

SELECT COLUMN_NAME FROM SYS.ALL_IND_COLUMNS WHERE INDEX_NAME = 'XXX' AND TABLE_OWNER = 'DBAUDIT';

用戶
存儲數據庫用戶的系統表/視圖主要有:

DBA_USERS
描述數據庫中所有的用戶的屬性。
ALL_USERS
描述數據庫中所有的用戶的屬性。
USER_USERS

描述數據庫中當前用戶的屬性。


因此,可以從ALL_USERS中取得用戶:
SELECT USER_ID, USERNAME FROM SYS.ALL_USERS;

角色
存儲角色的表/視圖有:

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' 



 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章