我正在寻找有关如何在项目目录中最好地组织新的Oracle架构和相关文件的建议 - 包括序列,触发器,DDL等。我一直在使用一个名为schema.sql的monolothic文件时间,但我想知道是否有最好的做法?有点像...
database/
tables/
person.sql
group.sql
sequences/
person.sequence
group.sequence
triggers/
new_person.trigger
Penny的想法或我可能错过的网址!
谢谢!
答案 0 :(得分: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
您将组织实现相同类型的业务逻辑的类,并与实现不同业务逻辑位的类分开。
答案 1 :(得分:2)
要考虑的一个项目是那些可以充当“仅限最新”脚本的SQL。这些包括创建或替换程序/功能/触发等。您运行最新版本,并且您不担心以前在数据库中存在的内容。
另一方面,您可以使用表格开始使用CREATE TABLE,然后使用几个ALTER TABLE作为模式的更改。如果您正在进行升级,则可能需要应用几个ALTER TABLE脚本(最好按顺序)。
我反对'功能分组',除非在绘制线条的地方非常明显。您可能不希望处于一个组中有USERS表,另一组中有USER_AUTHORITIES而第三组中有AUTHORITY组的位置。
如果你确实有适当的分离,那么它们可能在单独的模式中,你确实希望保持模式不同(因为你可以在不同的模式中使用相同的对象名称)。
答案 2 :(得分:0)
逐个对象类型的安排,在数据库目录下添加“schema”目录对我来说很有用。
我使用过具有额外逐个功能层的源代码控制系统 - 如果有很多对象,如果你试图用您看到的对象交叉引用源代码控制文件,它会添加额外的搜索在数据库GUI导航器中,通常按类型对对象进行分组。它也不总是很清楚如何以这种方式对物体进行分类。
考虑为该模式向其他模式或角色添加“grants”目录,每个被授权者使用一个文件。如果您具有“基于规则”的授权,例如“APPLICATION_USER角色始终在所有模式X的表上获得SELECT”,则编写PL / SQL匿名块以执行此操作。 (在通过某种特殊方法实现授权后,您可能会对授权进行逆向工程,但在将新表或视图添加到应用程序时很容易遗漏这些授权。)
标准化所有脚本的分隔符,如果您开始通过构建实用程序(如Ant)进行部署,则可以使您的生活更轻松。使用“/”(vs.“;”)适用于SQL语句和PL / SQL匿名块。
答案 3 :(得分: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.tbl
表cl_oper.seq
和cl_oper.trg
序列和触发器以及cl_oper_processing.pkg
和{ {1}}具有提到的对象的逻辑。使用文件管理器中的这种命名约定,很容易看到所有文件都与我们项目的某些逻辑单元相关联(而目标类型的目录分组不提供此功能)。
希望这些信息可以帮助你。如果您有任何问题,请留下评论。