2010-11-02 52 views
3

我正在寻找如何在我的项目目录中最好地组织新的Oracle模式和相关文件的建议 - 包括序列,触发器,DDL等。我一直在使用一个名为schema.sql的monolothic文件一段时间,但我想知道是否有最佳做法?像...构建Oracle DB;好的目录布局

database/ 
    tables/ 
     person.sql 
     group.sql 
    sequences/ 
     person.sequence 
     group.sequence 
    triggers/ 
     new_person.trigger 

便士为您的想法或我可能错过了一个URL!

谢谢!

+1

你可以看看liquibase http://www.liquibase.org/tutorial-using-oracle采取的方法 – crowne 2011-12-06 15:38:21

回答

3

按对象类型存储DDL是一种合理的方法 - 任何事情都可能比整体SQL脚本更容易导航。但个人而言,我宁愿按功能组织DDL。例如,如果您正在构建会计系统,则可能需要一系列对象来管理应付帐款和一组单独的对象以管理应收帐款以及一些用于管理总帐科目的核心对象。这将导致一些沿

database/ 
    general_ledger/ 
    tables/ 
    packages/ 
    sequences/ 
    accounts_receivable/ 
    tables/ 
    packages/ 
    sequences/ 
    accounts_payable/ 
    tables/ 
    packages/ 
    sequences 

行由于系统变得更加复杂,层次自然会随着时间的推移更深。这种方法更自然地反映了非数据库代码存储在源代码控制中的方式。你不会的Java类的一个目录中的目录结构像

middle_tier/ 
    java/ 
    Foo.java 
    Bar.java 

您将组织从实现业务逻辑的不同位的类都实现了同样类型的业务逻辑的共同和独立的类。

2

需要考虑的一件事是那些可以充当'仅限最新'脚本的SQL。这些包括CREATE或REPLACE PROCEDURE/FUNCTION/TRIGGER等。您运行最新版本,并且您不担心数据库中以前可能存在的内容。

另一方面,您有表格,您可以从CREATE TABLE开始,随后是几个ALTER TABLE作为对模式演变的更改。如果您正在进行升级,您可能需要应用几个ALTER TABLE脚本(最好按顺序)。

我会反对'功能分组',除非它真的很明显在哪里画线。你可能不想处于一个组中有USERS表的位置,另一个位置是USER_AUTHORITIES,第三个位置是AUTHORITY组。

如果你确实有很好的分离,那么它们可能在单独的模式中,并且你希望保持模式不同(因为你可以在不同的模式中具有相同的对象名称)。

0

按对象类型排列,在数据库目录下添加“模式”目录很适合我。

我已经与具有附加分层功能的源代码管理系统一起工作 - 如果有许多对象,如果您试图交叉引用源代码管理文件和您的对象在通常按类型对对象进行分组的数据库GUI导航器中查看。如何以这种方式分类对象也并不总是清楚。

考虑为该模式对其他模式或角色授予的授予添加“授予”目录,每个受让人有一个文件。如果您有“基于规则的”授予,例如“APPLICATION_USER角色总是在所有模式X的表上获得SELECT”,则编写一个PL/SQL匿名块来执行此操作。(您可能会试图通过某种临时方法对授权进行逆向工程,但在将新表或视图添加到应用程序时很容易错过某些内容)。

标准化所有脚本的分隔符,并且如果您通过Ant等构建实用程序开始部署,则会使您的生活更轻松。使用“/”(vs.“;”)既适用于SQL语句,也适用于PL/SQL匿名块。

0

在我们的项目中,我们使用有些组合法:我们有计划的子文件夹中的一个核心为根,其他功能:

root/ 
    plugins/ 
    auth/ 
    mail/ 
    report/ 

在所有这些文件夹,我们有两个DDL和DML脚本几乎所有这些脚本都可以运行一次,例如所有包都定义为create or replace...,所有数据插入脚本都会检查数据是否已经存在等等。这让我们有机会几乎所有的脚本都没有想到我们会崩溃。

显然,这种情况不能应用于create table和类似的声明。对于这些脚本,我们手动编写了一个小型bash脚本,用于提取指定的文件,并在特定的ORA错误时运行它们,例如:ORA-00955: name is already used by an existing object

而且所有文件都混在了目录,但与扩展不同:.seq无二序列,.tbl无二表,.pkg无二封装接口,.bdy无二封装体,.trg去触发的等等...

另外,我们有一个命名约定,表示我们的所有文件的前缀:我们可以cl_oper.tblcl_oper.seqcl_oper.trg序列和触发器和cl_oper_processing.pkg连同cl_oper_processing.bdy与提及的目的逻辑。在文件管理器中使用这种命名约定,可以很容易地看到与我们的项目的某些逻辑单元相关的所有文件(而按目标类型在目录中分组时不提供此功能)。

希望这些信息能以某种方式帮助你。如果您有任何问题,请留下评论。