Pular para o conteúdo
  • Este tópico contém 15 respostas, 7 vozes e foi atualizado pela última vez 11 anos, 5 meses atrás por Avatar de fabio segatofabio segato.
Visualizando 15 posts - 1 até 15 (de 16 do total)
  • Autor
    Posts
  • #105235
    Avatar de José Ricardo GarciaJosé Ricardo Garcia
    Participante

      Pessoal,

      Estou voltando do SQLServer para o Oracle e como estou meio enferrujado preciso
      de uma ajuda para identificar uma solução para meu problema.
      A situação é a seguinte:
      Em SQLServer temos várias bases diferentes com a mesma estrutura de tabelas e o
      mesmo schema (único) e todos os usuários acessam os objetos através deste
      schema. Isto é para facilitar a codificação das rotinas.
      Em Oracle, precisaria ter uma base em casa tablespace por exemplo e ter o mesmo
      nome de schema visto que o sistema agora trabalhará com os dois bancos.
      Já montei umas bases mas como o schema está vinculado ao nome do usuário,
      precisei criar sinônimos para poder acessar os objetos do schema padrão.
      Agora fica a dúvida, eu teria como ter em tablespaces diferentes a mesma
      estrutura de base (objetos) utilizando um mesmo nome de schema?

      #105237
      Avatar de marlontkmarlontk
      Participante

        Opa,
        Pelo que entendi teu problema não esta a nível de tablespace e sim quanto ao uso de schemas.

        Então pela tua descrição tu poderia ter dois schemas separadas cada um com suas tablespaces (podendo ser a mesma, mas dependendo do caso separar pode ser melhor opção)
        Ao logar no banco é possível alterar o schema onde os sqls serão “executados” sem precisar colocar o prefixo user.

        alter session set current_schema = nome;

        Teria uma esquema schema1 e schema2.
        Ao logar com um usuario comun(tendo privilegios nos esquemas schema1 e schema2
        e ao logar tu direciona teus sqls para o esquema nestes casos o uso de sinônimos se fazem desnecessários.

        Exemplo.

        conn marlonti@dbprodbk
        Connected to Oracle Database 11g Release 11.2.0.1.0
        Connected as marlonti

        SQL> select count(1) from produtos;

        select count(1) from produtos

        ORA-00942: a tabela ou view não existe

        SQL>
        SQL> alter session set current_schema =estoque;

        Session altered

        SQL> select count(1) from produtos;

        COUNT(1)

         54575
        

        Suas rotinas sqls não terão que especificar o schema do tipo
        SQL> select count(1) from estoque.produtos;

        COUNT(1)

         54575
        

        Espero ter ajudado.

        #105239
        Avatar de José Ricardo GarciaJosé Ricardo Garcia
        Participante

          Marlon,

          Explicando melhor a minha situação que é a seguinte. Trabalhamos com diversos clientes utilizando o nosso ERP. Em nosso setor de suporte, existem algumas bases de clientes (que necessitam deste tipo de suporte) para que possa ser simulado o problema localmente.
          No SQL Server, temos estas bases sendo acessadas com o mesmo usuário que acessa o schema default (dbo) e como ele trabalha diferente do oracle não tenho este problema.
          Como estamos preparando o sistema para trabalhar com oracle também, pensei em ter um schema único (padrão) para não me preocupar com a troca. Outro detalhe é que ter todas estas bases em um único tablespace não acho bom e portanto pensei em ter um por base (tipo para identificação).
          Então a minha necessidade é assim:
          * Ter uma única instância… até aí sem problemas.
          * Ter N tablespaces sendo uma para “cada base”.
          * Ter 1 schema único padrão para todos os usuários.

          Quanto a utilizar o schema na frente dos objetos não é problema.
          O que preciso é ter como “dizer” que neste momento quero acessar os dados da base/tablespace X e depois preciso utilizar os dados da base/tablespaces Y.
          Não sei se isto é possível ou eu preciso adotar um outro tipo de abordagem.

          Obrigado pela ajuda.

          #105241
          Avatar de rmanrman
          Participante

            @jricardogarcia

            Realmente o conceito do SQL Server e do Oracle são diferentes.

            A solução é criar uma instancia para cada base, mas creio que isso seja totalmente inviavel.

            Outra solução é criar um prefixo com no nome do cliente antes do usuário padrão do sistema, isso vale também para a tablespace. O sistema também precisa de uma forma de parametrizar o usuário do Oracle que o sistema utiliza. Utilizando o datapump é possível remapear o schema e a tablespace, verifique os parametros REMAP_SCHEMA e REMAP_TABLESPACE.

            #105242
            Avatar de marlontkmarlontk
            Participante

              @jricardogarcia
              Sem problemas teu sistema teria que ter algo para setar o esquema que ele ira trabalhar no Oracle.
              Por exemplo
              Usuario: nome
              Senha: senha
              Banco: nome da Base
              Schema: schema de dados.

              Podendo ter o mesmo usuário acessando o esquema de cada cliente.
              Quando quiser acessar uma “base” especifica de um cliente ao loga no sistema basta executar o sql que já enviei antes trocando o schema para o schema do cliente que será acessado.

              Quanto as tablespaces que tu ira criar isso é transparente para o sistema ter uma para cada schema ou uma para todos, irá apenas representar algo na tua organização e acredito alguma coisa de desempenho ai dependendo muito do volume de dados e demais configurações. Mas não faz parte do teu problema.
              Verificar os grants de select, insert ….. para o usuário que será conectado que vem a eliminar os sinonimos que no teu problema não adiantaria de nada.

              Tua aplicação é Web ou desktop?

              Uma instância para cada cliente teria sentido se teus clientes tiverem versões de banco diferentes e tu for utilizar alguns recursos específicos que entre versões fazem diferentes, do contrário não justificaria até porque teria que ter memoria para atender todas as instancias.

              Eu partiria para resolver este teu problema com o que já citei anteriormente.

              Eu uso uma instancia para cada base onde tenho uma base muito complexa com vários schemas ai juntar as duas é inviável, nas outras que apenas possuem um ou dois schemas centralizo elas em um mesmo server.

              #105243
              Avatar de José Ricardo GarciaJosé Ricardo Garcia
              Participante

                A aplicação é web e nela possui a string de conexão onde é alimentado o nome do schema que irei utilizar.
                Partindo deste pressuposto eu precisaria ter um schema único. O que preciso é através do usuário ou do mesmo usuário poder identificar que em determinado momento utilizarei X tablespace (tendo em vista que terei um para cada base de dados por exemplo). O problema que eu identifico aqui é que as bases terão a mesma estrutura.
                Não sei se isto será possível para meu sistema visto também que instâncias diferentes não me resolve também devido a quantidade de bases ser grande o que precisaria de uma estrutura muito grande.
                Vi que tem alguns comandos para alterar schema e tablespace, mas não consegui identificar se isto resolve minha necessidade, caso possa colocar algum exemplo simples de utilização agradeço.

                Obrigado pela ajuda.

                #105244
                Avatar de marlontkmarlontk
                Participante

                  @jricardogarcia
                  1º ” O que preciso é através do usuário ou do mesmo usuário poder identificar que em determinado momento utilizarei X tablespace…”
                  Esquece “por enquanto” esse lance de tablespace isso como já escrevi é apenas para tua organização e desempenho.
                  tanto que tu pode ter um esquema tendo vários tablespaces com vários datafiles.

                  O que tu tem é um user para te conectar a base e um schema para executar os sqls sendo que apenas este ultimo irá variar podendo ser trocado no login
                  teoricamente no teu sistema ao logar teria que ter algo para selecionar o esquema para poder executar a aplicação.

                  ” caso possa colocar algum exemplo simples de utilização agradeço..”
                  Neste caso segue o que já comentei no primeiro post alter session….

                  #105247
                  Avatar de marlontkmarlontk
                  Participante

                    Manda teu skype que pra facilitar….

                    #105252
                    Avatar de José Ricardo GarciaJosé Ricardo Garcia
                    Participante

                      Olá Marlon,

                      Meu skype/msn é j_ricardogarcia@yahoo.com.br.

                      Vou tentar relatar um exemplo de como temos estruturado hoje em SQL Server. Preciso montar uma estrutura parecida com esta para evitar muitos retrabalhos.
                      A idéia inicial é utilizar um schema único para todas as bases, exemplo “minhaempresa”.
                      Então para todo SQL que a aplicação irá executar, utilizamos linq do c#, existe uma pré-configuração informando o schema do banco e portando seria o “minhaempresa”.
                      Temos bases de desenvolvimento e de testes e usuários específicos para o acesso as bases.
                      Através do login do usuário na instância, necessito acessar uma base específica mas com o mesmo schema.
                      Exemplo:
                      Base de desenvolvimento acessando com o usuário desenv
                      SELECT * FROM MINHAEMPRESA.PRODUTO

                      Base de teste acessando com o usuário teste
                      SELECT * FROM MINHAEMPRESA.PRODUTO

                      Nestas duas consultas, cada uma precisa trazer os dados correspondentes a sua base. Consegui me expressar?

                      Obrigado pela ajuda.

                      #105270
                      Avatar de MarcusPEMarcusPE
                      Participante

                        Cara, pelo que vi, seria ideal duas instâncias separadas mesmo.

                        As estruturas da tabelas, views, constraints…são iguais? Ou pode ser alterado em um e em outro não?

                        #105271
                        Avatar de José Ricardo GarciaJosé Ricardo Garcia
                        Participante

                          As estruturas serão sempre iguais, o problema é que não serão apenas duas instâncias… as vezes podemos chegar a ter 10 bases diferentes (dados) com situações diferentes e isto torna inviável pela grande estrutura necessária.

                          #105275
                          Avatar de C-S-RC-S-R
                          Participante

                            Voce precisa ter 1 banco para cada cliente? Se tiver 10 clientes são 10 bancos?

                            Se eles puderem acessar o mesmo banco é so criar tudo em um schema e criar varios usuarios com grants.

                            Senão voce vai ter que criar varias instancias de banco.

                            O SQL Server acredito que é pareceido com Postgres 1 Instancia possui varios Bancos, já no Oracle 1 Instancia possui 1 Banco

                            #105276
                            Avatar de MarcusPEMarcusPE
                            Participante

                              Já vi empresas aplicarem uma espécie de “Multi empresa” no banco. Para que somente um banco comportasse duas empresas com dados diferentes, porém com estruturas iguais, não existindo duplicidade de tabelas. Ou seja, os dados das duas empresas eram adicionados a mesma tabela. Como foi feito isso? Criando a tabela empresa e adicionando uma coluna empresa_id identificando a empresa a qual o usuário logou (logo tendo que adicionar ao login a opção de informar a empresa) à todas as tabelas envolvidas. Logo, também houve alterações em toda a aplicação para inserir essa coluna nos SQLs também.

                              Ex.
                              Teste = 1
                              Desenv = 2

                              Consultar Dados de teste
                              SELECT *
                              FROM schema.table
                              WHERE empresa_id = 1

                              Consultar Dados de Desenv
                              SELECT *
                              FROM schema.table
                              WHERE empresa_id = 2

                              Deve ser mais ou menos isso que você precisa. Ficaria com um schema para “vários bancos”.

                              #105597
                              Avatar de Fábio GasparoniFábio Gasparoni
                              Participante

                                Pessoal.

                                Aproveitando a discussão acerca de TABLESPACE. Como faço para mudar 1 objeto de 1 TABLESPACE para outra? Tipo: tenho uma tabela na TABLESPACE users e quero alocá-la na TABLESPACE app.

                                #105598
                                Avatar de fabio segatofabio segato
                                Participante

                                  Não tem segredo. O mesmo schema em bases diferentes, vc vai ter que criar 1 instancia para cada ambiente, e esses schemas existirão em todas as instâncias.

                                Visualizando 15 posts - 1 até 15 (de 16 do total)
                                • Você deve fazer login para responder a este tópico.
                                plugins premium WordPress