3

我正在寻找有关如何在我的项目目录中最好地组织新 Oracle 模式和依赖文件的建议 - 包括序列、触发器、DDL 等。一段时间以来,我一直在使用一个名为 schema.sql 的整体文件,但是我想知道是否有最佳实践?就像是...

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

一分钱你的想法或我可能错过的网址!

谢谢!

4

4 回答 4

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

您可以将实现相同业务逻辑的类组织在一起,并与实现不同业务逻辑的类分开。

于 2010-11-02T20:18:29.213 回答
2

要考虑的一项是那些可以充当“仅最新”脚本的 SQL。这些包括 CREATE OR REPLACE PROCEDURE/FUNCTION/TRIGGER 等。您运行最新版本,您不必担心数据库中以前可能存在的内容。

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

我会反对“功能分组”,除非在哪里画线真的很明显。您可能不希望处于这样的位置:一个组中有一个 USERS 表,另一个组中有一个 USER_AUTHORITIES,第三个组中有一个 AUTHORITY 组。

如果您确实有不错的分离,那么它们可能位于不同的模式中,并且您确实希望保持模式不同(因为您可以在不同的模式中拥有相同的对象名称)。

于 2010-11-02T22:08:49.430 回答
0

在我们的项目中,我们使用了某种组合的方法:我们将程序的核心作为根目录,并在子文件夹中提供其他功能:

root/
  plugins/
    auth/
    mail/
    report/

等等

在所有这些文件夹中,我们同时拥有 DDL 和 DML 脚本,几乎所有这些脚本都可以多次运行,例如,所有包都定义为create or replace...,所有数据插入脚本检查数据是否已经存在等等。这让我们有机会 rus 几乎所有的脚本,而无需考虑我们可能会崩溃。

显然这种情况不能适用create table和类似的说法。对于这些脚本,我们手动编写了小型 bash 脚本,该脚本提取指定文件并运行它们而不会因特定 ORA 错误而失败,例如:ORA-00955: name is already used by an existing object.

此外,所有文件都混合在目录中,但扩展名不同:.seq用于序列,.tbl用于表,.pkg用于包接口,.bdy用于包主体,.trg用于触发器等等......

此外,我们还有一个命名约定,表示所有文件的前缀:我们可以拥有带有序列和触发器的cl_oper.tbl表,cl_oper.seq以及所提到对象的逻辑。使用文件管理器中的这种命名约定,很容易看到与我们项目的某个逻辑单元相关联的所有文件(虽然按对象类型在目录中分组不提供这一点)。cl_oper.trgcl_oper_processing.pkgcl_oper_processing.bdy

希望这些信息对您有所帮助。如果您有任何问题,请留下评论。

于 2010-11-03T09:33:46.713 回答
0

按对象类型划分的排列,在数据库目录下方添加了一个“模式”目录,对我来说效果很好。

我使用过具有额外按功能划分层的源代码控制系统 - 如果有很多对象,如果您尝试将源代码控制文件与您在数据库中看到的对象交叉引用,它会添加额外的搜索通常按类型对对象进行分组的 GUI 导航器。也不总是清楚应该如何以这种方式对对象进行分类。

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

标准化所有脚本的分隔符,如果您开始通过 Ant 等构建实用程序进行部署,您的工作将会变得更轻松。使用“/”(相对于“;”)适用于 SQL 语句以及 PL/SQL 匿名块。

于 2010-11-03T04:29:17.440 回答