Alter Current Schema
Olá pessoal,
Hoje vou falar um pouco da minha ultima implantação de sistema, onde foi utilizado o alter current schema para minimizar o tempo de indisponibilidade na Produção.
Segue um exemplo simples que criei. Acredito que possa ser útil.
--
-- Simulação de sistema em produção
CREATE USER atual IDENTIFIED BY atual;
GRANT RESOURCE TO atual;
User created
Grant succeeded
--
CREATE TABLE atual.tabela(ID NUMBER(2), valor VARCHAR2(20));
INSERT INTO atual.tabela VALUES(1, 'Sistema Atual!');
CREATE PUBLIC SYNONYM tabela FOR atual.tabela;
Table created
1 row inserted
Synonym created
--
-- Simulação de novo sistema
CREATE USER novo IDENTIFIED BY novo;
GRANT RESOURCE TO novo;
User created
Grant succeeded
--
CREATE TABLE novo.tabela(ID NUMBER(2), valor VARCHAR2(20), obs VARCHAR2(50));
INSERT INTO novo.tabela VALUES(1, 'Sistema Novo!', 'Novas funcionalidades...');
Table created
1 row inserted
--
-- Usuário do sistema
CREATE USER usuario IDENTIFIED BY usuario;
GRANT CREATE SESSION TO usuario;
GRANT SELECT ON atual.tabela TO usuario;
GRANT SELECT ON novo.tabela TO usuario;
User created
Grant succeeded
Grant succeeded
Grant succeeded
--
-- Usuário utilizando o sistema atual
conn usuario/usuario
SELECT sys_context('USERENV', 'CURRENT_SCHEMA') sis FROM dual;
Connected as usuario
SIS
--------------------------------------------------------------------------------
USUARIO
--
-- Acesso via sinônimo público
SELECT * FROM tabela;
ID VALOR
--- --------------------
1 Sistema Atual!
--
-- Entrada do novo sistema em produção
ALTER SESSION SET current_schema=NOVO;
SELECT sys_context('USERENV', 'CURRENT_SCHEMA') sis FROM dual;
SELECT * FROM tabela;
Session altered
SIS
--------------------------------------------------------------------------------
NOVO
ID VALOR OBS
--- -------------------- --------------------------------------------------
1 Sistema Novo! Novas funcionalidades...
--
Com isso, o plano de retorno dessa implantação (que não gerou indisponibilidade do sistema antigo para entrar em Produção) é muito simples:
ALTER SESSION SET current_schema=ATUAL;
SELECT sys_context('USERENV', 'CURRENT_SCHEMA') sis FROM dual;
SELECT * FROM tabela;
Session altered
SIS
--------------------------------------------------------------------------------
ATUAL
ID VALOR
--- --------------------
1 Sistema Atual!
--
É possível automatizar esse “chaveamento” com trigger de logon, por exemplo:
CREATE OR REPLACE TRIGGER usuario.tg_al_current_schema
AFTER LOGON ON usuario.SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET current_schema=NOVO';
END tg_al_current_schema;
/
Para atender esse plano de implantação, é preciso espaço físico para suportar os dois ambientes, pelo menos até ter certeza que todo processo foi concluído com sucesso. Fora o controle para que apenas a nova aplicação seja utilizada, evitando movimentação de dados em duas estruturas diferentes. (no exemplo, owner ATUAL x NOVO).
Abraços