在团队中使用Oracle存储过程的工具?
在团队中,我们使用什么工具来开发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都是缓慢的过程。 (几分钟需要几千个文件)