<?XML:NAMESPACE PREFIX = O />
----系統表--------------------------------------------------------------------------------------
雖然使用系統存儲過程、系統函數與資訊架構視圖已經可以為我們提供了相當豐富的中繼資料資訊,但是對于某些特殊的中繼資料資訊,我們仍然需要直接對系統表進行查詢。因為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)
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
END
CLOSE sp_cursor
DEALLOCATE sp_cursor
該存儲過程利用了 sysobjects 和 syscomments 表,并巧妙地修改了原存儲過程的 SQL 定義語句,将 AS 修改為了 WITH ENCRYPTION AS,進而達到了加密存儲過程的目的。本存儲過程在 SQL Server 2000 上通過。