批量修改表名+schema
vb里面好像没有!=的功能?我之前疯狂报错,直到把"!=“改成了”<>";
table中的字段名,似乎用下面的界面就可以调用;
推荐找一些vbs的语法记录看一下
批量加入前缀后,所有的表名竟然有了双引号,而且是把前缀一起包起来的那种双引号,目前的解决方案是利用Ctrl+R批量替换;
😄``2021年3月11日10:31:42`
以上问题修正了,原因是因为之前在vbs里修改表名的时候,是写成了:
tabname="TK_APP.DOC_"&table.name
应该是因为那个点的原因,导致他把整个表名都包在了双引号下,因为它识别不了这种前缀schema,后来探索了一下,如果要批量加schema的话,需要利用图形界面,首先我们将上面的代码改成:
tabname="DOC_"&table.name
然后,选中表结构,右键选择properties属性,在弹出的对话框里,选择General选项卡,在下面的owner行中,新建一个用户名,这个就是schema了。
然后,在进行“Database Generation“的时候,点击”Format“选项卡,选择上”owner prefix“,
这时候再去Preview一下DDL,会发现表名已经没有引号了,变成了:
大功告成。
Informatica导出的DDL,每套create下应该加分号,否则会被解析成一整个create;
批量设置表的所有者user
上面的方法没法统一设置所有者,只能一个个右键属性来查看,下面有一个比较笨的方法:
model->tables:, 点击属性一个个改动。
--------------------------------------2021年3月18日10:19:44---------------------------------------
找到了一种更好的方式,利用vbs脚本来做:
首先要新建一个user,注意pdm中大小写敏感,一定要设置成大写的user!。
在模型上右键New,即:
然后戳user:
填写user名:
能在模型下面的Users文件夹里看到新建的user就可以,
然后在vbs脚本中设置批量修改table的属主owner:
Dim Model
set MyModel = ActiveModel
for each usr in MyModel.Users
if usr.Code = "xxx" then '在这修改属主,而且要先在PD内新建一个cbpdata用户
for each n in MyModel.Tables
set n.Owner = usr
next
exit for
end if
next
大功告成。
参考文献:PowerDesigner使用VBScript脚本设置表属主
字段名被截断
powerdesigner里,如果字段的名称太长的话,会默认被截断,比如说,
表结构里字段名是:
结果generate之后是:
这是因为powerdesigner默认的字段名长度为30,超过30之后的会被截断。
所以把字段名长度的限制改大就可以了。
Database->edit current dbms,然后修改script->objects->column->maxlen里面,value的值即可,设置大一些,直接255;
参考文献:
PowerDesigner中修改建表语句中字段长度限制
脚本执行
在tools->execute commands -> edit/run script下执行vbs脚本,我已经写好了一个自动扩容加自动加tablename前缀的,内容如下:
'*****************************************************************************
'文件:powerdesigner.ucase.VBs
'版本:1.0
'功能:遍历物理模型中的所有表,将表名、表代码、字段名、字段代码全部由小写改成大写;
' 并将序列的名和代码由小写改成大写;字段扩容;表名前缀;设定schema;
'用法:打开物理模型,运行本脚本(Ctrl+Shift+X)
'备注:
'*****************************************************************************
dim model 'current model
set model = ActiveModel
If (model Is Nothing) Then
MsgBox "There is no current Model"
ElseIf Not model.IsKindOf(PdPDM.cls_Model) Then
MsgBox "The current model is not an Physical Data model."
Else
ProcessTables model
'ProcessSequences model
End If
'*****************************************************************************
'函数:ProcessSequences
'功能:递归遍历所有的序列
'*****************************************************************************
sub ProcessSequences(folder)
'处理模型中的序列:小写改大写
dim sequence
for each sequence in folder.sequences
sequence.name = UCase(sequence.name)
sequence.code = UCase(sequence.code)
next
end sub
'*****************************************************************************
'函数:ProcessTables
'功能:递归遍历所有的表
'*****************************************************************************
sub ProcessTables(folder)
'处理模型中的表
dim table
dim user
for each user in model.Users '批量修改属主姓名,即schema
if user.Code="app" then
for each table in folder.tables
set table.owner=user
next
exit for
end if
next
for each table in folder.tables
if not table.IsShortCut then
ProcessTable table
end if
table.code = "DOC_"+UCase(table.code) '表名统一加前缀DOC_
next
'对子目录进行递归
dim subFolder
for each subFolder in folder.Packages
ProcessTables subFolder
next
end sub
'*****************************************************************************
'函数:ProcessTable
'功能:遍历指定table的所有字段,将字段名由小写改成大写,
' 字段代码由小写改成大写
' 表名由小写改成大写
'*****************************************************************************
sub ProcessTable(table)
dim col
for each col in table.Columns
'将字段名由小写改成大写
'col.code = UCase(col.code)
'col.name = UCase(col.name)
if col.length<>0 Then
col.length = col.length * 2 '字段自动扩容,翻倍
end if
next
table.name = UCase(table.name)
table.code = UCase(table.code)
end sub
2021年3月18日10:30:28 新增功能,可批量修改属主Owner,但需要提前在模型内建好对应的User。
参考文献
- Powerdesigner SqlServer转Oracle(转) 举了几个脚本的例子,但格式和讲解并不好;
- 通过编写PowerDesigner脚本功能批量修改属性 格式清晰,备注全面,虽然只是讲了一个小例子,但是五脏俱全,个人感觉,PD脚本应该有的模式它都有了;