標籤:建議 use 判斷 tran 比較 預存程序 sql cts 物件類型
關於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尚未成功,後面要靠大家了)……
SQL Server系統資料表sysobjects介紹與使用