【问题标题】:Oracle: Prevent a stored procedure from running outside of production environmentOracle:防止存储过程在生产环境之外运行
【发布时间】:2015-08-21 19:14:32
【问题描述】:

我们在 Oracle 生产环境中有一个计划任务,它运行一个存储过程来在 dev 和 prod 中的相同模式之间复制数据。 (在我们的开发人员有时间妥善解决之前,这是解决业务问题的权宜之计。)

我们通过从 prod 复制清理过的数据定期刷新我们的开发和测试环境。该副本包括任务和存储过程。如果存储过程在生产环境之外的任何服务器上运行,我们就有损坏数据的风险,所以我必须记得告诉 DBA 在开发和测试中禁用该任务。

有没有办法(通过 pl/sql?)防止存储过程在我们的生产环境之外运行?

作为故障安全,该过程使用未在 dev 或 test 中定义的别名,我希望避免生成的错误。

【问题讨论】:

  • 为什么不像检查模式名称以查看它是否是 prod 那样简单,如果不是则抛出异常?
  • 答案可能就这么简单!我可以使用 SQL,但远非专家。
  • 您可以查询 v$database 并检查 instance_name(或主机名)——我认为 Prod 和 Dev db SID 会有所不同。

标签: oracle stored-procedures plsql


【解决方案1】:

您需要一种机制来识别程序在哪个数据库上运行,最好是一种无需额外授权即可用于模式的机制。 global_name 视图符合要求。

用这样的断言开始你的例程的主调用:

 begin
     select global_name 
     into l_name
     from global_name;

     if l_name != 'PROD' then
        raise_application_error(-20000, 'Can only run this procedure in Production');
     end if;
     ....

这假定您的生产数据库有一个合理的唯一名称。如果没有,还有其他可能通过the USERENV namespace for SYS_CONTEXT() 公开的标识符,例如instance_nameservice_namehost

在任何情况下,如果您操作分布式生产环境 - RAC、DataGuard 等,请务必小心。此外,这样的断言会给测试带来问题。可能是interesting

【讨论】:

  • 作为后续...我使用了 INSTANCE_NAME (SELECT INSTANCE_NAME FROM v$instance;),因为我们所有的开发、测试和暂存环境中的 global_name 都返回“PROD”LOL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2012-12-26
  • 2011-03-20
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多