系统对象表。 保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等
sysobjects 重要字段解释:
sysObjects (
Name sysname, --object 名称
id int, --object id
xtype char(2), -- object 类型
type char(2), -- Object 类型(与xtype 似乎一模一样? 有点郁闷…)
uid smallint, -- object 所有者的ID
... --其他的字段不常用到。
)
其中,需要解释的是 xtype 和type 是一模一样的(不知道ms 搞什么名堂),他的数据为:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
FN = 标量函数
IF = 内嵌表函数
K = PRIMARY KEY 或 UNIQUE 约束
L = 日志
P = 存储过程
R = 规则
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表
V = 视图
X = 扩展存储过程
我们会在什么时候用到sysobjects 呢? 最常见的:
a、我打算创建一个表table1 在数据库 db1中。如果table1 不存在,则直接建立,如果table1已经存在,则删除重新建立。
那么, 在t-sql 批处理命令中这么写:
use db1
go
if exists ( Select * From sysObjects Where [Name]='table1 and xtype='U' )
Drop Table table1
go
Create table1 (
fd1 int,
fd2 int,
...
)
go
----------------------------------------------------------------------
以上代码没有测试,顺手写写的。希望不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
b、我打算大概统计一下,某个数据库系统中有多少个tb,多少个SP,多少个FN,以及多少个vw,以粗略估算一下需要多少工作量。
以系统自带数据库northwind为例
use northwind
go
Select IsNull(Cast(xType as varchar(4)),'总计' ) as '分类',
Count(*) as '计数'
from sysobjects
Where XType='U' or Xtype='P' or Xtype='FN' or Xtype='V'
Group by xType
with cube
结果为:
分类 计数
---- -----------
P 38
U 14
V 18
总计 70
(所影响的行数为 5 行)
----------------------------------------------------------------------
可知,northwind数据库有 0个fn,38个sp,14个TB,还有18个VW,总计 70 个重要对象。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
2、sysColumns
数据库字段表。 当前数据库的所有字段都保留在里面。
重要字段解释:
sysColumns (
name sysname, --字段名称
id int, --该字段所属的表的ID
xtype tinyInt, --该字段类型,关联sysTypes表
length smallint, --该字段物理存储长度
...
)
最常的应用,莫过于想看看某一个表,有哪些字段,以及字段的长度了。
比如,我想看看 northwind 中 employees表的字段以及长度情况:
use northwind
go
Select object_name(c.id) as 'tablename',
c.[name] as 'column',
t.[name] as 'type',
c.[length]
From sysColumns c inner join systypes t on c.xtype=t.xtype and t.[name]<>'sysname'
Where c.id=object_id('employees')
order by c.colOrder
那么结果为:
tablename column type length
---------------------------------------------------------------
Employees EmployeeID int 4
Employees LastName nvarchar 40
Employees FirstName nvarchar 20
Employees Title nvarchar 60
Employees TitleOfCourtesy nvarchar 50
Employees BirthDate datetime 8
Employees HireDate datetime 8
Employees Address nvarchar 120
Employees City nvarchar 30
Employees Region nvarchar 30
Employees PostalCode nvarchar 20
Employees Country nvarchar 30
Employees HomePhone nvarchar 48
Employees Extension nvarchar 8
Employees Photo image 16
Employees Notes ntext 16
Employees ReportsTo int 4
Employees PhotoPath nvarchar 510
----------------------------------------------------------------------
呵呵,其实认真看看,可以看见length 的长度和表创建的长度是不一致的(翻倍了)……注意看我上面的注明,是物理存储长度。
实际上,字符串类型的,需要 除以 2 的。
其中,还引用到了另外一个系统表 sysTypes ,简单说明一下:这个系统表是用来存放数据类型的。我这里为了方便,把类型翻译过来
了。不然 type 就是 一些ID号了。看得大家不爽。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
3、sysUsers
当前数据库的系统组,以及用户。
sysUsers(
uid smallint, --用户id
name smallint , --名称
uid varbinary(85) , --属于一个登陆
....
)
这个系统表没啥好说的,我讲大家还不如自己去看 online help。
简单举个例子把:
查看当前数据库有那些用户:
use northwind
go
select * From sysusers where status<>0
结果为:
uid id name sid 其他字段(略)
-------------------------------------------------------------------------------
2 2 guest 0x00
1 2 dbo 0x01
5 2 chair3 0x8750E1247F2BDF4280C44D23FDADEAF6
4、sysdenpends
当前数据库的依赖关系。 怎么说呢? 一下子不知道怎么表达了。
就这样举个例子吧。
比如,我修改别人的垃圾代码,看得严重不爽,然后需要修改他的表,那么,我担心会影响到其他的sp,vw,或者fn。
这个时候,我需要先查询一下,看看有那些程序调用到了这个表。
下面的例子,显示northwind数据库中,谁引用了 products 这个表
于是:
use northwind
go
Select distinct object_name(d.id) as 'program',
o.xtype
from sysdepends d inner join sysobjects o on d.id=o.id
where object_name(depid)='products'
于是得到结果
program xtype
------------------------------------
Alphabetical list of products V
CK_Products_UnitPrice C
CK_ReorderLevel C
CK_UnitsInStock C
CK_UnitsOnOrder C
Current Product List V
CustOrderHist P
CustOrdersDetail P
Invoices V
Order Details Extended V
Product Sales for 1997 V
Products Above Average Price V
Products by Category V
Sales by Category V
SalesByCategory P
Ten Most Expensive Products P
----------------------------------------------------------------------
看看,一看就明白了吧? 至于xtype的类型, 在sysObjects 中已经有介绍了。
以上代码已经测试,不是顺手写写的。肯定不会出错:)
--3腿椅子
精彩世界,尽在开发者俱乐部(www.dev-club.com)!!
-----------------------------------------------------------------------
好了。一般程序员用到的系统表,基本也就这几个。
其他的特殊的系统表(主要都在master 或者 tempdb )里面了,大家自己摸索摸索把。或者以后再说了。:)