Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle中实现用户定义的db参数/属性_Oracle - Fatal编程技术网

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

在Oracle中实现用户定义的db参数/属性,oracle,Oracle,好的,这个问题的标题可能不是最好的,但是我正在寻找一种好的方法来为Oracle数据库应用程序实现一组可扩展的参数,这些参数“保留”在主机/实例中。我的意思是,如果我通过克隆生产实例来创建测试/质量保证实例,我想排除只有一个名称/值对的Oracle表需要修改的可能性。(例如,假设一个名为email\u error\u address的参数应该设置为prod_support@abc.com在生产和质量保证方面_support@abc.com在测试中) 需要从数据库中运行的PL/SQL代码以及客户端代

好的,这个问题的标题可能不是最好的,但是我正在寻找一种好的方法来为Oracle数据库应用程序实现一组可扩展的参数,这些参数“保留”在主机/实例中。我的意思是,如果我通过克隆生产实例来创建测试/质量保证实例,我想排除只有一个名称/值对的Oracle表需要修改的可能性。(例如,假设一个名为email\u error\u address的参数应该设置为prod_support@abc.com在生产和质量保证方面_support@abc.com在测试中)

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

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

您可以使用环境变量,您可以为每个oracle用户(启动oracle数据库的帐户)或每台服务器设置环境变量。可以使用
DBMS\u系统.GET\u ENV
过程读取环境变量

您希望每个环境都有一组单独的值。您希望这些值独立于数据,以便在从另一个实例导入数据时不会被覆盖

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

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

使用外部表的缺点是它们可能会有一点性能开销——它们实际上是用于批量加载的。如果这可能是一个问题,您可以使用缓存,使用用户定义的名称空间或
上下文
。使用
DBMS\u会话将值加载到内存中。按需设置上下文()
或使用登录时的
触发器设置上下文()。通过对
SYS\u CONTEXT()
的包装器调用检索值。因为名称空间在会话中,所以内存检索相当快。RenéNyffenegger有一个使用
上下文的简单示例:


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

我倾向于使用系统参数表。如果您担心它被覆盖,请将其放入自己的模式中,并将其作为公共同义词。

@APC的答案很聪明


您可以通过在外部表的顶部添加物化视图来解决性能开销。您将在RMAN克隆之后以及每次更新配置文件之后刷新它

感谢Diederik-我希望有一个解决方案不需要重新启动实例就能使更改生效-添加了一个编辑以反映这一点。感谢David-生产中的副本通常由RMAN“复制数据库”完成,所以所有的模式都被覆盖了。谢谢-我曾经考虑过外部定义的表,但没有结合上下文。