關於SQL Server數據庫的一切信息都保存在它的系統表格里。我懷疑你是否花過比較多的時間來檢查系統表格,因為你總是忙於用戶表格。但是,你可能需要偶爾做一點不同尋常的事,例如數據庫所有的觸發器。你可以一個一個地檢查表格,但是如果你有500個表格的話,這可能會消耗相當大的人工。
這就讓sysobjects表格有了用武之地。雖然我不建議你更新這個表格,但是你當然有權對其進行審查。
sysobjects 表
在數據庫內創建的每個對象(約束、默認值、日志、規則、存儲過程等)在表中占一行。只有在 tempdb 內,每個臨時對象才在該表中占一行。
sysobjects 表結構:
列名 | 數據類型 | 描述 |
name | sysname | 對象名,常用列 |
id | int | 對象標識號 |
xtype | char(2) | 對象類型。常用列。xtype可以是下列對象類型中的一種: 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 = 擴展存儲過程 |
uid | smallint | 所有者用戶對象編號 |
info | smallint | 保留。僅限內部使用 |
status | int | 保留。僅限內部使用 |
base_schema_ ver | int | 保留。僅限內部使用 |
replinfo | int | 保留。供復制使用 |
parent_obj | int | 父對象的對象標識號(例如,對於觸發器或約束,該標識號為表 ID)。 |
crdate | datetime | 對象的創建日期。 |
ftcatid | smallint | 為全文索引注冊的所有用戶表的全文目錄標識符,對於沒有注冊的所有用戶表則為 0 |
schema_ver | int | 版本號,該版本號在每次表的架構更改時都增加。 |
stats_schema_ ver | int | 保留。僅限內部使用。 |
type | char(2) | 對象類型。可以是下列值之一: C = CHECK 約束 D = 默認值或 DEFAULT 約束 F = FOREIGN KEY 約束 FN = 標量函數 IF = 內嵌表函數 K = PRIMARY KEY 或 UNIQUE 約束 L = 日志 P = 存儲過程 R = 規則 RF = 復制篩選存儲過程 S = 系統表 TF = 表函數 TR = 觸發器 U = 用戶表 V = 視圖 X = 擴展存儲過程 |
userstat | smallint | 保留。 |
sysstat | smallint | 內部狀態信息 |
indexdel | smallint | 保留 |
refdate | datetime | 留用 |
version | int | 保留 |
deltrig | int | 保留 |
instrig | int | 保留 |
updtrig | int | 保留 |
seltrig | int | 保留 |
category | int | 用於發布、約束和標識 |
cache | smallint | 保留 |
你可以用下面的命令列出感興趣的所有對象:
SELECT * FROM sysobjects WHERE xtype = <type of interest> --例如:查看視圖 SELECT * FROM sysobjects WHERE xtype = 'V'
判斷數據庫中是否已經存在某個表,有的話就刪除該表
--方法一: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[表名]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[表名] --方法二: if exists (select * from sysobjects where id = object_id(N'表名') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[表名] --方法三: if(Exists(Select * From SysObjects Where xtype='U' And Name='表名')) drop table [dbo].[表名]
以后繼續補充。
某些朋友的一些疑問:
1、問:object_id(N'表名')中N'代表什么意思?
答:N'' 代表 Unicode類型.可以支持不同語種的對象名
2、 問:select * from dbo.sysobjects where id = object_id(N'[dbo].[usertab]') and OBJECTPROPERTY(id, N'IsUserTable') = 1
這句中的object_id(N'[dbo].[usertab]')和OBJECTPROPERTY(id, N'IsUserTable') = 1
是什么意思?
答:object_id(N'[dbo].[usertab]'):是得出系統給表usertab分配的唯一ID
OBJECTPROPERTY(id, N'IsUserTable') = 1
該對象的屬性是表類型的 objectproperty(id,property)函數的使用,
3、 問:USE master SELECT * FROM ...SysObjects ” ...sysobjects ” -- 三個句點的前綴是什么意思?
答:對數據庫對象名的 Transact-SQL 引用可以是由四部分組成的名稱,格式如下:[ server_name.[[database_name].[owner_name]. | database_name.[owner_name]. | owner_name.] ] object_name
未完待續(XX尚未成功,后面要靠大家了)……