首先明確數據庫對象的定義:數據庫對象定義數據庫內容的結構。它們包含在數據庫項目中,數據庫項目還可以包含數據生成計划和腳本。
常見的數據庫對象包括:表,索引,視圖,圖表,缺省值,規則,觸發器,存儲過程,函數等
1.sys.objects視圖
數據庫中創建的每一個對象都對應表中的一行,但不包括DDL觸發器,查詢觸發器應該使用sys.triggers
常見的不同類型對象在sys.objects中的區分:
類型 | type列 | type_desc列 |
FOREIGN KEY 約束 | F | FOREIGN_KEY_CONSTRAINT |
SQL 標量函數 | FN | SQL_SCALAR_FUNCTION |
SQL 內聯表值函數 | IF | SQL_INLINE_TABLE_VALUED_FUNCTION |
內部表 | IT | INTERNAL_TABLE |
SQL 存儲過程 | P | SQL_STORED_PROCEDURE |
PRIMARY KEY 約束 | PK | PRIMARY_KEY_CONSTRAINT |
系統基表 | S | SYSTEM_TABLE |
SQL 表值函數 | TF | SQL_TABLE_VALUED_FUNCTION |
表(用戶定義類型) | U | USER_TABLE |
UNIQUE 約束 | UQ | UNIQUE_CONSTRAINT |
視圖 | V | View |
因此查詢數據庫中包含的對象可以直接查詢sys.objects視圖,比如:查詢數據庫中所有的視圖
1 SELECT * FROM sys.objects WHERE type = 'U'
由於對象id在對應數據庫中是唯一的,可以在查詢時聯結其他表或視圖,比如:查詢數據庫中所有存儲過程及其內容
1 SELECT O.name, M.definition FROM sys.objects O 2 JOIN sys.sql_modules M ON M.object_id = O.object_id 3 WHERE O.type = 'P'
2.其他查詢方法
存儲過程有單獨的系統視圖sys.procedures,基本等價於sys.objects WHERE type = 'P'
另外還可以執行系統sp查詢存儲過程:EXEC sp_stored_procedures,不同的是:
sys.procedures (或sys.objects WHERE type = 'P')只包含用戶存儲過程,但執行sp_stored_procedures可以查詢所有種類的存儲過程和除了系統函數之外的所有函數
3.sys.modules視圖
為每個包含 SQL 語言定義模塊的系統對象返回一行,類型為 FN、IF、P、PC、TF 和 V 的系統對象具有關聯的 SQL 模塊。
因此,對於這些類型的對象,可以聯結sys.objects查詢對象的語言定義模塊,即其內容。
4.sp_helptext需要注意的
sp_helptext是使用頻率非常高的系統存儲過程,使用它可以快速列出指定名稱存儲過程或函數的內容,但是有如下缺點:
①格式化代碼
②當一行長度超過一定后,分行顯示
這樣當修改存儲過程或函數時,如果使用sp_helptext很可能導致格式錯亂,對於下一次的代碼閱讀造成很大的麻煩。
因此,建議sp_helptext僅限於查看存儲過程或函數的內容。
另外,加密的存儲過程不能通過sp_helptext查詢。
本文待補充