Oracle:防止存储过程在生产环境之外运行

时间:2015-08-21 19:14:32

标签: oracle stored-procedures plsql

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

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

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

作为故障保护,该过程使用未在dev或test中定义的别名,我宁愿避免产生的错误。

1 个答案:

答案 0 :(得分:5)

您需要一种机制来识别正在运行该过程的数据库,最好是没有额外授权的架构可用的机制。 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;
     ....

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

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