我们在Oracle生产环境中有一个计划任务,它运行一个存储过程来在dev和prod中的相同模式之间复制数据。 (这是一个解决业务问题的临时解决方案,直到我们的开发人员有时间正确解决它。)
我们通过从prod复制清理数据来定期刷新我们的开发和测试环境。该副本包括任务和存储过程。如果存储过程在除生产中的服务器之外的任何服务器上运行,我们就有可能破坏数据,因此我必须记得告诉DBA在开发和测试中禁用该任务。
有没有办法(通过pl / sql?)阻止存储过程在我们的生产环境之外运行?
作为故障保护,该过程使用未在dev或test中定义的别名,我宁愿避免产生的错误。
答案 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_name
,service_name
或host
。
在任何情况下,如果您操作分布式生产环境 - RAC,DataGuard等,请务必小心。此外,这样的断言会给测试带来问题。它可能是interesting。