代码之家  ›  专栏  ›  技术社区  ›  dpbradley

在Oracle中实现用户定义的数据库参数/属性

  •  1
  • dpbradley  · 技术社区  · 15 年前

    好吧,问题标题可能不是最好的,但我正在寻找一种好的方法来实现Oracle数据库应用程序的一组可扩展参数,这些参数“与”主机/实例“保持在一起”。我的意思是,如果我通过克隆生产实例来创建一个测试/QA实例,那么就不需要再修改一个名/值对的Oracle表了。(例如,假设一个名为email_error_address的参数,在生产中应设置为prod_support@abc.com,在测试中应设置为qa_support@abc.com)。

    这些参数需要从数据库中运行的PL/SQL代码以及客户端代码中访问。我开始是通过重载plsql_cc_flags init参数(这不是我引以为豪的解决方案)来完成的,但是维护和解析变得越来越混乱。

    [编辑] 理想情况下,实现将允许在不重新启动实例的情况下更改列表,类似于动态可修改的init参数。

    3 回复  |  直到 15 年前
        1
  •  1
  •   APC    15 年前

    您希望为每个环境分别设置一组值。您希望这些值独立于数据,以便在从另一个实例导入数据时不会覆盖这些值。

    解决方案是使用一个外部表(如果您在9i或更高版本上)。因为外部表将数据保存在OS文件中,所以它们独立于数据库。要应用更改后的值,只需覆盖OS文件。

    您所需要做的就是确保每个环境的文件都是独立的,如果测试、QA、生产等在自己的服务器上,这就足够简单了。如果它们在同一个服务器上,则需要根据文件名或目录路径来区分它们;在这两种情况下,都可能需要发出一点DDL来在数据库刷新时更正位置。

    使用外部表的缺点是,它们可能会有一点性能开销——它们实际上是为批量加载而设计的。如果这可能是一个问题,您可以使用缓存、用户定义的命名空间或 CONTEXT . 使用将值加载到内存中 DBMS_SESSION.SET_CONTEXT() 或按需随附 ON LOGON 触发。通过包装调用检索值 SYS_CONTEXT() .因为名称空间在会话内存中,所以检索速度相当快。Ren_)Nyffenegger有一个简单的例子 语境 以下内容: check it out .

    当我写这篇文章的时候,我看到你增加了一个要求,可以随时改变事情。正如我已经说过的,使用操作系统文件很容易做到这一点,但是缓存的使用让事情变得更加困难。解决方案是使用全局可访问的 语境 . 有一个在启动时加载所有值的例程,您也可以在刷新OS文件时调用该例程。

        2
  •  0
  •   diederikh    15 年前

    您可以使用可以为每个Oracle用户(启动Oracle数据库的帐户)或每个服务器设置的环境变量。环境变量可以用 DBMS_SYSTEM.GET_ENV 程序。

        3
  •  0
  •   David    15 年前

    我倾向于使用系统参数表。如果你担心它被覆盖,把它放在它自己的模式中,并成为一个公共同义词。