您的位置:首页 > 数据库

浅谈数据字典的设计(SQL Server 2005)

2007-03-24 08:35 302 查看
数据字典:此文指表的中文意思以及字段的中文含义。
另:数据字典的结构有参考金蝶K3的表结构,而脚本则为自己编写。
我们在设计后台数据库时,一般表名和字段名是英文 。且一般每个人都只对自己所属模块熟,而在需要用到其他模块的表时,则需要询问其他人。这样比较麻烦,且如果当初设计此表的人已经离开,则还需看代码,这样就更不方便了。因此对于一个好的数据库来说设计数据字典则非常必要。
设计数据字典要有两个表,一个是表清单(TableDescription),一个是字段表(FieldDescription)。
表清单用来存放所有的非系统表,而字段表用来存放所有的字段以及数据类型及中文含义。
设计这两个表的脚本如下:

[align=left]/****** 对象: Table [dbo].[TableDescription] ******/[/align]
[align=left]CREATE TABLE [dbo].[TableDescription]([/align]
[align=left] [TableID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,[/align]
[align=left] [TableName] [nvarchar](50) NOT NULL, --表名[/align]
[align=left] [FDescription] [nvarchar](100) NULL, --中文说明[/align]
[align=left] [FDescription_en] [nvarchar](200) NULL, --英文说明[/align]
[align=left] CONSTRAINT [PK_TableDescription_TableID] PRIMARY KEY CLUSTERED [/align]
[align=left]([/align]
[align=left] [TableID] ASC[/align]
[align=left])WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY][/align]
[align=left]) ON [PRIMARY][/align]
[align=left] [/align]
[align=left]--添加维一约束[/align]
[align=left]ALTER TABLE TableDescription ADD CONSTRAINT un_TableDescription_TableName UNIQUE (TableName)[/align]
[align=left] [/align]
[align=left]/****** 对象: Table [dbo].[FieldDescription] ******/[/align]
[align=left]CREATE TABLE [dbo].[FieldDescription]([/align]
[align=left] [FieldID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,[/align]
[align=left] [TableID] INT NOT NULL,[/align]
[align=left] [FieldName] [nvarchar](50) NOT NULL ,--字段名称[/align]
[align=left] [FieldType] [nvarchar](20) NOT NULL, --字段类型[/align]
[align=left] [Prec] [smallint] NULL, --长度[/align]
[align=left] [Scale] [smallint] NULL, --小数位数[/align]
[align=left] [FDescription] [nvarchar](100) NULL, --中文说明[/align]
[align=left] [FDescription_en] [nvarchar](200) NULL, --英文说明[/align]
[align=left] CONSTRAINT [PK_t_TableDescription] PRIMARY KEY NONCLUSTERED [/align]
[align=left]([/align]
[align=left] [TableID] ASC,[/align]
[align=left] [FieldName] ASC[/align]
[align=left])WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY][/align]
[align=left]) ON [PRIMARY][/align]
[align=left] [/align]
[align=left]--添加外键约束[/align]
[align=left]ALTER TABLE [dbo].[FieldDescription] WITH CHECK ADD CONSTRAINT [FK_FieldDescription_TableDescription] FOREIGN KEY([TableID])[/align]
[align=left]REFERENCES [dbo].[TableDescription] ([TableID])[/align]
[align=left]ON UPDATE CASCADE[/align]
[align=left]ON DELETE CASCADE[/align]
[align=left]GO[/align]
[align=left] [/align]

我们新建、更新、删除表时则需要更新上述两表的相应内容。如果第次都手工去修改则非常麻烦,为此我们可以这样做:数据库设计人员在设计表时需要在表下面的【说明】写上相应的中文说明。然后编写存储过程:sp_UpdateDD

[align=left]USE master[/align]
[align=left]GO[/align]
[align=left] [/align]
[align=left]IF EXISTS(SELECT * FROM sysobjects WHERE NAME='sp_UpdateDD' AND type='P' AND SCHEMA_NAME(uid)='dbo')[/align]
[align=left] DROP PROC dbo.sp_UpdateDD[/align]
[align=left]GO[/align]
[align=left] [/align]
[align=left]/*************************[/align]
[align=left]PROC:sp_UpdateDD [/align]
[align=left]CREATE BY:Mark Yao [/align]
[align=left]CREATE Date:2008/1/19[/align]
[align=left]USE:更新資料字典 [/align]
[align=left]INPUT:[/align]
[align=left]OUTPUT:[/align]
[align=left]Table List:[/align]
[align=left] [TableDescription]:表描述[/align]
[align=left] [FieldDescription]:字段描述[/align]
[align=left]Eg:Exec sp_UpdateDD [/align]
[align=left]*************************/[/align]
[align=left]CREATE PROC dbo.sp_UpdateDD[/align]
[align=left]AS[/align]
[align=left] SET NOCOUNT ON[/align]
[align=left] [/align]
[align=left] DECLARE @TableID INT, --表ID[/align]
[align=left] @strTable NVARCHAR(100), --表名 [/align]
[align=left] @Fields INT,--字段數 [/align]
[align=left] @Ver INT --SQL SERVER的版本号  [/align]
[align=left] [/align]
[align=left] BEGIN TRAN[/align]
[align=left] [/align]
[align=left] --1.1刪除已經不存在的表[/align]
[align=left] DELETE dbo.TableDescription[/align]
[align=left] WHERE TABLENAME NOT IN (SELECT SCHEMA_NAME(uid)+'.'+NAME[/align]
[align=left] FROM SYSOBJECTS[/align]
[align=left] WHERE TYPE = 'U')[/align]
[align=left] [/align]
[align=left] --1.2將新增的表插入到:TableDescription[/align]
[align=left] INSERT INTO dbo.TableDescription[/align]
[align=left] (TABLENAME)[/align]
[align=left] SELECT schema_name(uid)+'.'+NAME[/align]
[align=left] FROM SYSOBJECTS[/align]
[align=left] WHERE TYPE = 'u'[/align]
[align=left] AND schema_name(uid)+'.'+NAME NOT IN (SELECT TABLENAME[/align]
[align=left] FROM dbo.TableDescription)[/align]
[align=left] [/align]
[align=left] --2.更新表結構到FieldDescription[/align]
[align=left] SELECT TABLENAME =SCHEMA_NAME(d.uid)+'.'+ OBJECT_NAME(A.ID),[/align]
[align=left] SN = A.COLORDER,[/align]
[align=left] FIELDNAME = A.NAME,[/align]
[align=left] FIELDTYPE = B.NAME,[/align]
[align=left] PREC = CASE B.NAME [/align]
[align=left] WHEN 'nvarchar' THEN A.LENGTH / 2[/align]
[align=left] ELSE A.LENGTH[/align]
[align=left] END,[/align]
[align=left] SCALE = CASE [/align]
[align=left] WHEN A.XTYPE = 61 THEN 0[/align]
[align=left] ELSE ISNULL(COLUMNPROPERTY(A.ID,A.NAME,'scale'),0)[/align]
[align=left] END[/align]
[align=left] INTO #AA[/align]
[align=left] FROM SYSCOLUMNS A[/align]
[align=left] LEFT JOIN SYSTYPES B[/align]
[align=left] ON A.XUSERTYPE = B.XUSERTYPE[/align]
[align=left] INNER JOIN SYSOBJECTS D[/align]
[align=left] ON A.ID = D.ID[/align]
[align=left] AND D.XTYPE = 'U'[/align]
[align=left] AND D.NAME <> 'dtproperties'[/align]
[align=left] LEFT JOIN SYSCOMMENTS E[/align]
[align=left] ON A.CDEFAULT = E.ID[/align]
[align=left] [/align]
[align=left] SELECT B.TABLEID,[/align]
[align=left] A.*[/align]
[align=left] INTO #BB[/align]
[align=left] FROM #AA A,[/align]
[align=left] dbo.TableDescription B[/align]
[align=left] WHERE A.TABLENAME = B.TABLENAME[/align]
[align=left] [/align]
[align=left] --导出已经不存在的字段清单[/align]
[align=left] SELECT a.FieldID[/align]
[align=left] INTO #Field[/align]
[align=left] FROM dbo.FieldDescription a left join #BB b[/align]
[align=left] ON LTRIM(STR(a.TABLEID)) + a.FIELDNAME=LTRIM(STR(b.TABLEID)) + b.FIELDNAME[/align]
[align=left] WHERE (LTRIM(STR(b.TABLEID)) + b.FIELDNAME ) IS NULL[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] --删除已经不存在的字段[/align]
[align=left] DELETE dbo.FieldDescription[/align]
[align=left] WHERE FieldID IN (SELECT FieldID[/align]
[align=left] FROM #Field)[/align]
[align=left] [/align]
[align=left] --新增的字段[/align]
[align=left] SELECT b.* INTO #NewField[/align]
[align=left] FROM dbo.FieldDescription a right join #BB b[/align]
[align=left] ON LTRIM(STR(a.TABLEID)) + a.FIELDNAME=LTRIM(STR(b.TABLEID)) + b.FIELDNAME[/align]
[align=left] WHERE (LTRIM(STR(a.TABLEID)) + a.FIELDNAME ) IS NULL[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] --插入新增的字段[/align]
[align=left] INSERT dbo.FieldDescription[/align]
[align=left] (TABLEID,[/align]
[align=left] FIELDNAME,[/align]
[align=left] FIELDTYPE,[/align]
[align=left] PREC,[/align]
[align=left] SCALE)[/align]
[align=left] SELECT TABLEID,[/align]
[align=left] FIELDNAME,[/align]
[align=left] FIELDTYPE,[/align]
[align=left] PREC,[/align]
[align=left] SCALE[/align]
[align=left] FROM #NewField[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] --获取SQL SERVER版本号[/align]
[align=left] SELECT @Ver = CONVERT(INT,SUBSTRING(@@VERSION,CHARINDEX('-',@@VERSION) + 1,CHARINDEX('.',@@VERSION) - CHARINDEX('-',@@VERSION) - 1))[/align]
[align=left] [/align]
[align=left] --只有SQL SERVER 2005及以后的版本在设计表的时候才能给字段添加说明[/align]
[align=left] IF @Ver >= 9[/align]
[align=left] BEGIN[/align]
[align=left] SELECT TABLENAME =SCHEMA_NAME(c.uid)+'.'+ OBJECT_NAME(B.MAJOR_ID),[/align]
[align=left] FIELDNAME = A.NAME,[/align]
[align=left] B.VALUE[/align]
[align=left] INTO #CC[/align]
[align=left] FROM SYS.COLUMNS A,[/align]
[align=left] SYS.EXTENDED_PROPERTIES B,[/align]
[align=left] SYSOBJECTS C[/align]
[align=left] WHERE A.OBJECT_ID = B.MAJOR_ID[/align]
[align=left] AND A.COLUMN_ID = MINOR_ID[/align]
[align=left] AND a.object_id=c.id[/align]
[align=left] [/align]
[align=left] UPDATE C[/align]
[align=left] SET C.FDESCRIPTION = CONVERT(NVARCHAR(100),A.VALUE)[/align]
[align=left] FROM #CC A,[/align]
[align=left] dbo.TableDescription B,[/align]
[align=left] dbo.FieldDescription C[/align]
[align=left] WHERE A.TABLENAME = B.TABLENAME[/align]
[align=left] AND B.TABLEID = C.TABLEID[/align]
[align=left] AND A.FIELDNAME = C.FIELDNAME[/align]
[align=left] [/align]
[align=left] END[/align]
[align=left] [/align]
[align=left] IF @@ERROR <> 0[/align]
[align=left] ROLLBACK TRAN[/align]
[align=left] ELSE[/align]
[align=left] COMMIT TRAN[/align]
[align=left] [/align]
[align=left] SET NOCOUNT OFF[/align]
[align=left] [/align]
[align=left]GO[/align]
[align=left] [/align]
[align=left] [/align]

执行存储过程:
sp_UpdateDD 时更新上述两表的相关信息。
可以在[选项]的[键盘]里面设置快捷方式Ctrl+4

如果是SQL SERVER 2005可以直接将注释写在字段的说明里面。

查看表信息时执行存储过程:
sp_HelpTable 参数:@TableName
可以在[选项]的[键盘]里面设置快捷方式 Ctrl +5
代码如下:

[align=left]USE master[/align]
[align=left]GO[/align]
[align=left] [/align]
[align=left]IF EXISTS(SELECT * FROM sysobjects WHERE NAME='sp_HelpTable' AND type='P' AND SCHEMA_NAME(uid)='dbo')[/align]
[align=left] DROP PROC dbo.sp_HelpTable[/align]
[align=left]GO[/align]
[align=left] [/align]
[align=left] [/align]
[align=left]/*************************[/align]
[align=left]PROC:sp_HelpTable [/align]
[align=left]CREATE BY:Mark Yao [/align]
[align=left]CREATE Date:2008/1/19[/align]
[align=left]USE:更新資料字典 [/align]
[align=left]INPUT:@TableName 表名[/align]
[align=left]OUTPUT:[/align]
[align=left]Table List:[/align]
[align=left] [TableDescription]:表描述[/align]
[align=left] [dbo.FieldDescription]:字段描述[/align]
[align=left]Eg:Exec sp_HelpTable 'TableDescription' [/align]
[align=left] Exec sp_HelpTable 'dbo.FieldDescription' [/align]
[align=left]*************************/[/align]
[align=left]CREATE PROC dbo.sp_HelpTable([/align]
[align=left] @TableName NVARCHAR(50))[/align]
[align=left]AS[/align]
[align=left] BEGIN[/align]
[align=left] SET NOCOUNT ON[/align]
[align=left] [/align]
[align=left] --定义表的拥有者、表名、分隔符的位置[/align]
[align=left] DECLARE @tbOwner NVARCHAR(50),@tbName NVARCHAR(50),@Index INT[/align]
[align=left] SELECT @Index=CHARINDEX('.',@TableName)[/align]
[align=left] SELECT @tbOwner=CASE @Index[/align]
[align=left] WHEN 0 THEN (SELECT TOP 1 SCHEMA_NAME(uid) FROM Sysobjects[/align]
[align=left] WHERE name=@TableName and Type='U')[/align]
[align=left] ELSE Left(@TableName,@Index-1) [/align]
[align=left] End[/align]
[align=left] ,@tbName=CASE @Index[/align]
[align=left] WHEN 0 THEN @TableName[/align]
[align=left] ELSE Right(@TableName,len(@TableName)-@Index)[/align]
[align=left] END[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] --查看表信息[/align]
[align=left] SELECT *[/align]
[align=left] FROM dbo.TableDescription[/align]
[align=left] WHERE TABLENAME = @tbOwner+'.'+@tbName[/align]
[align=left] [/align]
[align=left] --查看字段信息 [/align]
[align=left] SELECT A.*,[/align]
[align=left] B.FDescription,[/align]
[align=left] B.FDescription_en[/align]
[align=left] FROM (SELECT TableName = CASE [/align]
[align=left] WHEN A.COLORDER = 1 THEN D.NAME[/align]
[align=left] ELSE ''[/align]
[align=left] END,[/align]
[align=left] FieldSN = A.COLORDER,[/align]
[align=left] FieldName = A.NAME,[/align]
[align=left] IsIdentity = CASE [/align]
[align=left] WHEN COLUMNPROPERTY(A.ID,A.NAME,'IsIdentity') = 1 THEN '√'[/align]
[align=left] ELSE ''[/align]
[align=left] END,[/align]
[align=left] PrimaryKey = CASE [/align]
[align=left] WHEN EXISTS (SELECT 1[/align]
[align=left] FROM SYSOBJECTS[/align]
[align=left] WHERE XTYPE = 'PK'[/align]
[align=left] AND PARENT_OBJ = A.ID[/align]
[align=left] AND NAME IN (SELECT NAME[/align]
[align=left] FROM SYSINDEXES[/align]
[align=left] WHERE INDID IN (SELECT INDID[/align]
[align=left] FROM SYSINDEXKEYS[/align]
[align=left] WHERE ID = A.ID[/align]
[align=left] AND COLID = A.COLID))) THEN '√'[/align]
[align=left] ELSE ''[/align]
[align=left] END,[/align]
[align=left] Type = B.NAME,[/align]
[align=left] Prec = COLUMNPROPERTY(A.ID,A.NAME,'PRECISION'),[/align]
[align=left] Scale = ISNULL(COLUMNPROPERTY(A.ID,A.NAME,'Scale'),0),[/align]
[align=left] [IsNull] = CASE [/align]
[align=left] WHEN A.ISNULLABLE = 1 THEN '√'[/align]
[align=left] ELSE ''[/align]
[align=left] END,[/align]
[align=left] [Default] = ISNULL(E.TEXT,'')[/align]
[align=left] FROM SYSCOLUMNS A[/align]
[align=left] LEFT JOIN SYSTYPES B[/align]
[align=left] ON A.XUSERTYPE = B.XUSERTYPE[/align]
[align=left] INNER JOIN SYSOBJECTS D[/align]
[align=left] ON A.ID = D.ID[/align]
[align=left] AND D.XTYPE = 'U'[/align]
[align=left] AND D.NAME <> 'dtproperties'[/align]
[align=left] LEFT JOIN SYSCOMMENTS E[/align]
[align=left] ON A.CDEFAULT = E.ID[/align]
[align=left] WHERE D.NAME = @tbName AND SCHEMA_NAME(d.uid)=@tbOwner ) A,[/align]
[align=left] (SELECT B.FieldName,[/align]
[align=left] B.FDESCRIPTION,[/align]
[align=left] B.FDESCRIPTION_EN[/align]
[align=left] FROM dbo.TableDescription A,[/align]
[align=left] dbo.FieldDescription B[/align]
[align=left] WHERE A.TABLENAME =@tbOwner+'.'+@tbName AND[/align]
[align=left] A.TABLEID = B.TABLEID) B[/align]
[align=left] WHERE A.FieldName = B.FieldName[/align]
[align=left] ORDER BY A.FieldSN[/align]
[align=left] [/align]
[align=left] SET NOCOUNT OFF[/align]
[align=left] [/align]
[align=left] END[/align]
[align=left] [/align]
GO

这样我们以后如果只需要在表清单(TableDescription)里面添加或修改中文说明就可以了。

因时间关系,这次就写到这里,欢迎大家讨论.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: