在团队中使用Oracle存储过程的工具?

时间:2020-03-06 14:30:49  来源:igfitidea点击:

在团队中,我们使用什么工具来开发Oracle存储过程:

  • 要自动"锁定"我们正在使用的当前过程,因此团队中没有其他人可以对其进行更改,直到我们完成操作。
  • 为了自动将我们在存储过程中所做的更改(在Oracle数据库中)发送到Subversion,CVS,...存储库

谢谢!

解决方案

Oracle的新SQL Developer具有内置的版本控制。

这是产品的链接。

http://www.oracle.com/technology/products/database/sql_developer/files/what_is_sqldev.html

http://www.oracle.com/technology/products/database/sql_developer/images/what_version.png http://www.oracle.com/technology/products/database/sql_developer/images/what_version.png

一个相对简单的(如果有点过时的)解决方案可能是使用"锁定"而不是"合并"模式的版本控制系统...。Subversion或者CVS通常使用"合并"模式(尽管我相信可以进行Subversion的开发) "锁定"文件?)

当然,"锁定"模式版本控制系统确实有其自身的缺点。

我可以想到的在Oracle中进行操作的唯一方法可能是创建触发器之前的某些操作,也许是引用一个表来查找可以在其中运行程序包的人。但是听起来有些讨厌吗?

使用Oracle SQL Developer 1.5,我们可以轻松地创建和管理与CVS或者Subversion的连接。要创建CVS连接(例如),请单击版本控制-> CVS->检出模块。我们将通过向导来创建连接(主机,用户名等),然后可以正常签入和签入过程/功能。

Toad中还提供了与CVS的集成。

Toad无需CVS / SVN也可以做到这一点。

将PL / SQL视为常规代码:将其存储在文件中,并使用版本控制工具和内部过程来管理这些文件。

如果我们还没有版本控制工具,请写下需求并选择一个。许多人似乎都在使用Subversion,它与TortoiseSVN关联为Windows上的客户端(我愿意)。

问题是:按照建议使用工具,并相应地调整过程。例如,Subversion在默认情况下使用复制-修改-合并模型,而不是我们似乎喜欢的锁定-修改-解锁模型。

就我而言,如上所述,我喜欢使用TortoiseSVN。和通常使用此工具一样:

  • 我从不锁定任何文件。这对于小型团队来说是非常容易管理的,并且需要对大型团队进行提前计划,恕我直言,这始终是一件好事。
  • 我将更改手动发送回服务器,因为...我不认为Subversion有另一种方式(另外,内部过程禁止没有消息的提交,恕我直言,这也是一件好事)。

无论我们选择哪种方式,我都建议阅读有关数据库版本控制的这篇文章(及相关文章)。

我们可能还想看看Aqua Data Studio。它们还内置了SVN,并且是出色的Stored Proc编辑器。

我不确定原始海报是否仍在监视此问题,但是我还是会问这个问题。

原始帖子要求能够:

To automatically "lock" the current
  procedure you are working with, so
  nobody else in the team can make
  changes to it until you are finished.

也许这里的问题不仅仅是产品无法"锁定"存储的过程而已,更是开发范式中的一个。每当我听到"我想锁定它,让其他人都不能更改它"时,我立即感觉到人们共享一个模式,每个人都在同一个空间中发展。

如果是这种情况,为什么不简单地让每个人都有自己的架构以及数据模型的副本?我是说认真的人,创建另一个架构不会"花费"任何东西。这样,每个开发人员都可以进行更改,直到脸色发青,而不会影响其他任何人。

我过去(在小型团队中)使用的另一个技巧是,由于大小原因,让每个开发人员都无法拥有自己的数据副本时,要有一个包含所有表和代码的主模式,并带有指向所有内容的公共同义词。然后,如果开发人员想要处理存储的proc,则只需在其架构中创建它即可。这样,Oracle名称解析将查找第一个而不是查找主架构中的副本,从而使他们能够在不影响其他任何人的情况下测试其代码。这确实有其缺点,但这是一个非常具体的案例,我们可以与它们一起生活。我绝对不会在生产中实现这样的事情。

至于第二个要求:

To automatically send the changes you
  make in the stored procedure, in an
  Oracle database, to a Subversion, CVS,
  ... repository

我很惊讶地发现那里的工具足够聪明,可以做到这一点(也许是一个机会:)。它必须连接到数据库,查询数据字典(USER_SOURCE)并提取关联的文本。对于几乎都是基于文件的源代码控制系统,这是一个很高的要求。

在寻找一种运气好的Oracle对象版本控制工具之后,我们创建了以下(虽然不完美,但合适的)解决方案:

  • 使用dbms_metadata包,我们创建Oracle服务器的元数据转储。我们为每个对象创建一个文件,因此结果不是一个巨大的文件,而是一堆文件。为了识别已删除的对象,我们将删除所有文件,然后再次创建转储。
  • 我们将所有文件从服务器复制到客户端计算机。
  • 使用Netbeans,我们可以识别更改,并将更改提交到CVS服务器(或者检查diffs ...)。任何CVS处理程序软件都可以在这里工作,但是我们已经将Netbeans用于其他目的。 Netbeans还允许创建一个ant任务来调用步骤1中提到的Oracle进程,复制步骤2中提到的文件...

这是第1步最重要的查询:

SELECT object_type, object_name, 
  dbms_metadata.get_ddl(object_type, object_name) object_ddl FROM user_objects
WHERE OBJECT_TYPE in ('INDEX', 'TRIGGER', 'TABLE', 'VIEW', 'PACKAGE', 
  'FUNCTION', 'PROCEDURE', 'SYNONYM', 'TYPE')  
ORDER BY OBJECT_TYPE, OBJECT_NAME

每个对象一个文件的方法有助于识别更改。如果我在表TTTT中添加一个字段(当然不是真实的表名),则仅会修改TABLE_TTTT.SQL文件。

步骤1和步骤3都是缓慢的过程。 (几分钟需要几千个文件)