现在的位置: 首页 > 综合 > 正文

[转帖]《高效能的数据库》第五讲-几个常用的系统表

2013年10月20日 ⁄ 综合 ⁄ 共 5194字 ⁄ 字号 评论关闭
1、sysobjects

系统对象表。 保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等

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 )里面了,大家自己摸索摸索把。或者以后再说了。:)
 

抱歉!评论已关闭.