注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

等闲识得东风面,万紫千红总是春!

 
 
 

日志

 
 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本  

2008-11-26 12:50:27|  分类: Sybase |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

PowerDesigner是Sybase公司著名的产品,我从16-bit的Windows开始,就接触并使用这个工具,应该说是有很深的感情。PowerDesigner是DBA和软件架构师设计的利器,随着版本的不断升级,PowerDesigner提供了更多更强大的功能。仅以本篇为开始,向大家介绍一些PowerDesinger中的使用技巧,帮助大家更好地更有效率地使用这个CASE工具。

问题的提出

我曾经在很多网上看到有朋友问起,在PowerDesignerPhysical Model design中,除了Oracle外,选择其他数据库模型,最后生成建数据库脚本的时候,不会自动生成记录表和列注释信息的数据库脚本代码。

请允许我先解释一下这个问题的概念,我们通过PowerDesigner设计oracle数据库,最后得到的脚本可以像下面这样,其中的comment语句就是我上面指出的在oracle中保存注释信息的脚本语句,在oracle中执行后,可以通过查询oracle的数据字典得到这些信息。这样做的好处是,以后查看表结构比较方便,不需要从数据库文档资料中去寻找了,对于团队开发来说,有应用的意义。

/*===============================================*/

/* Table: EMP                                                   */

/*==============================================*/

create table EMP  (

   "EmpID"              NUMBER,

   "EmpName"            VARCHAR2(50),

   SEX                  CHAR(1)

)

/

comment on table EMP is '职员信息'

/

comment on column EMP."EmpID" is '职员编号'

/

comment on column EMP."EmpName" is '职员姓名'

/

comment on column EMP.SEX is '性别  F:  M:'

/

SQL Server也有这样的语句,但是,大家往往发现选择了数据库模型是SQL Server,在自动生成建库脚本的时候,即使你选上了生成comment语句的选项,powerdesigner也不会帮你自动生成,是PowerDesigner不支持SQL Server么,答案显然是否定的。

问题的解决

PowerDesigner这个工具可以支持任何一种关系型数据库的模型设计,因为,在PowerDesigner中每一种数据库模型的特性定义都存储在一个xdb文件中,我们可以在[PowerDesigner_Install_Home]/Resource Files/DBMS下可以找到。当然,我们也可以自己创建一个新的xdb,定义好我们想支持的数据库模型的特性。明白了这一点,这个问题的答案就显而易见。

下面我就简单地说明一下,我使用的是PowerDesinger9.5企业版。Sybase有些简化版本(SQL Moduler)就不能自定义xdb,请大家注意。

1 从菜单TOOLS->RESOUCES->DBMS,进入自定义数据模型,参见图1

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

1

2 PowerDesigner弹出一个对话框,列表框中列出了当前PowerDesigner支持的

数据库模型(图2)。我们选择创建一个新的。输入名字SQL SERVER 2000(EXTENDED),选择从现有的SQL SERVER 2000复制,这样SQL SERVER 2000(EXTENDED)就包含了原来SQL SERVER2000模型拥有的所有特征(图3)。

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

                        2

 

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

                       图3

3 接下来,我们就需要为SQL Server 2000(Extended)添加支持自动生成表和列注释代码的特性。PowerDesinger把定义的特性用树状结构组织了起来(4),本篇要做的工作就是定义Script代码特征。我们需要修改Script\Objects\Table\TableCommentScript\Objects\Column\ColumnComment中的脚本特征代码。

4 SQL Server 2000在数据库中保存表和列注释是通过调用系统存储过程sp_addextendedproperty来做的。那么我们只需要,分别写上

表级的注释代码是:
EXECUTE sp_addextendedproperty N'MS_Description', N'%COMMENT%', N'user', N'%OWNER%', N'table', N'%TABLE%', NULL, NULL

列级的注释代码是
EXECUTE sp_addextendedproperty N'MS_Description', N'%COMMENT%', N'user', N'%OWNER%', N'table', N'%TABLE%', N'column', N'%COLUMN%'

大家看看这些代码,立刻就明白是怎么回事了(5)%COMMENT%之类的就是相当于替换变量,PowerDesigner在生成脚本的时候自动替换设计模型中替换变量的值。

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

4

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

5

5 保存SQL Server 2000(Extended)成一个xdb文件。

6 现在,我们可以创建一个新的Physical Data Model了,数据库模型选SQL Server 2000(Extended)。建立一个表,需要提醒的是,一定要指定一个数据库使用者,一般用dbo(图6)。我们可以为表和列都添加上注释。

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

6

7 生成建库脚本,菜单Databases->Generate Database。在图7所示的对话框中,注意要选中comment选项。点击确定,就得到最终的建库脚本。打开看看,我们看到了PowerDesinger根据我们告诉它的规则生成了对应的代码

EXECUTE sp_addextendedproperty N'MS_Description', N'雇员信息', N'user', N'dbo', N'table', N'Employee', NULL, NULL

go

EXECUTE sp_addextendedproperty N'MS_Description', N'主键ID,自动增加', N'user', N'dbo', N'table', N'Employee', N'column', N'EmployeeID'

go

….

8 我们在SQL Server 2000中执行这个角本,然后通过EntERPrise Manager可以看到这些注释。

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

 

7

 

让PowerDesigner支持自动生成含SQL Server 2000的表和列注释的脚本 - 才人 - 我的博客

 

8

反向工程中对列级也生成注释
   同样操作上面的步骤
   在Script-Object-Column 在Column下找到 SqlListQuery,在值中输入保存
   {OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOMAIN, DEFAULT, COMMENT, ExtIdentityIncrement, ExtIdentitySeed}

select
u.name,
o.name,
c.colid,
c.name,
case when (s.usertype < 100) then s.name else x.name end,
c.prec,
c.length,
c.scale,
z.text ,
case (c.status & 8) when 8 then 'NULL' else 'NOTNULL' end,
case (c.status & 128) when 128 then 'identity' else '' end,
case when (s.usertype < 100) then '' else s.name end,
v.text,
CONVERT(varchar, ISNULL(p.[value], '')) AS text,
case (c.status & 128) when 128 then ident_incr(u.name + '.' + o.name) else null end,
case (c.status & 128) when 128 then ident_seed(u.name + '.' + o.name) else null end
from
dbo.sysusers u
join dbo.sysobjects o on (o.uid = u.uid and o.type in ('U', 'S', 'V'))
join dbo.syscolumns c on (c.id = o.id)
left outer join sysproperties p on c.id = p.id and c.colid = p.smallid
left outer join dbo.systypes s on (c.usertype = s.usertype and s.xtype = c.xtype and c.usertype >= 0)
left outer join dbo.systypes x on (s.usertype > 100 and s.xtype = x.xtype and x.usertype not in (0, 18, 80) and x.usertype < 100)
left outer join dbo.syscomments z on (z.id = o.id and z.number = c.colid)
left outer join dbo.sysobjects d on (d.id = c.cdefault and d.category <> 0)
left outer join dbo.syscomments v on (v.id = d.id)
where 1 = 1
[ and u.name = %.q:OWNER%]
[ and o.name=%.q:TABLE%]
order by 1, 2, 3

小结

通过这个实践,我们可以了解PowerDesigner是如何处理不同数据库的SQL语法差异的,这和我们开发应用中的参数文件的思路基本一致。同时,还需要注意的是首先要指定表的owner为DBO,然后还要把当前DBMS的script/objects/user下的create和drop的值删除掉才可以

  评论这张
 
阅读(549)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017