很多人在设计数据库的过程中,通过设计CDM生成PDM导入数据库的方式设计和生成所需要的数据库。
但是事实上信息的人会发现,在导入数据库之后,打开SQL Server 2008中相关的表,点击打开查看相关的列,会发现,只有主码的列字段才会被标注出来(标注为PK),而本应该标注出来的外码却没有标注出来(正确的情况下应该标注为FK)。如下图:
通过反转,即通过将已生成的数据库反转出PDM(具体方法不再详述),和网上一些能够在数据库中体现出外码约束的数据库PDM相比较,会发现,自己设计的PDM在导入到数据库之后不能体现数据库应有的外码约束的原因如下:
打开PDM模型,在Powerdesigner中打开 model ---> References… 查看,会发现能够生成数据库中外码约束的PDM最右边Implementation属性显示为:Declarative;而不能生成外码约束的PDM的Implementation属性为:Trigger。如下图
解决方法如下:
1. 打开PDM图,点击DataBase ---> Change Current DBMS… 打开如下界面:
2. 修改数据库为Microsoft SQL Server 2000,如下图所示:
3. 再打开model(模型)---> References… 打开如下窗口,将其中的Implementation属性,全部修改为Declarative:(需要提示的是,如果没有在第二步中,将数据库的类型修改为MS SQL Server 2000的话,那么在这一步中是不能修改成功的,无论是MS SQL Server 2005还是2008,本人均已试过)
4. 然后再打开DataBase ---> Change Current DBMS…,将之前修改的数据库类型重修修改回来,即把Microsoft SQL Server 2000修改为Microsoft SQL Server 2008(或者2005)。
5. 成功完成以上步骤之后,就可以将PDM通过 DataBase ---> Database Generation,将PDM导入到数据库中,如下界面(在此界面中命名SQL文件名字以及通过那个ODBC导入到数据库中去)
6. 打开数据库,这时候可以发现,新导入的数据库中,终于出现了久违的外码约束。如下图:
另外,网上有些文章介绍说是通过Powerdesigner生成的CDM来修改,进而生成PDM,在通过PDM导入到数据库即可,据本人亲身测试,此法是行不通的,因为即便你再CDM中将Implementation属性从Trigger修改为Declarative,在生成PDM时,Powerdesigner还是会自动将Implementation属性变回Trigger。所以最后导入的数据库还是没有外码约束。(该方法具体步骤可参照链接:http://kaminlee.iteye.com/blog/1047996,具体不再详述)
该问题的一些猜测:结合Implementation属性值以及本问题的修改方法,可以猜测出,之所以会出现这种问题,其实是和数据库本身的性质有很大的关系的,即我们现在使用的SQL Server 2008(2005)不能够顺利地使用Implementation属性的Declarative值,所以只能够在将数据库类型改为SQL Server 2000之后才将Implementation属性值改为Declarative,然后在把数据库类型强制转为SQL Server 2008(2005)才能够成功。
而之所以在CDM中直接修改Implementation值为Declarative,然后在生成PDM然后在导入到数据库中这个方法不能够如愿成功,原因有可能在于,由于SQL Server 2008不能够使用Declarative值,所以在生成PDM图时,Powerdesigner会自动将Implementation属性值转为Trigger,故,此种方法不能够成行。