`

Powerdesigner逆向工程生成PDM时的列注释(ColumnComment)解决方案

 
阅读更多

在用powerdesigner逆向工程生成PDM时,列注释(ColumnComment)始终无法生成,历经数小时的探索,找到一个折衷的方法,现分享如下。并希望有高手指点更好的方法。

邀月使用的是Powerdesigner 15.2,数据库为SQL Server 2008 r2

方法如下:

1、在PowerDesigner界面-File-Reverse Engineer-Database,然后选择一个DBMS,我这里选取一个由系统默认的SQL Server 2008 DBMS修改而来的SQL_2008_MyDefine。

邀月工作室

选好odbc,输入正确的连接串,选择数据库及表。

邀月工作室

生成效果:Name为英文,且Comment列为空。

邀月工作室

而我们希望的是Name列为中文,Comment为中文。

查看了下在线帮助,发现在SQL_2008_MyDefine::Script\Objects\Column\SqlListQuery下的Value值如下:

 邀月工作室

View Code
{OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOMAIN, DEFAULT, ExtIdentitySeedInc, COMMENT, ExtCollation, ExtIdtNotForReplication, ExtDeftConstName, Sparse, FileStream, ExtRowGuidCol}select u.name, o.name, c.column_id, c.name,case when c.system_type_id in (165, 167, 231) and c.max_length = -1 then t.name + '(Max)' else t.name end, c.precision,case (c.max_length) when -1 then 0 else case when c.system_type_id in (99, 231, 239) then (c.max_length/2) else (c.max_length) end end as colnA, c.scale,case(c.is_computed) when 1 then convert(varchar(8000), (select z.definition from [%CATALOG%.]sys.computed_columns z where z.object_id = c.object_id and z.column_id = c.column_id)) else '' end as colnB,case(c.is_nullable) when 1 then 'NULL' else 'NOTNULL' end,case(c.is_identity) when 1 then 'identity' else '' end,case when(c.user_type_id <> c.system_type_id) then (select d.name from [%CATALOG%.]sys.types d where d.user_type_id = c.user_type_id) else '' end as colnC,convert(varchar(8000), d.definition),case (c.is_identity) when 1 then convert(varchar, i.seed_value) + ', ' + convert(varchar, i.increment_value) else '' end as colnD, (select convert(varchar(8000), value) from ::fn_listextendedproperty(NULL, 'user', u.name, 'table', o.name, 'column', c.name) where name = 'MS_Description') as colnE, c.collation_name,case (i.is_not_for_replication) when 1 then 'true' else 'false' end, d.name,case(c.is_sparse) when 1 then 'true' else 'false' end,case(c.is_filestream) when 1 then 'true' else 'false' end,case(c.is_rowguidcol) when 1 then 'true' else 'false' end from [%CATALOG%.]sys.columns cjoin [%CATALOG%.]sys.objects o on (o.object_id = c.object_id)join [%CATALOG%.]sys.schemas u on (u.schema_id = o.schema_id)join [%CATALOG%.]sys.types t on (t.user_type_id = c.system_type_id)left outer join [%CATALOG%.]sys.identity_columns i on (i.object_id = c.object_id and i.column_id = c.column_id)left outer join [%CATALOG%.]sys.default_constraints d on (d.object_id = c.default_object_id)where o.type in ('U', 'S', 'V')[ and u.name = %.q:OWNER%] [ and o.name=%.q:TABLE%] order by 1, 2, 3

注意该值中上面是PDM对应的列名,下面是从SQL数据库中取到的相关属性值。其中“

(select convert(varchar(8000), value) from ::fn_listextendedproperty(NULL, 'user', u.name, 'table', o.name, 'column', c.name) where name = 'MS_Description') as colnE,

”是可以取到Comment值的,可是生成的PDM为什么Comment列为空呢?尝试修改该SQL语句,将语句提取出来,也可以获取结果:

View Code
select u.name, o.name, c.column_id, c.name,case when c.system_type_id in (165, 167, 231) and c.max_length = -1 then t.name + '(Max)' else t.name end, c.precision,case (c.max_length) when -1 then 0 else case when c.system_type_id in (99, 231, 239) then (c.max_length/2) else (c.max_length) end end as colnA, c.scale,case(c.is_computed) when 1 then convert(varchar(8000), (select z.definition from sys.computed_columns z where z.object_id = c.object_id and z.column_id = c.column_id)) else '' end as colnB,case(c.is_nullable) when 1 then 'NULL' else 'NOTNULL' end,case(c.is_identity) when 1 then 'identity' else '' end,case when(c.user_type_id <> c.system_type_id) then (select d.name from sys.types d where d.user_type_id = c.user_type_id) else '' end as colnC,convert(varchar(8000), d.definition),case (c.is_identity) when 1 then convert(varchar, i.seed_value) + ', ' + convert(varchar, i.increment_value) else '' end as colnD, (select convert(varchar(8000), value) from ::fn_listextendedproperty(NULL, 'user', u.name, 'table', o.name, 'column', c.name) where name = 'MS_Description') as colnE, c.collation_name,case (i.is_not_for_replication) when 1 then 'true' else 'false' end, d.name,case(c.is_sparse) when 1 then 'true' else 'false' end,case(c.is_filestream) when 1 then 'true' else 'false' end,case(c.is_rowguidcol) when 1 then 'true' else 'false' end from sys.columns cjoin sys.objects o on (o.object_id = c.object_id)join sys.schemas u on (u.schema_id = o.schema_id)join sys.types t on (t.user_type_id = c.system_type_id)left outer join sys.identity_columns i on (i.object_id = c.object_id and i.column_id = c.column_id)left outer join sys.default_constraints d on (d.object_id = c.default_object_id)where o.type in ('U', 'S', 'V')and u.name =N'dbo' and o.name=N'Age' order by 1, 2, 3

后来发现,直接用生成表的SQL,而不是用数据库就可以生成注释。如下图:

邀月工作室

但字段类型全乱了。

邀月工作室

难道Powerdesigner真的这么弱吗?google了一下,看到官方文档:

http://manuals.sybase.com/onlinebooks/group-pd/pdd1100e/advanced/@Generic__BookTextView/1302;hf=0

里面有关于SqlListQuery的解释。

再看看上面的SQL语句,突然想到,既然可以在SQL查询出结果,那么出错一定在生成PDM的时候,

在SQL_2008_MyDefine::Script\Objects\Column中看到这么一段:

The following system variables are available: (parent table items are also available for columns) "COLNNAME" // name of the column "COLNCODE" // code of the column

将上面的Value值中上面的一行中“Comment”修改为“COLNNAME”会如何?即

{OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOMAIN, DEFAULT, ExtIdentitySeedInc, COMMENT, ExtCollation, ExtIdtNotForReplication, ExtDeftConstName, Sparse, FileStream, ExtRowGuidCol}改为

{OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOMAIN, DEFAULT, ExtIdentitySeedInc, COLNNAME, ExtCollation, ExtIdtNotForReplication, ExtDeftConstName, Sparse, FileStream, ExtRowGuidCol}

结果生成如下:

邀月工作室

同理将SQL_2008_MyDefine::Script\Objects\Table\SqlListQuery下的Value的第一行中

{OWNER, TABLE, TABLE_TYPE, Comment}的Comment改为{OWNER, TABLE, TABLE_TYPE, TNAME}

生成结果,如下:

 邀月工作室

至此,我的基本目的,已经达到了,虽然没有直接生成Comment列,但可以通过以下vbs脚本,从Name列生成Comment列:

'代码一:将name生成comment的脚本

View Code
Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl 'the current model 'get the current active model Set mdl = ActiveModel If (mdl Is Nothing) Then MsgBox "There is no current Model" ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then MsgBox "The current model is not an Physical Data model." Else ProcessFolder mdl End If 'This routine copy name into code for each table, each column and each view 'of the current folder Private sub ProcessFolder(folder) Dim Tab 'running table for each Tab in folder.tables if not tab.isShortcut then tab.comment = tab.name Dim col 'running column for each col in tab.columns col.comment= col.name next end if next Dim view 'running view for each view in folder.Views if not view.isShortcut then view.comment = view.name end if next 'go into the sub-packages Dim f 'running folder For Each f In folder.Packages if not f.IsShortcut then ProcessFolder f end if Next end sub

仔细思索:为什么从SQL生成的脚本有Comment,可是到生成PDM时为什么没有转化成功呢?是否Comment名称不对应?

于是将原来的COMMENT加上COLNNAME,同时在下面的SQL语句中增加一列与COMMENT相同的值:

(select convert(varchar(8000), value) from ::fn_listextendedproperty(NULL, 'user', u.name, 'table', o.name, 'column', c.name) where name = 'MS_Description') as colnF,

如下图:

邀月工作室

这样,Name列和Comment同时生成,终于OK!

邀月工作室

邀月注:本文版权由邀月和博客园共同所有,转载请注明出处。
分享到:
评论

相关推荐

    powerdesigner,将name自动填充到注释(comment)。

    PowerDesigner是一款强大的数据库设计工具,它允许用户进行概念数据模型(CDM)、物理数据模型(PDM)以及数据库逆向工程等多种操作。在数据库建模过程中,为表、字段等对象添加注释(Comment)是十分重要的,因为它...

    PowerDesigner连接mysql逆向生成PDM及相关问题

    本文主要介绍如何使用PowerDesigner 16.5与MySQL数据库配合,进行逆向工程操作,生成PDM(Physical Data Model),以及解决在过程中可能出现的问题。 首先,你需要确保已经安装了PowerDesigner 16.5,可以从提供的...

    PowerDesigner中显示name,code,comment的解决方法

    PowerDesigner是一款功能强大的数据模型设计工具,但是在某些版本中,视图不支持同时显示name、code、comment(列注释)。本文档将介绍如何在PowerDesigner中显示name、code、comment,解决了这个问题。 问题描述:...

    PowerDesigner中自动生成sqlserver字段备注

    然而,在使用PowerDesigner生成SQL Server数据库时,一个常见的痛点是,默认情况下,它不会自动为数据库字段添加备注或注释,这在后续的数据库维护和理解上造成了一定的不便。本文将详细介绍如何在PowerDesigner中...

    PowerDesigner 中将Comment(注释)及Name(名称)内容互相COPY的VBS代码

    在 PowerDesigner 物理数据模型 (PDM) 中,有时候需要将对象的 Name 复制到 Comment 中,尤其是在数据库生成时不能使用对象名称的情况下(例如,在 PowerDesigner 7 及更高版本中)。这通常是因为数据库生成过程会...

    使用PowerDesigner对NAME和COMMENT互相转换.docx

    另一方面,当你使用PowerDesigner的`REVERSE ENGINEER`功能从数据库反向生成PDM时,可能会发现NAME和CODE实际上是相同的,即数据库中的CODE。如果希望将数据库中Table或Column的中文Comment作为NAME,你可以使用另一...

    powerDesigner与Oracle相互倒数据技巧

    本文将详细介绍如何利用PowerDesigner实现与Oracle数据库之间的数据同步,具体包括如何批量根据对象的名称生成注释(comment),以及如何通过逆向工程将数据库中的注释赋值给物理数据模型(PDM)中的名称(name)。...

    PDM生成数据字典(Word、Html)

    - 必须勾选Name(名称)、Code(代码)、Comment(注释)、Data Type(数据类型)等字段,这些信息对于理解数据字典内容至关重要。 完成配置后,点击“下一步”。 ##### 第八步:默认下一步 继续按照默认设置前进...

    Powerdesigner使用建议(完整版) 用实体关系图进行数据库建模

    在将概念数据模型(CDM)转换为物理数据模型(PDM)时,PowerDesigner提供了丰富的选项来自定义外键索引和列名的命名模板。例如,默认的外键索引名称模板`%REFR%_FK`可以根据CDM中的关系代码动态生成,而列名模板`%.3:...

    PowerDesign配置MySQL5.0建表脚本格式.docx

    PowerDesigner是一款强大的数据库设计工具,它允许用户创建和管理数据模型,包括概念数据模型(CDM)、物理数据模型(PDM)等。在本教程中,我们将重点讨论如何使用PowerDesigner配置MySQL5.0的建表脚本格式。 首先,...

Global site tag (gtag.js) - Google Analytics