---- 系統表 --------------------------------------------------------------------------------------
雖然使用系統存儲過程、系統函數與信息架構視圖已經可以為我們提供了相當豐富的元數據信息,但是對于某些特殊的元數據信息,我們仍然需要直接對系統表進行查詢。因為 SQL Server 將所有數據庫對象的信息均存放在系統表中,作為 SQL Server 的管理、開發人員,了解各個系統表的作用將有助于我們了解 SQL Server 的內在工作原理。
SQL Server 的系統表非常多,其中最常用的與元數據查詢有關的表有如下一些:
?
系統表 |
描述 |
syscolumns |
存儲每個表和視圖中的每一列的信息以及存儲過程中的每個參數的信息。 |
syscomments |
存儲包含每個視圖、規則、默認值、觸發器、 CHECK 約束、 DEFAULT 約束和存儲過程的原始 SQL 文本語句。 |
sysconstraints |
存儲當前數據庫中每一個約束的基本信息。 |
sysdatabases |
存儲當前服務器上每一個數據庫的基本信息。 |
sysindexes |
存儲當前數據庫中的每個索引的信息。 |
sysobjects |
存儲數據庫內的每個對象(約束、默認值、日志、規則、存儲過程等)的基本信息。 |
sysreferences |
存儲所有包括 FOREIGN KEY 約束的列。 |
systypes |
存儲系統提供的每種數據類型和用戶定義數據類型的詳細信息。 |
將系統存儲過程、系統函數、信息架構視圖與系統表結合使用,可以方便地讓我們獲得所有需要的元數據信息。
示例:
1 、 獲得當前數據庫所有用戶表的名稱。
SELECT OBJECT_NAME (id)
FROM sysobjects
WHERE xtype = 'U' AND OBJECTPROPERTY (id, 'IsMSShipped') = 0
其中主要用到了系統表 sysobjects 以及其屬性 xtype ,還有就是用到了 OBJECTPROPERTY 系統函數來判斷是不是安裝 SQL Server 的過程中創建的對象。
2 、 獲得指定表上所有的索引名稱
SELECT name FROM sysindexes
WHERE id = OBJECT_ID ('mytable') AND indid > 0
---- 系統存儲過程 ---------------------------------------------------------------------------
系統存儲過程 |
描述 |
sp_columns |
返回指定表或視圖的列的詳細信息。 |
sp_databases |
返回當前服務器上的所有數據庫的基本信息。 |
sp_fkeys |
若參數為帶有主鍵的表,則返回包含指向該表的外鍵的所有表;若參數為帶有外鍵的表名,則返回所有同過主鍵 / 外鍵關系與該外鍵相關聯的所有表。 |
sp_pkeys |
返回指定表的主鍵信息。 |
sp_server_info |
返回當前服務器的各種特性及其對應取值。 |
sp_sproc_columns |
返回指定存儲過程的的輸入、輸出參數的信息。 |
sp_statistics |
返回指定的表或索引視圖上的所有索引以及統計的信息。 |
sp_stored_procedures |
返回當前數據庫的存儲過程列表,包含系統存儲過程。 |
sp_tables |
返回當前數據庫的所有表和視圖,包含系統表。 |
---- 系統函數 ----------------------------------------------------------------------------------------------------
COLUMNPROPERTY |
返回有關列或過程參數的信息,如是否允許空值,是否為計算列等。 |
COL_LENGTH |
返回指定數據庫的指定屬性值,如是否處于只讀模式等。 |
DATABASEPROPERTYEX |
返回指定數據庫的指定選項或屬性的當前設置,如數據庫的狀態、恢復模型等。 |
OBJECT_ID |
返回指定數據庫對象名的標識號 |
OBJECT_NAME |
返回指定數據庫對象標識號的對象名。 |
OBJECTPROPERTY |
返回指定數據庫對象標識號的有關信息,如是否為表,是否為約束等。 |
fn_listextendedproperty |
返回數據庫對象的擴展屬性值,如對象描述、格式規則、輸入掩碼等。 |
---- 使用信息架構視圖訪問元數據 ---------------------------------------------------------------------------------------------------
信息架構視圖基于 SQL-92 標準中針對架構視圖的定義,這些視圖獨立于系統表,提供了關于 SQL Server 元數據的內部視圖。信息架構視圖的最大優點是,即使我們對系統表進行了重要的修改,應用程序也可以正常地使用這些視圖進行訪問。因此對于應用程序來說,只要是符合 SQL-92 標準的數據庫系統,使用信息架構視圖總是可以正常工作的。
常用的信息架構視圖有以下一些:
信息架構視圖 |
描述 |
INFORMATION_SCHEMA .CHECK_CONSTRAINTS |
返回有關列或過程參數的信息,如是否允許空值,是否為計算列等。 |
INFORMATION_SCHEMA .COLUMNS |
返回當前數據庫中當前用戶可以訪問的所有列及其基本信息。 |
INFORMATION_SCHEMA .CONSTRAINT_COLUMN_USAGE |
返回當前數據庫中定義了約束的所有列及其約束名。 |
INFORMATION_SCHEMA .CONSTRAINT_TABLE_USAGE |
返回當前數據庫中定義了約束的所有表及其約束名。 |
INFORMATION_SCHEMA .KEY_COLUMN_USAGE |
返回當前數據庫中作為主鍵 / 外鍵約束的所有列。 |
INFORMATION_SCHEMA .SCHEMATA |
返回當前用戶具有權限的所有數據庫及其基本信息。 |
INFORMATION_SCHEMA .TABLES |
返回當前用戶具有權限的當前數據庫中的所有表或者視圖及其基本信息。 |
INFORMATION_SCHEMA .VIEWS |
返回當前數據庫中的當前用戶可以訪問的視圖及其所有者、定義等信息。 |
由于這些信息架構都是以視圖的方式存在的,因此我們可以很方便地獲得并利用需要的信息。
例如,我們要得到某個表有多少列,可以使用以下語句:
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='mytable'
?
?
---- 應用 ----------------------------------------------------------------------
--1 :獲取當前數據庫中的所有用戶表
select Name from sysobjects where xtype='u' and status>=0
--2 :獲取某一個表的所有字段
select name from syscolumns where id=object_id(N' 表名 ')
--3 :查看與某一個表相關的視圖、存儲過程、函數
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like N'% 表名 %'
--4 :查看當前數據庫中所有存儲過程
select name as 存儲過程名稱 from sysobjects where xtype='P'
--5 :查詢用戶創建的所有數據庫
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01
--6 :查詢某一個表的字段和數據類型
select column_name,data_type from information_schema.columns
where table_name = N' 表名 '
--7: 獲取數據庫文件路徑
select ltrim(rtrim(filename)) from 數據庫名 ..sysfiles where charindex('MDF',filename)>0
or
select ltrim(rtrim(filename)) from 數據庫名 ..sysfiles where charindex('LDF',filename)>0
--8: 獲取某一個表的基本信息
sp_MShelpcolumns N' 表名 '
--9: 獲取某一個表的主鍵、外鍵信息
exec sp_pkeys N' 表名 '
exec sp_fkeys? N' 表名 '
--10: 判斷某一個表是否存在某一列 ( 字段 )
if exists(select 1 from syscolumns where id=object_id(N' 表名 ) and name=N' 字段 ')
??? print? N' 存在 '
else
??? print? N' 不存在 '
?
下面給出了一個存儲過程,它的作用是自動將當前數據庫的用戶存儲過程加密。
DECLARE @sp_name nvarchar(400)
DECLARE @sp_content nvarchar(2000)
DECLARE @asbegin int
declare @now datetime
select @now = getdate()
DECLARE sp_cursor CURSOR FOR
SELECT object_name(id)
FROM sysobjects
WHERE xtype = 'P'
AND type = 'P'
AND crdate < @now
AND OBJECTPROPERTY(id, 'IsMSShipped')=0
OPEN sp_cursor
FETCH NEXT FROM sp_cursor
INTO @sp_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sp_content = text FROM syscomments WHERE id = OBJECT_ID(@sp_name)
SELECT @asbegin = PATINDEX ( '%AS' + char(13) + '%', @sp_content)
SELECT @sp_content = SUBSTRING(@sp_content, 1, @asbegin - 1)
+ ' WITH ENCRYPTION AS'
+ SUBSTRING (@sp_content, @asbegin+2, LEN(@sp_content))
SELECT @sp_name = 'DROP PROCEDURE [' + @sp_name + ']'
EXEC sp_executesql @sp_name
EXEC sp_executesql @sp_content
FETCH NEXT FROM sp_cursor
INTO @sp_name
END
CLOSE sp_cursor
DEALLOCATE sp_cursor
該存儲過程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存儲過程的 SQL 定義語句,將 AS 修改為了 WITH ENCRYPTION AS ,從而達到了加密存儲過程的目的。本存儲過程在 SQL Server 2000 上通過。
來源:http://www.cnblogs.com/Spring/archive/2008/05/28/1209092.html?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
