使用PowerDesigner 15进行逆向工程生成数据库图表时,列的注释问题

上一章讲了对数据库进行逆向工程生成图表操作,可能会遇到无法生成注释的问题:

一、解决PowerDesigner逆向工程没有列注释

1、打开PowerDesigner 15,选择菜单:File→Reverse Engineer→Database 对数据库进行逆向工程生成PDM图表,选择一张表生成:

              

生成后双击图表,打开表属性,选择Columns选项,可以看到注释却是空的,而数据库里的表是有注释的

          

2、选择菜单:Database→Edit Current DBMS,弹出DBMS Properties对话框,选择Script\Objects\Column\SqlListQuery

3、可以看到其Value为:

{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      c
    join [%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

原脚本

将其修改一下就可以了。

{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,
    convert(varchar(8000), e.value) 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      c
    join [%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)
    left outer join [%CATALOG%.]sys.extended_properties e on (e.class=u.schema_id and e.major_id=o.object_id and e.minor_id = c.column_id and e.name=N‘MS_Description‘)
where
   o.type in (‘U‘, ‘S‘, ‘V‘)
[  and u.name = %.q:OWNER%]
[  and o.name=%.q:TABLE%]
order by 1, 2, 3

新脚本

4、这里我为了以后还可以使用原先的脚本DBMS(也就是自带的Microsoft SQL Server 2008),我新建一个自定义的“My Microsoft SQL Server 2008”:选择菜单,Tools→Resources→DBMS,弹出List Of DBMS对话框,选择新建,弹出新建对话框,填写名称为“My Microsoft SQL Server 2008”,选择“Microsoft SQL Server 2008”从此复制,Ok,保存。

             

5、保存后,弹出DBMS Properties对话框,选择Script\Objects\Column\SqlListQuery,修改其Value就可以了,Value的值就是上面的“新脚本”的值。

6、选择File→Reverse Engineer→Database 对数据库进行逆向工程,DBMS选择刚才新建的“My Microsoft SQL Server 2008”,这样生成的表就有注释了。

                  

二、让列的Name自动设为为Comment的中文意思:

1、在刚才新建的“My Microsoft SQL Server 2008”的Script\Objects\Column中可以看到这么一段:

The following system variables are available:
(parent table items are also available for columns)
   "COLUMN"       // generated code of the column
   "COLNNO"       // position of the column in the list of columns of the table
   "COLNNAME"     // name of the column
   "COLNCODE"     // code of the column
   "PRIMARY"      // keyword "primary" if the column is primary
   "ISPKEY"       // TRUE if the column is part of the primary key
   "FOREIGN"      // TRUE if the column is part of one foreign key

2、将COLNNAME添加到Script\Objects\Column\SqlListQuery的Value中,{OWNER, TABLE, S, COLUMN, DTTPCODE, LENGTH, SIZE, PREC, COMPUTE, NOTNULL, IDENTITY, DOMAIN, DEFAULT, ExtIdentitySeedInc,COMMENT,COLNNAME, ExtCollation, ExtIdtNotForReplication, ExtDeftConstName, Sparse, FileStream, ExtRowGuidCol},再把Comment的值给它

现在生成效果就很好了:

3、也可以不用这种方式来完成Name自动设为Comment,可以利用vbs脚本完成

‘******************************************************************************
‘* File:     comment2name.vbs
‘* Purpose:  在PowerDesigner的PDM图形窗口中显示数据列的中文注释
‘* Title:    将字段的comment赋值到字段的name中
‘* Category: 打开物理模型,运行本脚本(Ctrl+Shift+X)
‘* Copyright:[email protected],2006/07/25 .
‘* Author:   foxzz
‘* Created:
‘* Modified:
‘* Version:  1.0
‘* Comment:  遍历物理模型中的所有表,将字段的comment赋值到字段的name中。
‘            在将name置换为comment过程中,需要考虑的问题
‘            1、name必须唯一,而comment有可能不唯一。
‘               处理办法是如果字段的comment重复,则字段的name=comment+1、2、3...
‘            2、comment值有可能为空,这种情况下对字段的name不处理。
‘               针对oracle数据库,将comment on column 字段名称 is ‘‘;添加到C:/pdcomment.txt文件中。
‘               在补充comment完毕后,便于在数据库中执行
‘******************************************************************************

Option Explicit
ValidationMode = True
InteractiveMode = im_Batch

Dim system, file
Set system = CreateObject("Scripting.FileSystemObject")
Dim ForReading, ForWriting, ForAppending   ‘打开文件选项
ForReading   = 1 ‘ 只读
ForWriting   = 2 ‘ 可写
ForAppending = 8 ‘ 可写并追加
‘打开文本文件
Set file = system.OpenTextFile("C:/pdcomment.txt", ForWriting, true)

‘判断当前model是否物理数据模型
Dim mdl
Set mdl = ActiveModel
If (mdl Is Nothing) Then
   MsgBox "处理对象无模型"
ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then
   MsgBox "当前模型不是物理数据模型"
Else
   ProcessFolder mdl,file
End If
file.Close

‘******************************************************************************
Private sub ProcessFolder(folder,file)

Dim i,j,k
i=0:j=0:k=0

‘列数组,记录字段里不重复的comment
Dim ColumnComment()
Dim ColumnCommentNumber()
ReDim Preserve ColumnComment(i)
ReDim Preserve ColumnCommentNumber(i)

Dim tbl   ‘当前表
Dim col   ‘当前字段
dim curComment  ‘当前字段comment

‘处理模型中的表
for each tbl in folder.tables
    if not tbl.isShortcut then
       if len(trim(tbl.comment))<>0 then
          ‘可以在这里显示table的comment
          ‘tbl.name = tbl.name+"("+trim(tbl.comment)+")"
       end if  

       ‘处理表中的列
       for each col in tbl.columns
           k = 0
           curComment = trim(col.comment)
           if len(curComment)<>0 then
              ‘遍历相异的comment数组
              for j = 0 to i
                  if ColumnComment(j) = curComment then
                     ‘如果找到相同的comment,则相关计数器加1
                     ColumnCommentNumber(j) = ColumnCommentNumber(j) + 1
                     k = j
                  end if
              Next
              ‘如果没有相同的comment,则k=0,此时ColumnCommentNumber(0)也为0
              ‘否则ColumnCommentNumber(k)不为0
              if ColumnCommentNumber(k) <> 0 then
                 col.name = curComment & cstr(ColumnCommentNumber(k))
              else
                 col.name  = curComment
                 ‘ColumnComment(0)、ColumnCommentNumber(0)永远为空
                 ‘将相异的comment记录添加到数组中
                 i = i + 1
                 ReDim Preserve ColumnComment(i)
                 ReDim Preserve ColumnCommentNumber(i)
                 ColumnComment(i) = curComment
                 ColumnCommentNumber(i) = 0
              end if
           else
              ‘写入文件中
              file.WriteLine "comment on column "+ tbl.name+"."+col.code+" is ‘‘;"
           end if
       next
    end if
    ‘由于不同表的name允许相同,因此此时重新初始化。
    ‘因为ColumnComment(0)、ColumnCommentNumber(0)为空,可以保留
    ReDim Preserve ColumnComment(0)
    ReDim Preserve ColumnCommentNumber(0)
    i=0:j=0:k=0

next

Dim view  ‘当前视图
for each view in folder.Views
    if not view.isShortcut then
       ‘可以在这里显示view的comment
       ‘view.name =  view.comment
    end if
next

‘对子目录进行递归
Dim subpackage ‘folder
For Each subpackage In folder.Packages
    if not subpackage.IsShortcut then
       ProcessFolder subpackage , file
    end if
Next

end sub

Comment2Name

选择菜单:Tools→Execute Commands→Edit/Run Script,Run运行vbs脚本即可。

 

4、将Name的值设给Comment

‘把pd中那么name想自动添加到comment里面
‘如果comment为空,则填入name;如果不为空,则保留不变,这样可以避免已有的注释丢失.

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 comment 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
    if trim(tab.comment)="" then ‘如果有表的注释,则不改变它.如果没有表注释.则把name添加到注释里面.
       tab.comment = tab.name
    end if
 Dim col ‘ running column
 for each col in tab.columns
  if trim(col.comment)="" then ‘如果col的comment为空,则填入name,如果已有注释,则不添加;这样可以避免已有注释丢失.
   col.comment= col.name
  end if
 next
  end if
 next  

 Dim view ‘running view
 for each view in folder.Views
  if not view.isShortcut and trim(view.comment)=""  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

Name2Comment

时间: 2024-10-02 09:33:43

使用PowerDesigner 15进行逆向工程生成数据库图表时,列的注释问题的相关文章

powerdesigner 15.1 逆向工程 sqlserver2008 、sqlserver2005 带注释

第一种方法:在第一个网址里面的代码可以直接赋值到对应位置即可 http://wjqe.blog.163.com/blog/static/19938452011612536439/ 第二种方法:可塑性较强,有其它的需求方向的,可以读读 http://www.cnblogs.com/downmoon/archive/2011/03/04/1971250.html

FusionCharts生成Flash图表常见问题FAQ

本文主要汇总了FusionCharts生成Flash图表时的一些常见问题(FAQ)以及解决方法/调试方法,欢迎交流! 问题描述:利用FusionCharts创建Flash图表时,能否直接从数组或recordset或webservice中提取数据? 解决方法:不可以从数组等中直接提取数据.因为 FusionCharts需要XML格式的数据.如果你从数组或recordset或webservice中提取数据的话,你需要通过Flash代码从这 些数据源中检索数据,然后在运行时状态下将它们转换成XML格式

Powerdesigner生成数据库表

标签: 杂谈 分类: 数据库技术 工具: Sybase PowerDesigner 15.1 Microsoft SQL Server 2005 第一步概要设计: 打开PowerDesigner软件,设计“概念数据模型”(Conceptual Data Model): 点击workspace 右键--->New—>Conceptual Data Model, 弹出如下界面: 设计表.表结构: 在设计属性(字段)的时候,三个字母(M.P.D)分别表示: M:是否为空:(√表示不允许为空) P:是

SyBase Powerdesigner生成数据库详细表

工具: Sybase PowerDesigner 15.1 Microsoft SQL Server 2005 第一步概要设计: 打开PowerDesigner软件,设计"概念数据模型"(Conceptual Data Model): 点击workspace 右键--->New->Conceptual Data Model, 弹出如下界面: 设计表.表结构: 在设计属性(字段)的时候,三个字母(M.P.D)分别表示: M:是否为空:(√表示不允许为空) P:是否为主键: D

PowerDesigner 15 进行 数据库反转到 数据库模型

菜单"File" - "Reverse Engineer" - "DataBase" 弹出来 New Physical Data Model 窗口 ,为模型建好名字 - 点击确定 到下一步 就是为建立 类似 jdbc连接数据库的配置文件的一个功能. 选择using a data source : 点击右侧图标 选择connection profile 填写连接的数据名称以及数据库地址 数据库登录名称和密码. 测试连接. 可以选择你要反转 数据库模

PowerDesigner生成数据库表和逆向生成表结构(MySQL数据库)

一.Download Connector/ODBC下载ODBC驱动,地址:https://dev.mysql.com/downloads/connector/odbc/, 需要注意:PowerDesigner安装的多少位就下载多少位的,一般是32位,建议下载.msi文件直接安装. 二.安装完成后点击powerdesigner的Database--->Configure Connections...--->添加数据源配置,如下图: 三.PDM模型生成数据库sql文件,点击powerdesigne

PowerDesigner中SQL文件、数据库表反向生成PDM

1      反向生成PDM 1)        创建一个空的PDM模型(选择对应的DBMS): 2)        选择[Database]--[Update Model from Database-]菜单: 1.1    使用SQL文件 1)        在新窗口选择对应[Using script files]--[(Add Files)].然后再弹出窗口选择对应的SQL文件.点击打开,完成选择. 2)        点击[确定]生成. 1.2    使用数据源 1)        选择数

【MyBatis学习15】MyBatis的逆向工程生成代码

1. 什么是逆向工程 mybatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml.mapper.Java.po..).一般在开发中,常用的逆向工程方式是通过数据库的表生成代码. 2. 使用逆向工程 使用mybatis的逆向工程,需要导入逆向工程的jar包,我用的是mybatis-generator-core-1.3.2,已经上传到下载频道了(点

PowerDesigner 16.5对SQL Server 2012 生成数据库时&quot;不支持扩展属性&quot;问题

团队合作设计一套系统数据模型,创建了PDM后,Table.View.Store Procedure等都创建好了,且创建了多个Schema方便管理这些数据库对象,但Table.view.Column等对象有Comment时(用来在团队不同成员间共享描述信息) 生成数据库时会得到一个提示"不支持扩展属性,或对象不存在",分析发现异常在类似以下语句: if exists(select 1 from sys.extended_properties p where p.major_id = ob