Dúvida - Alteração de synonyms e grants

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
souldeath
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Qua, 25 Ago 2010 9:39 am
Localização: Limeira

Informações do Ambiente:
* Versão do Oracle: 11g Enterprise Edition Release 11.1.0.6.0
* Sistema Operacional: Windows Server 2003

Eu tenho 2 schemas assim: MATRIZ e FILIAL, o usuario Matriz dá grants de select, update... para o usuario Filial que possui synonyms para acessar essas tabelas.
Foi realizado um export desses 2 usuarios para criar um ambiente de testes: MATRIZ_TEST e FILIAL_TEST.
Depois de realizada a importação o usuário MATRIZ_TEST tem os grants para o usuario FILIAL(esses devem ser alterados para FILIAL_TEST). O usuário FILIAL_TEST possui synonyms apontando para o usuário MATRIZ(esses devem apontar agora para MATRIZ_TEST).

Nunca fiz algo assim, tentei montar um script para fazer isso, mas algumas packages não consegui compilar porque da um erro de que a tabela não existe, mas o sinônimo está criado. Está certo isso que estou tentando fazer?

Selecionar tudo

DECLARE
  v_GRANTEE NUMBER;
  v_SEQ     NUMBER;
BEGIN
  --ALTERANDO OS SINONIMOS
  FOR X IN (SELECT o.obj# obj, o.name name, s.owner owner
                    FROM sys.syn$ s, sys."_CURRENT_EDITION_OBJ" o
                 WHERE o.obj# = s.obj#
                     AND o.type# = 5
                     AND o.owner# = (SELECT USER#
                                                  FROM USER$
                                                WHERE NAME = 'FILIAL_TEST')) LOOP
    UPDATE sys.syn$
          SET OWNER = 'MATRIZ_TEST'
     WHERE obj# = X.obj;
  END LOOP;

  --USUARIO QUE IRA RECEBER OS GRANTS
  SELECT USER#
      INTO v_GRANTEE
     FROM USER$
   WHERE NAME = 'FILIAL_TEST';

  --REPLICANDO GRANTS
  FOR X IN (SELECT OA.OBJ# OBJ, OA.GRANTOR# GRANTOR, OA.SEQUENCE# OASEQ,
                   O.NAME oname, TPM.NAME privname, UR.NAME ugo, UE.NAME uge
              FROM sys.objauth$ oa, sys."_CURRENT_EDITION_OBJ" o, sys.user$ u,
                   sys.user$ ur, sys.user$ ue, table_privilege_map tpm
             WHERE oa.obj# = o.obj#
               AND oa.grantor# = ur.user#
               AND oa.grantee# = ue.user#
               AND oa.col# IS NULL
               AND oa.privilege# = tpm.privilege
               AND u.user# = o.owner#
               AND ur.name = 'MATRIZ_TEST'
               AND ue.name = 'FILIAL') LOOP

    --Atualiza com o novo usuário
    UPDATE objauth$
       SET GRANTEE# = v_GRANTEE
     WHERE OBJ# = X.OBJ
       AND SEQUENCE# = X.OASEQ;

  END LOOP;

  COMMIT;
END;
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Caracas!
Você nunca deveria fazer updates nas tabelas internas do Oracle :-S
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Souldeath,

Concordo com o alerta do DR_Gori. Jamais tente editar as tabelas do dicionário de dados da ORACLE, pois você corre o risco de corromper a instância do banco de dados.

No site do ASKTOM você pode consultar um artigo que lhe dá algumas sugestões para copiar um schema para outro, garantindo que os GRANTS e SYNONYMS possam ser replicados:

http://asktom.oracle.com/pls/asktom/f?p ... 0346718343

A idéia é você usar a package DBMS_METADATA para obter os comandos DDL para criação de usuários, grants e sinônimos. Você deve executar esta package no schema de ORIGEM para obter os scripts de criação.

Depois, você deve editar cada um deles, alterando os usuários de ORIGEM pelos de DESTINO, para depois aplicar os mesmos no schema de DESTINO.

Se achar que fica muito complicado, você pode então tentar um usar um produto "gratuito", de nome DDL WIZARD (http://www.ddlwizard.com).

Com este produto você deve adotar o seguinte plano de ação:
1) EXPORT individual do schema de ORIGEM, com opção ROWS=N;
2) Utilizar o DDL_WIZARD para ler o arquivo DMP gerado;
3) Com o DDL_WIZARD, gerar os scripts DDL em um diretório a parte;
4) O que nos interessa aqui são os scripts de GRANT e SYNONYMS. Abrir cada um deles e fazer um replace do nome do usuário do schema ORIGEM pelo schema de DESTINO. Salvar os scripts;
5) EXPORT individual do schema de ORIGEM, com opção ROWS=Y;
6) IMPORT individual do dump para um schema de DESTINO (certifique-se que o schema já esteja limpo de tabelas e demais objetos que serão criados pelo DUMP);
7) Aplicar os scripts editados no passo 4;
Abraços e boa sorte,

Sergio Coutinho
leandrogsi
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Qua, 18 Mar 2009 4:19 pm
Localização: Paraiso do Norte - PR

Olá,
Como usuário System crie synonyms publicos no schema desejado.

Selecionar tudo

select 'create or replace public synonym '||table_name||' for '||owner||'.'||table_name||';'
  from dba_tables
where owner = upper('&SCHEMA')
;
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

@souldeath

Faça export/import via Datapump. Se o usuário FILIAL tiver o privilégio CREATE SYNONYM você não precisa se preocupar com isso. Verifique antes de fazer o export se ele tem esse privilégio.

Outra coisa, por questões de segurança EVITE SINÔNIMOS PÚBLICOS.

[]s
souldeath
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Qua, 25 Ago 2010 9:39 am
Localização: Limeira

Nossa, nem lembrava desse tópico mais :shock: , mas obrigado pelas respostas, agora já sei como solucionar esse tipo de problema.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes